diff --git a/requirements-swh.txt b/requirements-swh.txt index e8980d9..ed03fde 100644 --- a/requirements-swh.txt +++ b/requirements-swh.txt @@ -1,2 +1,3 @@ # Add here internal Software Heritage dependencies, one per line. swh.core[http] >= 0.3 # [http] is required by swh.core.pytest_plugin +swh.storage diff --git a/swh/__init__.py b/swh/__init__.py index e69de29..b36383a 100644 --- a/swh/__init__.py +++ b/swh/__init__.py @@ -0,0 +1,3 @@ +from pkgutil import extend_path + +__path__ = extend_path(__path__, __name__) diff --git a/swh/graphql/app.py b/swh/graphql/app.py index 74581b5..a4375aa 100644 --- a/swh/graphql/app.py +++ b/swh/graphql/app.py @@ -1,10 +1,10 @@ from ariadne import load_schema_from_path, make_executable_schema, gql from ariadne.asgi import GraphQL from .resolvers import origin, query type_defs = gql(load_schema_from_path("swh/graphql/schema/schema.graphql")) -schema = make_executable_schema(type_defs, query, origin.origin, origin.originSearch) +schema = make_executable_schema(type_defs, query, origin.origin, origin.origins) app = GraphQL(schema, debug=True) diff --git a/swh/graphql/backends/archive.py b/swh/graphql/backends/archive.py index c8a65f4..9420c2e 100644 --- a/swh/graphql/backends/archive.py +++ b/swh/graphql/backends/archive.py @@ -1,15 +1,12 @@ -class Origin: - def __init__(self, url, id): - self.url = url - self.id = id +from swh.storage import get_storage -def get_origins(): - return [ - Origin("test1.example.com", "1"), - Origin("test2.example.com", "2"), - Origin("test3.example.com", "3"), - Origin("test4.example.com", "4"), - Origin("test5.example.com", "5"), - Origin("test6.example.com", "6"), - ] +class Archive: + def __init__(self): + self.storage = get_storage( + cls="remote", url="http://moma.internal.softwareheritage.org:5002" + ) + + def get_origins(self, after=None, first=None): + # change page_token to base64 encode + return self.storage.origin_list(page_token=after, limit=first) diff --git a/swh/graphql/config.py b/swh/graphql/config.py new file mode 100644 index 0000000..6b3e194 --- /dev/null +++ b/swh/graphql/config.py @@ -0,0 +1 @@ +DEFAULT_CONFIG = {"storage": ""} diff --git a/swh/graphql/config/__init__.py b/swh/graphql/config/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/swh/graphql/resolvers/origin.py b/swh/graphql/resolvers/origin.py index da7f36f..871d9f6 100644 --- a/swh/graphql/resolvers/origin.py +++ b/swh/graphql/resolvers/origin.py @@ -1,43 +1,55 @@ from ariadne import ObjectType from . import query from swh.graphql.backends import archive origin = ObjectType("Origin") -originSearch = ObjectType("OriginConnection") +origins = ObjectType("OriginConnection") @query.field("origin") -def resolve_origin(_, info, url): +def resolve_origin(_, info, **kw): """ Top level query Get the origin matching the URL """ - origin = archive.get_origins() - return origin[0] + # return BaseNode.factory('origin').get(filters) + + return archive.Archive().get_origins().results[0] @origin.field("url") def origin_url(origin, info): return origin.url +@origin.field("id") +def origin_id(origin, info): + return origin.id.hex() + + @query.field("origins") -def resolve_origin_search(_, info, **kw): +def resolve_origins(_, info, **kw): """ Top level query Get all the origins matching the criteria """ # return BaseList.factory('origin').get(filters, state) - return archive.get_origins() + origins = archive.Archive().get_origins( + after=kw.get("after"), first=kw.get("first") + ) + return origins -@originSearch.field("nodes") +@origins.field("nodes") def origin_nodes(origins, info, **kw): - return origins + return origins.results -@originSearch.field("pageInfo") +@origins.field("pageInfo") def origin_pageinfo(origins, info, **kw): - return {"hasNextPage": True, "hasPreviousPage": True} + return { + "hasNextPage": bool(origins.next_page_token), + "endCursor": origins.next_page_token, + } diff --git a/swh/graphql/schema/schema.graphql b/swh/graphql/schema/schema.graphql index da4bba2..8258e14 100644 --- a/swh/graphql/schema/schema.graphql +++ b/swh/graphql/schema/schema.graphql @@ -1,51 +1,51 @@ interface Node { id: ID! } -# interface SwhArtifact { -# swhid: String! -# } +interface SwhNode { + swhid: String! +} type PageInfo { endCursor: String hasNextPage: Boolean! } # Origin type Origin implements Node { url: String! id: ID! } -# type OriginEdge { -# cursor: String! -# node: [Origin] -# } +type OriginEdge { + cursor: String! + node: [Origin] +} type OriginConnection { - # edges: [OriginEdge] + edges: [OriginEdge] nodes: [Origin] pageInfo: PageInfo! - totalCount: Int! + totalCount: Int } # Origin end type Query { """ Get an origin with its url """ origin( url: String! ): Origin """ Get a list of origins matching the given filters """ origins( first: Int after: String ): OriginConnection! } diff --git a/swh/graphql/tests/backends/test_archive.py b/swh/graphql/tests/backends/test_archive.py index fc48677..6bf4bac 100644 --- a/swh/graphql/tests/backends/test_archive.py +++ b/swh/graphql/tests/backends/test_archive.py @@ -1,5 +1,5 @@ from swh.graphql.backends import archive def test_get_origin(): - assert isinstance(archive.get_origins(), list) + assert isinstance(archive.Archive().get_origins(), object)