From b006597e990c51b8a1b7516c4c4a00594af2e2f0 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 25 May 2023 11:20:04 +0200 Subject: [PATCH 01/43] fix(gitlab): edge case where no release available --- gimie/sources/gitlab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gimie/sources/gitlab.py b/gimie/sources/gitlab.py index 6f9ff852..d82c809b 100644 --- a/gimie/sources/gitlab.py +++ b/gimie/sources/gitlab.py @@ -110,7 +110,7 @@ def extract(self): ) ] - if len(data["releases"]["edges"]) > 0: + if data["releases"] and (len(data["releases"]["edges"]) > 0): # go into releases and take the name from the first node (most recent) self.version = data["releases"]["edges"][0]["node"]["name"] self.download_url = f"{self.path}/-/archive/{self.version}/{self.name.split('/')[-1]}-{self.version}.tar.gz" From 27e1e2e624247642adb2b3f0a64924233227064b Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 25 May 2023 11:26:41 +0200 Subject: [PATCH 02/43] test(gitlab): add test case with user-owner --- tests/test_gitlab.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_gitlab.py b/tests/test_gitlab.py index a49f64d1..bfbfe93d 100644 --- a/tests/test_gitlab.py +++ b/tests/test_gitlab.py @@ -6,6 +6,7 @@ "https://gitlab.com/openrgb-pvazny/OpenRGB", # No user owner so group owner, no releases "https://gitlab.com/gitlab-org/gitlab-runner", # No user owner so group owner, has releases "https://gitlab.com/commonground/haven/haven", # Nested groups + "https://gitlab.com/edouardklein/falsisign", # owned by user ] From 818b8c38dc4ee758262ff041966d92f2ec622865 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 31 May 2023 01:33:01 +0200 Subject: [PATCH 03/43] refactor(gitlab): move extraction logic in dedicated methods. Fix edge cases with missing group --- gimie/sources/gitlab.py | 96 +++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/gimie/sources/gitlab.py b/gimie/sources/gitlab.py index d82c809b..c9621661 100644 --- a/gimie/sources/gitlab.py +++ b/gimie/sources/gitlab.py @@ -66,14 +66,11 @@ def extract(self): # fetch metadata data = self._fetch_repo_data(self.name) - # unique to Gitlab Extractor + # Each Gitlab project has a unique identifier (integer) self.identifier = urlparse(data["id"]).path.split("/")[2] # at the moment, Gimie fetches only the group directly related to the project - # any mother groups are present in the group name in the form: mother_group/subgroup/project - data["group"]["name"] = "/".join(self.name.split("/")[0:-1]) - self.sourceOrganization = self._get_organization(data["group"]) - - # Below are standard extracts + # the group name will take the form: parent/subgroup + self.sourceOrganization = self._safe_extract_group(data) self.description = data["description"] self.prog_langs = [lang["name"] for lang in data["languages"]] self.date_created = datetime.fromisoformat(data["createdAt"][:-1]) @@ -84,31 +81,9 @@ def extract(self): # Get contributors as the project members that are not owners and those that have written merge requests # owners are either multiple individuals or a group, if not user is marked as owner - user_author = [ - user["node"]["user"] - for user in data["projectMembers"]["edges"] - if user["node"]["accessLevel"]["stringValue"] == "OWNER" - ] - authors = user_author if len(user_author) > 0 else [data["group"]] - self.author = [self._get_author(author) for author in authors] + self.author = self._safe_extract_author(data) # contributors are project members or merge request authors - project_members = [ - user["node"]["user"] - for user in data["projectMembers"]["edges"] - if user["node"]["accessLevel"]["stringValue"] != "OWNER" - ] - merge_request_authors = [ - author["node"]["author"] - for author in data["mergeRequests"]["edges"] - ] - duplicate_contributors = project_members + merge_request_authors - self.contributors = [ - self._get_user(dict(unique)) - for unique in set( - tuple(sorted(contrib.items())) - for contrib in duplicate_contributors - ) - ] + self.contributors = self._safe_extract_contributors(data) if data["releases"] and (len(data["releases"]["edges"]) > 0): # go into releases and take the name from the first node (most recent) @@ -121,11 +96,58 @@ def extract(self): # if resp.status_code == 200: # self.license = resp.json() + def _safe_extract_group(self, repo: dict[str, Any]) -> Organization | None: + """Extract the group from a GraphQL repository node if it has one.""" + if (self.name is not None) and (repo["group"] is not None): + repo["group"]["name"] = "/".join(self.name.split("/")[0:-1]) + return self._get_organization(repo["group"]) + return None + + def _safe_extract_author( + self, repo: dict[str, Any] + ) -> list[Person | Organization]: + """Extract the author from a GraphQL repository node. + projectMembers is used if available, otherwise the author + is inferred from the project url.""" + members = repo["projectMembers"]["edges"] + if len(members) > 0: + owners = filter( + lambda m: m["node"]["accessLevel"]["stringValue"] == "OWNER", + members, + ) + return [self._get_author(owner) for owner in owners] + + if repo["group"] is not None: + return [self._get_author(repo["group"])] + + author = { + "webUrl": "/".join(self.path.split("/")[:-1]), + "username": self.name.split("/")[0], + } + return [self._get_author(author)] + + def _safe_extract_contributors( + self, repo: dict[str, Any] + ) -> list[Person] | None: + members = [ + user["node"]["user"] + for user in repo["projectMembers"]["edges"] + if user["node"]["accessLevel"]["stringValue"] != "OWNER" + ] + merge_request_authors = [ + author["node"]["author"] + for author in repo["mergeRequests"]["edges"] + ] + contributors = members + merge_request_authors + # Drop duplicate (unhashable) dicts by "id" key + uniq_contrib = list({c["id"]: c for c in contributors}.values()) + return [self._get_user(contrib) for contrib in uniq_contrib] + def _fetch_repo_data(self, path: str) -> Dict[str, Any]: """Fetch repository metadata from GraphQL endpoint.""" data = {"path": path} project_query = """ - query project_query($path: ID!){ + query project_query($path: ID!) { project(fullPath: $path) { name id @@ -162,9 +184,9 @@ def _fetch_repo_data(self, path: str) -> Dict[str, Any]: } } mergeRequests{ - edges{ + edges { node { - author{ + author { id name username @@ -220,8 +242,8 @@ def _get_organization(self, node: Dict[str, Any]) -> Organization: return Organization( _id=node["webUrl"], name=node["name"], - description=node["description"], - logo=node["avatarUrl"], + description=node.get("description"), + logo=node.get("avatarUrl"), ) def _get_user(self, node: Dict[str, Any]) -> Person: @@ -229,8 +251,8 @@ def _get_user(self, node: Dict[str, Any]) -> Person: return Person( _id=node["webUrl"], identifier=node["username"], - name=node["name"], - email=node["publicEmail"], + name=node.get("name"), + email=node.get("publicEmail"), ) From 676ff7f28dd7b57616c85c6b18023cc26eff4527 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 31 May 2023 01:42:04 +0200 Subject: [PATCH 04/43] fix(gitlab): pass user node to _get_author instead of parent node --- gimie/sources/gitlab.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/gimie/sources/gitlab.py b/gimie/sources/gitlab.py index c9621661..71c1e742 100644 --- a/gimie/sources/gitlab.py +++ b/gimie/sources/gitlab.py @@ -46,7 +46,7 @@ class GitlabExtractor(Extractor): date_modified: Optional[datetime] = None version: Optional[str] = None keywords: Optional[List[str]] = None - sourceOrganization: Optional[Organization] = None + source_organization: Optional[Organization] = None download_url: Optional[str] = None # license: Optional[str] = None @@ -70,7 +70,7 @@ def extract(self): self.identifier = urlparse(data["id"]).path.split("/")[2] # at the moment, Gimie fetches only the group directly related to the project # the group name will take the form: parent/subgroup - self.sourceOrganization = self._safe_extract_group(data) + self.source_organization = self._safe_extract_group(data) self.description = data["description"] self.prog_langs = [lang["name"] for lang in data["languages"]] self.date_created = datetime.fromisoformat(data["createdAt"][:-1]) @@ -115,7 +115,9 @@ def _safe_extract_author( lambda m: m["node"]["accessLevel"]["stringValue"] == "OWNER", members, ) - return [self._get_author(owner) for owner in owners] + return [ + self._get_author(owner["node"]["user"]) for owner in owners + ] if repo["group"] is not None: return [self._get_author(repo["group"])] @@ -239,12 +241,15 @@ def _get_author(self, node: Dict[str, Any]) -> Union[Organization, Person]: def _get_organization(self, node: Dict[str, Any]) -> Organization: """Extract details from a GraphQL organization node.""" - return Organization( - _id=node["webUrl"], - name=node["name"], - description=node.get("description"), - logo=node.get("avatarUrl"), - ) + try: + return Organization( + _id=node["webUrl"], + name=node["name"], + description=node.get("description"), + logo=node.get("avatarUrl"), + ) + except KeyError: + breakpoint() def _get_user(self, node: Dict[str, Any]) -> Person: """Extract details from a GraphQL user node.""" @@ -262,7 +267,7 @@ class GitlabExtractorSchema(JsonLDSchema): _id = fields.Id() name = fields.String(SDO.name) identifier = fields.String(SDO.identifier) - sourceOrganization = fields.Nested(SDO.isPartOf, OrganizationSchema) + source_organization = fields.Nested(SDO.isPartOf, OrganizationSchema) author = fields.Nested( SDO.author, [PersonSchema, OrganizationSchema], many=True ) From 2e902275d1b1c3ddf6056942fb5f951b416eb732 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 31 May 2023 01:44:56 +0200 Subject: [PATCH 05/43] fix(gitlab): rm debug breakpoint --- gimie/sources/gitlab.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/gimie/sources/gitlab.py b/gimie/sources/gitlab.py index 71c1e742..93f9ab01 100644 --- a/gimie/sources/gitlab.py +++ b/gimie/sources/gitlab.py @@ -241,15 +241,12 @@ def _get_author(self, node: Dict[str, Any]) -> Union[Organization, Person]: def _get_organization(self, node: Dict[str, Any]) -> Organization: """Extract details from a GraphQL organization node.""" - try: - return Organization( - _id=node["webUrl"], - name=node["name"], - description=node.get("description"), - logo=node.get("avatarUrl"), - ) - except KeyError: - breakpoint() + return Organization( + _id=node["webUrl"], + name=node["name"], + description=node.get("description"), + logo=node.get("avatarUrl"), + ) def _get_user(self, node: Dict[str, Any]) -> Person: """Extract details from a GraphQL user node.""" From 89b97f2a43e7b5e45324f5e162440bb28b184b5f Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 31 May 2023 10:21:49 +0200 Subject: [PATCH 06/43] refactor(queries): rm redundant graphql query wrapper --- gimie/sources/common/queries.py | 23 ++--------------------- gimie/sources/github.py | 5 +++-- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/gimie/sources/common/queries.py b/gimie/sources/common/queries.py index 05fee6ee..ad56e2ba 100644 --- a/gimie/sources/common/queries.py +++ b/gimie/sources/common/queries.py @@ -1,10 +1,10 @@ import requests -from typing import Any, Dict +from typing import Any, Dict, List, Union def send_rest_query( api: str, query: str, headers: Dict[str, str] -) -> Dict[str, Any]: +) -> Union[List[Dict[str, Any]], Dict[str, Any]]: """Generic function to send a query to the GitHub/GitLab rest API.""" resp = requests.get( url=f"{api}/{query}", @@ -32,22 +32,3 @@ def send_graphql_query( if resp.status_code != 200: raise ConnectionError(resp.json()["message"]) return resp.json() - - -def query_graphql( - api: str, repo_query: str, data: dict, headers: Dict[str, str] -) -> Dict[str, Any]: - """Queries the GitHub GraphQL API to extract metadata about - target repository. - - Parameters - ---------- - api: - URL for GraphQL API - repo_query: - query defining what information should be retrieved from the GraphQL API. - data: - parameters of the query - """ - repo = send_graphql_query(api, repo_query, data=data, headers=headers) - return repo diff --git a/gimie/sources/github.py b/gimie/sources/github.py index 89858ac2..bae23502 100644 --- a/gimie/sources/github.py +++ b/gimie/sources/github.py @@ -40,7 +40,6 @@ from gimie.sources.common.license import get_spdx_url from gimie.sources.common.queries import ( send_rest_query, - query_graphql, send_graphql_query, ) @@ -212,7 +211,9 @@ def _fetch_repo_data(self, url: str) -> Dict[str, Any]: } } """ - response = query_graphql(GH_API, repo_query, data, self._set_auth()) + response = send_graphql_query( + GH_API, repo_query, data, self._set_auth() + ) if "errors" in response: raise ValueError(response["errors"]) From 15ee33927afe4ad74400056993bb509446e293d2 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 31 May 2023 10:22:54 +0200 Subject: [PATCH 07/43] feat(gitlab): fallback to rest api if author missing from graphql. make type hints py38 compat. --- gimie/sources/gitlab.py | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/gimie/sources/gitlab.py b/gimie/sources/gitlab.py index 93f9ab01..9b76c51b 100644 --- a/gimie/sources/gitlab.py +++ b/gimie/sources/gitlab.py @@ -20,7 +20,7 @@ IRI, ) from gimie.graph.namespaces import SDO -from gimie.sources.common.queries import query_graphql +from gimie.sources.common.queries import send_graphql_query, send_rest_query GL_API_REST = "https://gitlab.com/api/v4/" GL_API_GRAPHQL = "https://gitlab.com/api" @@ -96,7 +96,9 @@ def extract(self): # if resp.status_code == 200: # self.license = resp.json() - def _safe_extract_group(self, repo: dict[str, Any]) -> Organization | None: + def _safe_extract_group( + self, repo: Dict[str, Any] + ) -> Optional[Organization]: """Extract the group from a GraphQL repository node if it has one.""" if (self.name is not None) and (repo["group"] is not None): repo["group"]["name"] = "/".join(self.name.split("/")[0:-1]) @@ -104,8 +106,8 @@ def _safe_extract_group(self, repo: dict[str, Any]) -> Organization | None: return None def _safe_extract_author( - self, repo: dict[str, Any] - ) -> list[Person | Organization]: + self, repo: Dict[str, Any] + ) -> List[Union[Person, Organization]]: """Extract the author from a GraphQL repository node. projectMembers is used if available, otherwise the author is inferred from the project url.""" @@ -122,11 +124,23 @@ def _safe_extract_author( if repo["group"] is not None: return [self._get_author(repo["group"])] - author = { - "webUrl": "/".join(self.path.split("/")[:-1]), - "username": self.name.split("/")[0], - } - return [self._get_author(author)] + # If the author is absent from the GraphQL response (permission bug), + # fallback to the REST API + author = send_rest_query( + GL_API_REST, + f"/users?username={self.name.split('/')[0]}", + self._set_auth(), + )[0] + + return [ + self._get_author( + { + "webUrl": author["web_url"], + "username": author["username"], + "name": author.get("name"), + } + ) + ] def _safe_extract_contributors( self, repo: dict[str, Any] @@ -208,7 +222,7 @@ def _fetch_repo_data(self, path: str) -> Dict[str, Any]: } } """ - response = query_graphql( + response = send_graphql_query( GL_API_GRAPHQL, project_query, data, self._set_auth() ) if "errors" in response: From 2d493025ca38e63cdbb71f3533ae5b0ac395eb2e Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 31 May 2023 10:33:53 +0200 Subject: [PATCH 08/43] refactor(gitlab): dedicated REST->user method --- gimie/sources/gitlab.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/gimie/sources/gitlab.py b/gimie/sources/gitlab.py index 9b76c51b..625cec84 100644 --- a/gimie/sources/gitlab.py +++ b/gimie/sources/gitlab.py @@ -126,21 +126,7 @@ def _safe_extract_author( # If the author is absent from the GraphQL response (permission bug), # fallback to the REST API - author = send_rest_query( - GL_API_REST, - f"/users?username={self.name.split('/')[0]}", - self._set_auth(), - )[0] - - return [ - self._get_author( - { - "webUrl": author["web_url"], - "username": author["username"], - "name": author.get("name"), - } - ) - ] + return [self._user_from_rest(self.name.split("/")[0])] def _safe_extract_contributors( self, repo: dict[str, Any] @@ -271,6 +257,23 @@ def _get_user(self, node: Dict[str, Any]) -> Person: email=node.get("publicEmail"), ) + def _user_from_rest(self, username: str) -> Person: + """Given a username, use the REST API to retrieve the Person object.""" + + author = send_rest_query( + GL_API_REST, + f"/users?username={username}", + self._set_auth(), + ) + if isinstance(author, list): + author = author[0] + + return Person( + _id=author["web_url"], + identifier=author["username"], + name=author.get("name"), + ) + class GitlabExtractorSchema(JsonLDSchema): """This defines the schema used for json-ld serialization.""" From 405aa3b3a8b07eb60025008abcff29f84eee6ae5 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Tue, 6 Jun 2023 17:13:32 +0200 Subject: [PATCH 09/43] doc(deps): introduce doc dependency group --- poetry.lock | 428 ++++++++++++++++++++++++++++++++++++++++++------- pyproject.toml | 5 + 2 files changed, 376 insertions(+), 57 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0c81ed4c..6d76ab78 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,20 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] [[package]] name = "attrs" version = "22.2.0" description = "Classes Without Boilerplate" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -19,11 +29,42 @@ docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib- tests = ["attrs[tests-no-zope]", "zope.interface"] tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +[[package]] +name = "babel" +version = "2.12.1" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] + +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "22.12.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -59,7 +100,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "cachetools" version = "5.3.0" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = "~=3.7" files = [ @@ -71,7 +111,6 @@ files = [ name = "calamus" version = "0.4.1" description = "calamus is a library built on top of marshmallow to allow (de-)Serialization of Python classes to JSON-LD." -category = "main" optional = false python-versions = ">=3.7.1,<4.0.0" files = [ @@ -92,7 +131,6 @@ docs = ["Jinja2 (>=3.0.0,<3.1.0)", "sphinx (>=3.0.3,<4.0.0)", "sphinx-rtd-theme name = "certifi" version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -104,7 +142,6 @@ files = [ name = "cfgv" version = "3.3.1" description = "Validate configuration and produce human readable error messages." -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -116,7 +153,6 @@ files = [ name = "charset-normalizer" version = "3.0.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = "*" files = [ @@ -214,7 +250,6 @@ files = [ name = "click" version = "8.1.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -229,7 +264,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -241,7 +275,6 @@ files = [ name = "distlib" version = "0.3.6" description = "Distribution utilities" -category = "main" optional = false python-versions = "*" files = [ @@ -249,11 +282,21 @@ files = [ {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, ] +[[package]] +name = "docutils" +version = "0.20.1" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] + [[package]] name = "exceptiongroup" version = "1.1.0" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -268,7 +311,6 @@ test = ["pytest (>=6)"] name = "filelock" version = "3.9.0" description = "A platform independent file lock." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -284,7 +326,6 @@ testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pyt name = "frozendict" version = "2.3.4" description = "A simple immutable dictionary" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -307,11 +348,27 @@ files = [ {file = "frozendict-2.3.4.tar.gz", hash = "sha256:15b4b18346259392b0d27598f240e9390fafbff882137a9c48a1e0104fb17f78"}, ] +[[package]] +name = "furo" +version = "2023.5.20" +description = "A clean customisable Sphinx documentation theme." +optional = false +python-versions = ">=3.7" +files = [ + {file = "furo-2023.5.20-py3-none-any.whl", hash = "sha256:594a8436ddfe0c071f3a9e9a209c314a219d8341f3f1af33fdf7c69544fab9e6"}, + {file = "furo-2023.5.20.tar.gz", hash = "sha256:40e09fa17c6f4b22419d122e933089226dcdb59747b5b6c79363089827dea16f"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +pygments = ">=2.7" +sphinx = ">=6.0,<8.0" +sphinx-basic-ng = "*" + [[package]] name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -326,7 +383,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.30" description = "GitPython is a python library used to interact with Git repositories" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -341,7 +397,6 @@ gitdb = ">=4.0.1,<5" name = "html5lib" version = "1.1" description = "HTML parser based on the WHATWG HTML specification" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -363,7 +418,6 @@ lxml = ["lxml"] name = "identify" version = "2.5.15" description = "File identification library for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -378,7 +432,6 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -386,22 +439,50 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + [[package]] name = "importlib" version = "1.0.4" description = "Backport of importlib.import_module() from Python 2.7" -category = "main" optional = false python-versions = "*" files = [ {file = "importlib-1.0.4.zip", hash = "sha256:b6ee7066fea66e35f8d0acee24d98006de1a0a8a94a8ce6efe73a9a23c8d9826"}, ] +[[package]] +name = "importlib-metadata" +version = "6.6.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -413,7 +494,6 @@ files = [ name = "isodate" version = "0.6.1" description = "An ISO 8601 date/time/duration parser and formatter" -category = "main" optional = false python-versions = "*" files = [ @@ -424,11 +504,27 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -474,7 +570,6 @@ files = [ name = "lizard" version = "1.17.10" description = "A code analyzer without caring the C/C++ header files. It works with Java, C/C++, JavaScript, Python, Ruby, Swift, Objective C. Metrics includes cyclomatic complexity number etc." -category = "main" optional = false python-versions = "*" files = [ @@ -486,7 +581,6 @@ files = [ name = "lxml" version = "4.9.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ @@ -575,11 +669,69 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.7)"] +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + [[package]] name = "marshmallow" version = "3.19.0" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -600,7 +752,6 @@ tests = ["pytest", "pytz", "simplejson"] name = "mypy-extensions" version = "0.4.3" description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" optional = false python-versions = "*" files = [ @@ -612,7 +763,6 @@ files = [ name = "nodeenv" version = "1.7.0" description = "Node.js virtual environment builder" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -627,7 +777,6 @@ setuptools = "*" name = "owlrl" version = "6.0.2" description = "OWL-RL and RDFS based RDF Closure inferencing for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -642,7 +791,6 @@ rdflib = ">=6.0.2" name = "packaging" version = "23.0" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -654,7 +802,6 @@ files = [ name = "pathspec" version = "0.11.0" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -666,7 +813,6 @@ files = [ name = "platformdirs" version = "2.6.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -682,7 +828,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest- name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -698,7 +843,6 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "3.0.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -717,7 +861,6 @@ virtualenv = ">=20.10.0" name = "prettytable" version = "2.5.0" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -735,7 +878,6 @@ tests = ["pytest", "pytest-cov", "pytest-lazy-fixture"] name = "pydriller" version = "2.4" description = "Framework for MSR" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -748,11 +890,24 @@ lizard = "*" pytz = "*" types-pytz = "*" +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pyld" version = "2.0.3" description = "Python implementation of the JSON-LD API" -category = "main" optional = false python-versions = "*" files = [ @@ -774,7 +929,6 @@ requests = ["requests"] name = "pyparsing" version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" files = [ @@ -789,7 +943,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyshacl" version = "0.20.0" description = "Python SHACL Validator" -category = "main" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ @@ -815,7 +968,6 @@ jsonld = ["rdflib-jsonld (>=0.4.0,<0.6)"] name = "pytest" version = "7.2.1" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -839,7 +991,6 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. name = "python-dotenv" version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -854,7 +1005,6 @@ cli = ["click (>=5.0)"] name = "pytz" version = "2022.7.1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -866,7 +1016,6 @@ files = [ name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -916,7 +1065,6 @@ files = [ name = "rdflib" version = "6.2.0" description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -941,7 +1089,6 @@ tests = ["html5lib", "pytest", "pytest-cov"] name = "requests" version = "2.28.2" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7, <4" files = [ @@ -963,7 +1110,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "setuptools" version = "66.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -980,7 +1126,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -992,7 +1137,6 @@ files = [ name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1000,11 +1144,173 @@ files = [ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] + +[[package]] +name = "sphinx" +version = "7.0.1" +description = "Python documentation generator" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Sphinx-7.0.1.tar.gz", hash = "sha256:61e025f788c5977d9412587e733733a289e2b9fdc2fef8868ddfbfc4ccfe881d"}, + {file = "sphinx-7.0.1-py3-none-any.whl", hash = "sha256:60c5e04756c1709a98845ed27a2eed7a556af3993afb66e77fec48189f742616"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.21" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.13" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] + +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b1" +description = "A modern skeleton for Sphinx themes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx_basic_ng-1.0.0b1-py3-none-any.whl", hash = "sha256:ade597a3029c7865b24ad0eda88318766bcc2f9f4cef60df7e28126fde94db2a"}, + {file = "sphinx_basic_ng-1.0.0b1.tar.gz", hash = "sha256:89374bd3ccd9452a301786781e28c8718e99960f2d4f411845ea75fc7bb5a9b0"}, +] + +[package.dependencies] +sphinx = ">=4.0" + +[package.extras] +docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1016,7 +1322,6 @@ files = [ name = "typer" version = "0.7.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1037,7 +1342,6 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6. name = "types-pytz" version = "2022.7.1.0" description = "Typing stubs for pytz" -category = "main" optional = false python-versions = "*" files = [ @@ -1049,7 +1353,6 @@ files = [ name = "typing-extensions" version = "4.4.0" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1061,7 +1364,6 @@ files = [ name = "urllib3" version = "1.26.14" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -1078,7 +1380,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "virtualenv" version = "20.17.1" description = "Virtual Python Environment builder" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1099,7 +1400,6 @@ testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7 name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -1111,7 +1411,6 @@ files = [ name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" optional = false python-versions = "*" files = [ @@ -1119,7 +1418,22 @@ files = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f1773fba96f1323d036b1a2a7654acd979c98e984374c71533208bc79508aa7a" +content-hash = "b00ff9629845f3b4b82a7ab089e5f7f900f2f2394fc638845ef9e3ebd86e0082" diff --git a/pyproject.toml b/pyproject.toml index 23dacd15..4b8d0398 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,11 @@ importlib = "^1.0.4" pytest = "^7.2.0" black = "^22.10.0" + +[tool.poetry.group.doc.dependencies] +sphinx = "^7.0.1" +furo = "^2023.5.20" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From 9c72b76c138d36bd56719bd93ba497502d1b4028 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Tue, 6 Jun 2023 17:14:41 +0200 Subject: [PATCH 10/43] doc(setup): add sphinx configuration --- docs/CONTEXT.md | 3 +++ docs/Makefile | 20 +++++++++++++++++++ docs/conf.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ docs/index.rst | 36 +++++++++++++++++++++++++++++++++ docs/make.bat | 35 ++++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 docs/CONTEXT.md create mode 100644 docs/Makefile create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/make.bat diff --git a/docs/CONTEXT.md b/docs/CONTEXT.md new file mode 100644 index 00000000..74b60a5e --- /dev/null +++ b/docs/CONTEXT.md @@ -0,0 +1,3 @@ +The aim of gimie is to extract project metadata in an interoperable format. This is achieved by generating [linked data](https://en.wikipedia.org/wiki/Linked_data) following the widely used [schema.org](http://schema.org) ontology. The resulting metadata can readily be augmented or integrated with other data sources. + +Gimie's output follows recommendations provided by the [codemeta project](https://codemeta.github.io/), but also provides additional properties. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..6e9f0d8a --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,53 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = "gimie" +copyright = "2023, SDSC-ORD" +author = "SDSC-ORD" +release = "0.3.0" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.napoleon", + "sphinx.ext.autodoc", + "sphinx.ext.doctest", + "sphinx.ext.intersphinx", + "sphinx.ext.coverage", + "sphinx.ext.viewcode", + "sphinx.ext.githubpages", +] + +templates_path = ["_templates"] +source_suffic = [".rst", ".md"] + +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "furo" +html_static_path = ["_static"] + + +# -- Extension configuration ------------------------------------------------- + +# Options for intersphinx + +intersphinx_mapping = { + "python": ("https://docs.python.org/", None), + "rdflib": ("https://rdflib.readthedocs.io/en/stable/", None), + "calamus": ("https://calamus.readthedocs.io/en/latest/", None), +} + +source_parsers = {".md": "recommonmark.parser.CommonMarkParser"} diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..efce59c7 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,36 @@ +.. gimie documentation master file, created by + sphinx-quickstart on Tue Jun 6 16:50:55 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to gimie's documentation! +================================= +gimie (Git Meta Information Extractor) is a python library and command line toolto extract structured metadata from git repositories. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +Context +======= + +.. toctree:: + :maxdepth: 3 + + CONTEXT + + +Reference API +============= + +.. toctree:: + :maxdepth 2 + + api/modules + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..32bb2452 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd From 93a2919b403ff9081faecdabcc9e8b06551d9896 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Tue, 6 Jun 2023 18:38:36 +0200 Subject: [PATCH 11/43] doc: add Makefile rule to generate sphinx website --- Makefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile b/Makefile index c36904cc..444a446e 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,13 @@ check: ## Run code quality tools. @echo "🚀 Linting code: Running pre-commit" @poetry run pre-commit run -a +.PHONY: doc +doc: ## Build sphinx documentation website locally + @echo "📖 Building documentation" + @cd docs + @sphinx-apidoc -f -o docs/api gimie + @sphinx-build docs/ docs/_build + .PHONY: docker-build docker-build: ## Build the gimie Docker image @echo "🐋 Building docker image" From 51f2afe9b4c52e20105d5d58fa138f05afb953cd Mon Sep 17 00:00:00 2001 From: cmdoret Date: Tue, 6 Jun 2023 18:39:18 +0200 Subject: [PATCH 12/43] doc: initial sphinx website with apidoc --- docs/CONTEXT.md | 3 --- docs/conf.py | 2 +- docs/index.rst | 7 +++---- docs/intro/linked_data.rst | 6 ++++++ poetry.lock | 32 +++++++++++++++++++++++++++++++- pyproject.toml | 1 + 6 files changed, 42 insertions(+), 9 deletions(-) delete mode 100644 docs/CONTEXT.md create mode 100644 docs/intro/linked_data.rst diff --git a/docs/CONTEXT.md b/docs/CONTEXT.md deleted file mode 100644 index 74b60a5e..00000000 --- a/docs/CONTEXT.md +++ /dev/null @@ -1,3 +0,0 @@ -The aim of gimie is to extract project metadata in an interoperable format. This is achieved by generating [linked data](https://en.wikipedia.org/wiki/Linked_data) following the widely used [schema.org](http://schema.org) ontology. The resulting metadata can readily be augmented or integrated with other data sources. - -Gimie's output follows recommendations provided by the [codemeta project](https://codemeta.github.io/), but also provides additional properties. diff --git a/docs/conf.py b/docs/conf.py index 6e9f0d8a..15a3e8b6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -28,7 +28,7 @@ ] templates_path = ["_templates"] -source_suffic = [".rst", ".md"] +source_suffix = [".rst", ".md"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] diff --git a/docs/index.rst b/docs/index.rst index efce59c7..c33660a0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,18 +13,17 @@ gimie (Git Meta Information Extractor) is a python library and command line tool Context ======= - .. toctree:: - :maxdepth: 3 + :maxdepth: 3 - CONTEXT + intro/linked_data Reference API ============= .. toctree:: - :maxdepth 2 + :maxdepth: 2 api/modules diff --git a/docs/intro/linked_data.rst b/docs/intro/linked_data.rst new file mode 100644 index 00000000..a709aaf1 --- /dev/null +++ b/docs/intro/linked_data.rst @@ -0,0 +1,6 @@ +Linked data +*********** + +The aim of gimie is to extract project metadata in an interoperable format. This is achieved by generating `linked data `_ following the widely used `schema.org `_ ontology. The resulting metadata can readily be augmented or integrated with other data sources. + +Gimie's output follows recommendations provided by the `codemeta project `_ , but also provides additional properties. diff --git a/poetry.lock b/poetry.lock index 6d76ab78..403dd548 100644 --- a/poetry.lock +++ b/poetry.lock @@ -271,6 +271,20 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +optional = false +python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + [[package]] name = "distlib" version = "0.3.6" @@ -1085,6 +1099,22 @@ html = ["html5lib"] networkx = ["networkx"] tests = ["html5lib", "pytest", "pytest-cov"] +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +optional = false +python-versions = "*" +files = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + [[package]] name = "requests" version = "2.28.2" @@ -1436,4 +1466,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "b00ff9629845f3b4b82a7ab089e5f7f900f2f2394fc638845ef9e3ebd86e0082" +content-hash = "0a78d81972cc1ffc23e0fa595355d96d85c7b1972194ddf702f1e109d57168fc" diff --git a/pyproject.toml b/pyproject.toml index 4b8d0398..85c49864 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ black = "^22.10.0" [tool.poetry.group.doc.dependencies] sphinx = "^7.0.1" furo = "^2023.5.20" +recommonmark = "^0.7.1" [build-system] requires = ["poetry-core"] From 0c64788b51c06a8bfa891b2c385b933b52c1e8f2 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Tue, 6 Jun 2023 18:41:58 +0200 Subject: [PATCH 13/43] doc: add apidoc output to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 62f42463..e19f6c68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# apidoc generated docs +docs/api # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] From 777340d457d37d195e134259890b1d79b80c7d4a Mon Sep 17 00:00:00 2001 From: cmdoret Date: Tue, 6 Jun 2023 18:56:34 +0200 Subject: [PATCH 14/43] ci(docs): add ga workflow to deploy docs on gh pages --- .github/workflows/sphinx-docs.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/sphinx-docs.yml diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml new file mode 100644 index 00000000..6e1beebe --- /dev/null +++ b/.github/workflows/sphinx-docs.yml @@ -0,0 +1,30 @@ +name: Docs +on: [push, pull_request, workflow_dispatch] +permissions: + contents: write +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v3 + + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies + run: | + poetry install + + - name: Sphinx build + run: | + make doc + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + with: + publish_branch: gh-pages + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: _build/ + force_orphan: true From 8f896f219b66ef03a964b21a9c6356e4872e6347 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Tue, 6 Jun 2023 18:58:53 +0200 Subject: [PATCH 15/43] ci(docs): install doc dependency group --- .github/workflows/sphinx-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index 6e1beebe..3f392253 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -14,7 +14,7 @@ jobs: - name: Install dependencies run: | - poetry install + poetry install --with doc - name: Sphinx build run: | From 4856ff4a8cbe1f2a2feec0375b10e7a424c6bc66 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 08:00:09 +0200 Subject: [PATCH 16/43] fix(docs): execute Makefile rule with poetry --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 444a446e..3c0249f9 100644 --- a/Makefile +++ b/Makefile @@ -15,8 +15,8 @@ check: ## Run code quality tools. doc: ## Build sphinx documentation website locally @echo "📖 Building documentation" @cd docs - @sphinx-apidoc -f -o docs/api gimie - @sphinx-build docs/ docs/_build + @poetry run sphinx-apidoc -f -o docs/api gimie + @poetry run sphinx-build docs/ docs/_build .PHONY: docker-build docker-build: ## Build the gimie Docker image From 231bf3d235fe72ffcba748981ecd8bd314e91746 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 08:13:46 +0200 Subject: [PATCH 17/43] ci(docs): fix publish dir for gh-pages deployment --- .github/workflows/sphinx-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index 3f392253..e494ecfb 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -26,5 +26,5 @@ jobs: with: publish_branch: gh-pages github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: _build/ + publish_dir: docs/_build/ force_orphan: true From 77fc95e8a73b4896d26effedeefe58e21eaa2b46 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 08:15:21 +0200 Subject: [PATCH 18/43] ci(docs): change gh-ref for tests --- .github/workflows/sphinx-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index e494ecfb..0a265785 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -22,7 +22,7 @@ jobs: - name: Deploy uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/docs-website' }} with: publish_branch: gh-pages github_token: ${{ secrets.GITHUB_TOKEN }} From 0177561b24f34d6eadaaa266bb098842eff7c742 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 14:27:51 +0200 Subject: [PATCH 19/43] doc(cli): add and configure sphinx-click to work with typer --- docs/cli.rst | 6 ++++++ docs/conf.py | 1 + docs/index.rst | 9 +++++++++ gimie/cli.py | 28 ++++++++++++++++++++-------- poetry.lock | 18 +++++++++++++++++- pyproject.toml | 1 + 6 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 docs/cli.rst diff --git a/docs/cli.rst b/docs/cli.rst new file mode 100644 index 00000000..d9377be4 --- /dev/null +++ b/docs/cli.rst @@ -0,0 +1,6 @@ +CLI Documentation +***************** + +.. click:: gimie.cli:cli + :prog: gimie + :nested: full diff --git a/docs/conf.py b/docs/conf.py index 15a3e8b6..5fd825f9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -25,6 +25,7 @@ "sphinx.ext.coverage", "sphinx.ext.viewcode", "sphinx.ext.githubpages", + "sphinx_click", ] templates_path = ["_templates"] diff --git a/docs/index.rst b/docs/index.rst index c33660a0..768de765 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -27,6 +27,15 @@ Reference API api/modules + +Command Line Interface +====================== + +.. toctree:: + :maxdepth: 2 + + cli + Indices and tables ================== diff --git a/gimie/cli.py b/gimie/cli.py index 8be28fbe..c50c7add 100644 --- a/gimie/cli.py +++ b/gimie/cli.py @@ -18,14 +18,23 @@ from enum import Enum from typing import Optional from gimie import __version__ +import click import typer from gimie.project import Project app = typer.Typer(add_completion=False) +# Used to autogenerate docs with sphinx-click +@click.group() +def cli(): + """Command line group""" + pass + class SerializationFormat(str, Enum): + """Enumeration of valid RDF serialization formats for project graphs""" + ttl = "ttl" jsonld = "json-ld" nt = "nt" @@ -41,12 +50,8 @@ def version_callback(value: bool): @app.command() def data( url: str, - only: str = typer.Option(False, "--only", help="Only use these sources."), - exclude: str = typer.Option( - False, "--exclude", help="Do not use these sources." - ), format: SerializationFormat = typer.Option( - SerializationFormat.ttl, + "ttl", "--format", show_choices=True, help="Output serialization format for the RDF graph.", @@ -58,19 +63,26 @@ def data( callback=version_callback, ), ): - """Extract metadata from a Git repository at the target URL.""" + """Extract linked metadata from a Git repository at the target URL. + + The output is sent to stdout, and turtle is used as the default serialization format.""" proj = Project(url) print(proj.serialize(format=format)) @app.command() -def advice(path: str): +def advice(url: str): """Show a metadata completion report for a Git repository - at the target URL.""" + at the target URL. + + NOTE: Not implemented yet""" ... raise typer.Exit() +typer_cli = typer.main.get_command(app) +cli.add_command(typer_cli, "cli") + # This callback is triggered when gimie is called without subcommand @app.callback() def callback( diff --git a/poetry.lock b/poetry.lock index 403dd548..59b4f016 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1248,6 +1248,22 @@ sphinx = ">=4.0" [package.extras] docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] +[[package]] +name = "sphinx-click" +version = "4.4.0" +description = "Sphinx extension that automatically documents click applications" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-click-4.4.0.tar.gz", hash = "sha256:cc67692bd28f482c7f01531c61b64e9d2f069bfcf3d24cbbb51d4a84a749fa48"}, + {file = "sphinx_click-4.4.0-py3-none-any.whl", hash = "sha256:2821c10a68fc9ee6ce7c92fad26540d8d8c8f45e6d7258f0e4fb7529ae8fab49"}, +] + +[package.dependencies] +click = ">=7.0" +docutils = "*" +sphinx = ">=2.0" + [[package]] name = "sphinxcontrib-applehelp" version = "1.0.4" @@ -1466,4 +1482,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "0a78d81972cc1ffc23e0fa595355d96d85c7b1972194ddf702f1e109d57168fc" +content-hash = "30a25209978909d710c3799978eea1495f22dcb8fb526315c48328af4d7199c4" diff --git a/pyproject.toml b/pyproject.toml index 85c49864..0a6e523c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ black = "^22.10.0" sphinx = "^7.0.1" furo = "^2023.5.20" recommonmark = "^0.7.1" +sphinx-click = "^4.4.0" [build-system] requires = ["poetry-core"] From 371c326dbc944172dad43c055d0cc8c5b5bf5deb Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 17:23:43 +0200 Subject: [PATCH 20/43] feat(io): Allow rdflib kwargs in serialize() --- gimie/project.py | 4 ++-- gimie/sources/abstract.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gimie/project.py b/gimie/project.py index 468a97a0..d5b5f6b3 100644 --- a/gimie/project.py +++ b/gimie/project.py @@ -92,8 +92,8 @@ def to_graph(self) -> Graph: combined_graph = combine_graphs(*graphs) return combined_graph - def serialize(self, format: str = "ttl"): - return self.to_graph().serialize(format=format) + def serialize(self, format: str = "ttl", **kwargs): + return self.to_graph().serialize(format=format, **kwargs) def cleanup(self): """Recursively delete the project. Only works diff --git a/gimie/sources/abstract.py b/gimie/sources/abstract.py index 54d4c11d..9312f8ab 100644 --- a/gimie/sources/abstract.py +++ b/gimie/sources/abstract.py @@ -45,9 +45,9 @@ def to_graph(self) -> Graph: """Generate an RDF graph from the instance""" return Graph() - def serialize(self, format: str = "ttl") -> str: + def serialize(self, format: str = "ttl", **kwargs) -> str: """Serialize the RDF graph representing the instance.""" - return self.to_graph().serialize(format=format) # type: ignore + return self.to_graph().serialize(format=format, **kwargs) # type: ignore def jsonld(self) -> str: """Alias for jsonld serialization.""" From 404a0d04c5c2d64fd74af35a60cacbf34df859a8 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 18:19:00 +0200 Subject: [PATCH 21/43] doc: add intro pages --- docs/index.rst | 7 +- docs/intro/git.rst | 8 + docs/intro/test.out | 381 ++++++++++++++++++++++++++++++++++++ docs/intro/tokens.rst | 23 +++ docs/intro/usage_python.rst | 36 ++++ 5 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 docs/intro/git.rst create mode 100644 docs/intro/test.out create mode 100644 docs/intro/tokens.rst create mode 100644 docs/intro/usage_python.rst diff --git a/docs/index.rst b/docs/index.rst index 768de765..b8fb0343 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,12 +11,15 @@ gimie (Git Meta Information Extractor) is a python library and command line tool :maxdepth: 2 :caption: Contents: -Context -======= +Introduction +============ .. toctree:: :maxdepth: 3 intro/linked_data + intro/git + intro/tokens + intro/usage_python Reference API diff --git a/docs/intro/git.rst b/docs/intro/git.rst new file mode 100644 index 00000000..a98b87ae --- /dev/null +++ b/docs/intro/git.rst @@ -0,0 +1,8 @@ +Git repositories +**************** + +Software projects are usually versioned controlled and hosted on a server. Git is by far the most popular version control system, and is commonly used for scientific software and data science projects. + +Git natively stores some metadata about the project authors and contributions in a local index, but git providers (servers) such has Github and GitLab store and expose more advanced information about the project and contributors. These information are served in provider-dependent format with specific APIs. + +Gimie aims to provide provider-agnostic metadata in an interoperable format. It will request data from the provider API if available, or from git by cloning the repository into a temporary folder otherwise. This metadata is then converted to the widely used schema.org standard so that it can readily be integrated with other tools and services. diff --git a/docs/intro/test.out b/docs/intro/test.out new file mode 100644 index 00000000..dc6fa2b6 --- /dev/null +++ b/docs/intro/test.out @@ -0,0 +1,381 @@ +[ + { + "@id": "https://github.com/SDSC-ORD/gimie", + "@type": [ + "http://schema.org/SoftwareSourceCode" + ], + "http://schema.org/CodeRepository": [ + { + "@id": "https://github.com/SDSC-ORD/gimie" + } + ], + "http://schema.org/author": [ + { + "@id": "https://github.com/SDSC-ORD" + } + ], + "http://schema.org/contributor": [ + { + "@id": "https://github.com/cmdoret" + }, + { + "@id": "https://github.com/sabinem" + }, + { + "@id": "https://github.com/martinfontanet" + }, + { + "@id": "https://github.com/vancauwe" + }, + { + "@id": "https://github.com/rmfranken" + }, + { + "@id": "https://github.com/supermaxiste" + }, + { + "@id": "https://github.com/sabrinaossey" + } + ], + "http://schema.org/dateCreated": [ + { + "@value": "2022-12-07" + } + ], + "http://schema.org/dateModified": [ + { + "@value": "2023-05-24" + } + ], + "http://schema.org/description": [ + { + "@value": "Extract linked metadata from repositories" + } + ], + "http://schema.org/downloadUrl": [ + { + "@value": "https://github.com/SDSC-ORD/gimie/archive/refs/tags/0.3.0.tar.gz" + } + ], + "http://schema.org/keywords": [ + { + "@value": "fair-data" + }, + { + "@value": "git" + }, + { + "@value": "linked-open-data" + }, + { + "@value": "metadata-extraction" + }, + { + "@value": "scientific-software" + }, + { + "@value": "python" + } + ], + "http://schema.org/license": [ + { + "@id": "https://spdx.org/licenses/Apache-2.0" + } + ], + "http://schema.org/name": [ + { + "@value": "SDSC-ORD/gimie" + } + ], + "http://schema.org/programmingLanguage": [ + { + "@value": "Python" + } + ], + "http://schema.org/version": [ + { + "@value": "0.3.0" + } + ] + }, + { + "@id": "https://github.com/rmfranken", + "@type": [ + "http://schema.org/Person" + ], + "http://schema.org/affiliation": [ + { + "@id": "https://github.com/SDSC-ORD" + } + ], + "http://schema.org/identifier": [ + { + "@value": "rmfranken" + } + ] + }, + { + "@id": "https://github.com/cmdoret", + "@type": [ + "http://schema.org/Person" + ], + "http://schema.org/affiliation": [ + { + "@id": "https://github.com/koszullab" + }, + { + "@id": "https://github.com/SwissDataScienceCenter" + }, + { + "@id": "https://github.com/EPFL-Data-Champions" + }, + { + "@id": "https://github.com/SDSC-ORD" + } + ], + "http://schema.org/identifier": [ + { + "@value": "cmdoret" + } + ], + "http://schema.org/name": [ + { + "@value": "Cyril Matthey-Doret" + } + ] + }, + { + "@id": "https://github.com/martinfontanet", + "@type": [ + "http://schema.org/Person" + ], + "http://schema.org/affiliation": [ + { + "@id": "https://github.com/SwissDataScienceCenter" + }, + { + "@id": "https://github.com/SDSC-ORD" + } + ], + "http://schema.org/identifier": [ + { + "@value": "martinfontanet" + } + ] + }, + { + "@id": "https://github.com/SDSC-ORD", + "@type": [ + "http://schema.org/Organization" + ], + "http://schema.org/description": [ + { + "@value": "Open Research Data team at the Swiss Data Science Center." + } + ], + "http://schema.org/legalName": [ + { + "@value": "Swiss Data Science Center - ORD" + } + ], + "http://schema.org/logo": [ + { + "@id": "https://avatars.githubusercontent.com/u/114115753?v=4" + } + ], + "http://schema.org/name": [ + { + "@value": "SDSC-ORD" + } + ] + }, + { + "@id": "https://github.com/sabinem", + "@type": [ + "http://schema.org/Person" + ], + "http://schema.org/affiliation": [ + { + "@id": "https://github.com/SDSC-ORD" + } + ], + "http://schema.org/identifier": [ + { + "@value": "sabinem" + } + ], + "http://schema.org/name": [ + { + "@value": "Sabine Maennel" + } + ] + }, + { + "@id": "https://github.com/biocypher", + "@type": [ + "http://schema.org/Organization" + ], + "http://schema.org/description": [ + { + "@value": "" + } + ], + "http://schema.org/legalName": [ + { + "@value": "biocypher" + } + ], + "http://schema.org/logo": [ + { + "@id": "https://avatars.githubusercontent.com/u/128412897?v=4" + } + ], + "http://schema.org/name": [ + { + "@value": "biocypher" + } + ] + }, + { + "@id": "https://github.com/supermaxiste", + "@type": [ + "http://schema.org/Person" + ], + "http://schema.org/affiliation": [ + { + "@id": "https://github.com/SDSC-ORD" + }, + { + "@id": "https://github.com/biocypher" + } + ], + "http://schema.org/identifier": [ + { + "@value": "supermaxiste" + } + ] + }, + { + "@id": "https://github.com/SwissDataScienceCenter", + "@type": [ + "http://schema.org/Organization" + ], + "http://schema.org/description": [ + { + "@value": "An ETH Domain initiative for accelerating the adoption of data science" + } + ], + "http://schema.org/legalName": [ + { + "@value": "Swiss Data Science Center" + } + ], + "http://schema.org/logo": [ + { + "@id": "https://avatars.githubusercontent.com/u/25008760?v=4" + } + ], + "http://schema.org/name": [ + { + "@value": "SwissDataScienceCenter" + } + ] + }, + { + "@id": "https://github.com/EPFL-Data-Champions", + "@type": [ + "http://schema.org/Organization" + ], + "http://schema.org/description": [ + { + "@value": "Cross-disciplinary community around research data, voluntary EPFL's researchers and staff with keen interest in research data." + } + ], + "http://schema.org/legalName": [ + { + "@value": "EPFL Data Champions" + } + ], + "http://schema.org/logo": [ + { + "@id": "https://avatars.githubusercontent.com/u/78474394?v=4" + } + ], + "http://schema.org/name": [ + { + "@value": "EPFL-Data-Champions" + } + ] + }, + { + "@id": "https://github.com/koszullab", + "@type": [ + "http://schema.org/Organization" + ], + "http://schema.org/description": [ + { + "@value": "" + } + ], + "http://schema.org/legalName": [ + { + "@value": "Romain Koszul Laboratory" + } + ], + "http://schema.org/logo": [ + { + "@id": "https://avatars.githubusercontent.com/u/9391430?v=4" + } + ], + "http://schema.org/name": [ + { + "@value": "koszullab" + } + ] + }, + { + "@id": "https://github.com/sabrinaossey", + "@type": [ + "http://schema.org/Person" + ], + "http://schema.org/affiliation": [ + { + "@id": "https://github.com/SwissDataScienceCenter" + }, + { + "@id": "https://github.com/SDSC-ORD" + } + ], + "http://schema.org/identifier": [ + { + "@value": "sabrinaossey" + } + ], + "http://schema.org/name": [ + { + "@value": "sabrinaossey" + } + ] + }, + { + "@id": "https://github.com/vancauwe", + "@type": [ + "http://schema.org/Person" + ], + "http://schema.org/affiliation": [ + { + "@id": "https://github.com/SDSC-ORD" + } + ], + "http://schema.org/identifier": [ + { + "@value": "vancauwe" + } + ], + "http://schema.org/name": [ + { + "@value": "Laure Vancau" + } + ] + } +] diff --git a/docs/intro/tokens.rst b/docs/intro/tokens.rst new file mode 100644 index 00000000..c1a231f0 --- /dev/null +++ b/docs/intro/tokens.rst @@ -0,0 +1,23 @@ +Token management +**************** + +Gimie requests data from third party APIs (Gitlab, Github) which require authentication to work. This authentication usually works with Personal Authentication Tokens (PATs). PATs are secret codes that can be used as passwords to perform actions on your behalf, but whose permissions can be limited to specific actions. Since Gimie only consumes data, it will normally work with tokens that have read-only permission. + +Generating tokens can usually be done via the web interface of the service provider, and they must then be provided to Gimie. There are 2 ways to pass your token to Gimie: + +1. Set the corresponding Environment variable. The token will only be accessible for the current session: + +.. code-block:: + + export GITLAB_TOKEN= + export GITHUB_TOKEN= + +2. Use a ``.env`` file in the current directory. Gimie will look for a file named ``.env`` and source it. The file contents should be as follows: + +.. code-block:: + + GITLAB_TOKEN= + GITHUB_TOKEN= + + +While the latter approach can be convenient to persist your token locally, it is generally not recommended to store your tokens in plain text as they are sensitive information. Hence the first approach should be preferred in most cases. diff --git a/docs/intro/usage_python.rst b/docs/intro/usage_python.rst new file mode 100644 index 00000000..b6b77287 --- /dev/null +++ b/docs/intro/usage_python.rst @@ -0,0 +1,36 @@ +Python Usage +************ + +Gimie can be used as a python library. Either to run the end-to-end extraction process on an input URL, or only a specific extractor. + +The end-to-end extraction is performed by ``gimie.Project`` and will automatically detect the git-provider: + +.. code-block:: python + + from gimie.project import Project + url = 'https://github.com/foo/bar' + proj = Project(url) + + +A specific extractor can also be used, for example to use with GitLab projects: + +.. code-block:: python + + from gimie.sources.gitlab import GitlabExtractor + url = "https://gitlab.com/foo/bar" + extractor = GitlabExtractor(url) + extractor.extract() + + +Once a project's metadata has been extracted, it can be stored as an rdflib graph, or serialized to RDF triples: + +.. code-block:: python + + import rdflib + graph: rdflib.Graph = proj.to_graph() + + # serialize project directly as an RDF file + proj.serialize(format='json-ld', destination='foobar.json') + + +Extractors also support the ``to_graph()`` and ``serialize()`` methods. From 1a56dfc1b273e1c7f73cab7ed2b7b6ea8dfe81cf Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 19:02:56 +0200 Subject: [PATCH 22/43] doc: improve header names --- docs/cli.rst | 4 +- docs/index.rst | 10 +- docs/intro/test.out | 381 -------------------------------------------- 3 files changed, 8 insertions(+), 387 deletions(-) delete mode 100644 docs/intro/test.out diff --git a/docs/cli.rst b/docs/cli.rst index d9377be4..362b9d74 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -1,5 +1,5 @@ -CLI Documentation -***************** +Command Line Interface +********************** .. click:: gimie.cli:cli :prog: gimie diff --git a/docs/index.rst b/docs/index.rst index b8fb0343..c2bd6201 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,7 +5,7 @@ Welcome to gimie's documentation! ================================= -gimie (Git Meta Information Extractor) is a python library and command line toolto extract structured metadata from git repositories. +gimie (Git Meta Information Extractor) is a python library and command line tool to extract structured metadata from git repositories. .. toctree:: :maxdepth: 2 @@ -13,16 +13,18 @@ gimie (Git Meta Information Extractor) is a python library and command line tool Introduction ============ + .. toctree:: :maxdepth: 3 + intro/quickstart intro/linked_data intro/git intro/tokens intro/usage_python -Reference API +API Reference ============= .. toctree:: @@ -31,8 +33,8 @@ Reference API api/modules -Command Line Interface -====================== +CLI Reference +============= .. toctree:: :maxdepth: 2 diff --git a/docs/intro/test.out b/docs/intro/test.out deleted file mode 100644 index dc6fa2b6..00000000 --- a/docs/intro/test.out +++ /dev/null @@ -1,381 +0,0 @@ -[ - { - "@id": "https://github.com/SDSC-ORD/gimie", - "@type": [ - "http://schema.org/SoftwareSourceCode" - ], - "http://schema.org/CodeRepository": [ - { - "@id": "https://github.com/SDSC-ORD/gimie" - } - ], - "http://schema.org/author": [ - { - "@id": "https://github.com/SDSC-ORD" - } - ], - "http://schema.org/contributor": [ - { - "@id": "https://github.com/cmdoret" - }, - { - "@id": "https://github.com/sabinem" - }, - { - "@id": "https://github.com/martinfontanet" - }, - { - "@id": "https://github.com/vancauwe" - }, - { - "@id": "https://github.com/rmfranken" - }, - { - "@id": "https://github.com/supermaxiste" - }, - { - "@id": "https://github.com/sabrinaossey" - } - ], - "http://schema.org/dateCreated": [ - { - "@value": "2022-12-07" - } - ], - "http://schema.org/dateModified": [ - { - "@value": "2023-05-24" - } - ], - "http://schema.org/description": [ - { - "@value": "Extract linked metadata from repositories" - } - ], - "http://schema.org/downloadUrl": [ - { - "@value": "https://github.com/SDSC-ORD/gimie/archive/refs/tags/0.3.0.tar.gz" - } - ], - "http://schema.org/keywords": [ - { - "@value": "fair-data" - }, - { - "@value": "git" - }, - { - "@value": "linked-open-data" - }, - { - "@value": "metadata-extraction" - }, - { - "@value": "scientific-software" - }, - { - "@value": "python" - } - ], - "http://schema.org/license": [ - { - "@id": "https://spdx.org/licenses/Apache-2.0" - } - ], - "http://schema.org/name": [ - { - "@value": "SDSC-ORD/gimie" - } - ], - "http://schema.org/programmingLanguage": [ - { - "@value": "Python" - } - ], - "http://schema.org/version": [ - { - "@value": "0.3.0" - } - ] - }, - { - "@id": "https://github.com/rmfranken", - "@type": [ - "http://schema.org/Person" - ], - "http://schema.org/affiliation": [ - { - "@id": "https://github.com/SDSC-ORD" - } - ], - "http://schema.org/identifier": [ - { - "@value": "rmfranken" - } - ] - }, - { - "@id": "https://github.com/cmdoret", - "@type": [ - "http://schema.org/Person" - ], - "http://schema.org/affiliation": [ - { - "@id": "https://github.com/koszullab" - }, - { - "@id": "https://github.com/SwissDataScienceCenter" - }, - { - "@id": "https://github.com/EPFL-Data-Champions" - }, - { - "@id": "https://github.com/SDSC-ORD" - } - ], - "http://schema.org/identifier": [ - { - "@value": "cmdoret" - } - ], - "http://schema.org/name": [ - { - "@value": "Cyril Matthey-Doret" - } - ] - }, - { - "@id": "https://github.com/martinfontanet", - "@type": [ - "http://schema.org/Person" - ], - "http://schema.org/affiliation": [ - { - "@id": "https://github.com/SwissDataScienceCenter" - }, - { - "@id": "https://github.com/SDSC-ORD" - } - ], - "http://schema.org/identifier": [ - { - "@value": "martinfontanet" - } - ] - }, - { - "@id": "https://github.com/SDSC-ORD", - "@type": [ - "http://schema.org/Organization" - ], - "http://schema.org/description": [ - { - "@value": "Open Research Data team at the Swiss Data Science Center." - } - ], - "http://schema.org/legalName": [ - { - "@value": "Swiss Data Science Center - ORD" - } - ], - "http://schema.org/logo": [ - { - "@id": "https://avatars.githubusercontent.com/u/114115753?v=4" - } - ], - "http://schema.org/name": [ - { - "@value": "SDSC-ORD" - } - ] - }, - { - "@id": "https://github.com/sabinem", - "@type": [ - "http://schema.org/Person" - ], - "http://schema.org/affiliation": [ - { - "@id": "https://github.com/SDSC-ORD" - } - ], - "http://schema.org/identifier": [ - { - "@value": "sabinem" - } - ], - "http://schema.org/name": [ - { - "@value": "Sabine Maennel" - } - ] - }, - { - "@id": "https://github.com/biocypher", - "@type": [ - "http://schema.org/Organization" - ], - "http://schema.org/description": [ - { - "@value": "" - } - ], - "http://schema.org/legalName": [ - { - "@value": "biocypher" - } - ], - "http://schema.org/logo": [ - { - "@id": "https://avatars.githubusercontent.com/u/128412897?v=4" - } - ], - "http://schema.org/name": [ - { - "@value": "biocypher" - } - ] - }, - { - "@id": "https://github.com/supermaxiste", - "@type": [ - "http://schema.org/Person" - ], - "http://schema.org/affiliation": [ - { - "@id": "https://github.com/SDSC-ORD" - }, - { - "@id": "https://github.com/biocypher" - } - ], - "http://schema.org/identifier": [ - { - "@value": "supermaxiste" - } - ] - }, - { - "@id": "https://github.com/SwissDataScienceCenter", - "@type": [ - "http://schema.org/Organization" - ], - "http://schema.org/description": [ - { - "@value": "An ETH Domain initiative for accelerating the adoption of data science" - } - ], - "http://schema.org/legalName": [ - { - "@value": "Swiss Data Science Center" - } - ], - "http://schema.org/logo": [ - { - "@id": "https://avatars.githubusercontent.com/u/25008760?v=4" - } - ], - "http://schema.org/name": [ - { - "@value": "SwissDataScienceCenter" - } - ] - }, - { - "@id": "https://github.com/EPFL-Data-Champions", - "@type": [ - "http://schema.org/Organization" - ], - "http://schema.org/description": [ - { - "@value": "Cross-disciplinary community around research data, voluntary EPFL's researchers and staff with keen interest in research data." - } - ], - "http://schema.org/legalName": [ - { - "@value": "EPFL Data Champions" - } - ], - "http://schema.org/logo": [ - { - "@id": "https://avatars.githubusercontent.com/u/78474394?v=4" - } - ], - "http://schema.org/name": [ - { - "@value": "EPFL-Data-Champions" - } - ] - }, - { - "@id": "https://github.com/koszullab", - "@type": [ - "http://schema.org/Organization" - ], - "http://schema.org/description": [ - { - "@value": "" - } - ], - "http://schema.org/legalName": [ - { - "@value": "Romain Koszul Laboratory" - } - ], - "http://schema.org/logo": [ - { - "@id": "https://avatars.githubusercontent.com/u/9391430?v=4" - } - ], - "http://schema.org/name": [ - { - "@value": "koszullab" - } - ] - }, - { - "@id": "https://github.com/sabrinaossey", - "@type": [ - "http://schema.org/Person" - ], - "http://schema.org/affiliation": [ - { - "@id": "https://github.com/SwissDataScienceCenter" - }, - { - "@id": "https://github.com/SDSC-ORD" - } - ], - "http://schema.org/identifier": [ - { - "@value": "sabrinaossey" - } - ], - "http://schema.org/name": [ - { - "@value": "sabrinaossey" - } - ] - }, - { - "@id": "https://github.com/vancauwe", - "@type": [ - "http://schema.org/Person" - ], - "http://schema.org/affiliation": [ - { - "@id": "https://github.com/SDSC-ORD" - } - ], - "http://schema.org/identifier": [ - { - "@value": "vancauwe" - } - ], - "http://schema.org/name": [ - { - "@value": "Laure Vancau" - } - ] - } -] From 90b219422a4fed539ac88b96ceac28f948b3de07 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 19:03:41 +0200 Subject: [PATCH 23/43] doc: add quickstart section, enable tabbing and crossref --- docs/conf.py | 2 ++ docs/intro/quickstart.rst | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 docs/intro/quickstart.rst diff --git a/docs/conf.py b/docs/conf.py index 5fd825f9..43c53be4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -25,7 +25,9 @@ "sphinx.ext.coverage", "sphinx.ext.viewcode", "sphinx.ext.githubpages", + "sphinx.ext.autosectionlabel", "sphinx_click", + "sphinx_tabs.tabs", ] templates_path = ["_templates"] diff --git a/docs/intro/quickstart.rst b/docs/intro/quickstart.rst new file mode 100644 index 00000000..7e87a92a --- /dev/null +++ b/docs/intro/quickstart.rst @@ -0,0 +1,37 @@ +Quick start +*********** + +The easiest way to use gimie is to run it as a command line tool. Here's how to get started: + +Install using pip or docker: + +.. tabs:: + + .. tab:: pip + + .. code-block:: bash + + $ pip install gimie + + .. tab:: docker + + .. code-block:: bash + + $ docker pull ghcr.io/sdsc-ord/gimie:latest + + + +Before running gimie, you will need to obtain a personal access token for the GitHub and/or GitLab and export it as an environment variable. See :ref:`Token management` for more information. + +Gimie can then be used as follows to extract repository metadata: + +.. code-block:: bash + + $ gimie data > output.ttl + +If running gimie in a container, you would have to pass your github or gitlab token as an environment variable inside the container: + + +.. code-block:: bash + + $ docker run -e GITHUB_TOKEN=${GITHUB_TOKEN} ghcr.io/sdsc-ord/gimie:latest > output.ttl From cedd6f7f7611a86ac84076c6f0fec57185473201 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 19:04:05 +0200 Subject: [PATCH 24/43] doc(git): rm duplicate attibute from docstring --- gimie/sources/git.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gimie/sources/git.py b/gimie/sources/git.py index 4c23efc9..54963857 100644 --- a/gimie/sources/git.py +++ b/gimie/sources/git.py @@ -46,10 +46,6 @@ class GitExtractor(Extractor): ---------- uri: Optional[str] The URI to assign the repository in RDF. - author - contributors - date_created - date_modified repository: Repository The repository we are extracting metadata from. """ From 386e3ba42d1329b61581049834c8f040985e12eb Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 19:04:30 +0200 Subject: [PATCH 25/43] doc: add sphinx-tabs as doc dep --- poetry.lock | 30 +++++++++++++++++++++++++----- pyproject.toml | 1 + 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 59b4f016..6f00c2a6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -298,13 +298,13 @@ files = [ [[package]] name = "docutils" -version = "0.20.1" +version = "0.18.1" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, ] [[package]] @@ -1264,6 +1264,26 @@ click = ">=7.0" docutils = "*" sphinx = ">=2.0" +[[package]] +name = "sphinx-tabs" +version = "3.4.1" +description = "Tabbed views for Sphinx" +optional = false +python-versions = "~=3.7" +files = [ + {file = "sphinx-tabs-3.4.1.tar.gz", hash = "sha256:d2a09f9e8316e400d57503f6df1c78005fdde220e5af589cc79d493159e1b832"}, + {file = "sphinx_tabs-3.4.1-py3-none-any.whl", hash = "sha256:7cea8942aeccc5d01a995789c01804b787334b55927f29b36ba16ed1e7cb27c6"}, +] + +[package.dependencies] +docutils = ">=0.18.0,<0.19.0" +pygments = "*" +sphinx = "*" + +[package.extras] +code-style = ["pre-commit (==2.13.0)"] +testing = ["bs4", "coverage", "pygments", "pytest (>=7.1,<8)", "pytest-cov", "pytest-regressions", "rinohtype", "sphinx-testing"] + [[package]] name = "sphinxcontrib-applehelp" version = "1.0.4" @@ -1482,4 +1502,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "30a25209978909d710c3799978eea1495f22dcb8fb526315c48328af4d7199c4" +content-hash = "15e8b3760c94990ad15076e0026a1ce43661c7eae6f15df846b76406310cbe06" diff --git a/pyproject.toml b/pyproject.toml index 0a6e523c..6f3236dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,7 @@ sphinx = "^7.0.1" furo = "^2023.5.20" recommonmark = "^0.7.1" sphinx-click = "^4.4.0" +sphinx-tabs = "^3.4.1" [build-system] requires = ["poetry-core"] From 0917f6411a7c43684b3541a3353c1c04b30d04e4 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 19:09:55 +0200 Subject: [PATCH 26/43] ci(doc): set gh-pages deployment ref to main --- .github/workflows/sphinx-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index 0a265785..e494ecfb 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -22,7 +22,7 @@ jobs: - name: Deploy uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/docs-website' }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} with: publish_branch: gh-pages github_token: ${{ secrets.GITHUB_TOKEN }} From 715f2e0315f196af3f584046a7aa6abf396b1e09 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 19:19:55 +0200 Subject: [PATCH 27/43] ci(doc): set build ref to docs-website for debugging --- .github/workflows/sphinx-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index e494ecfb..0a265785 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -22,7 +22,7 @@ jobs: - name: Deploy uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/docs-website' }} with: publish_branch: gh-pages github_token: ${{ secrets.GITHUB_TOKEN }} From 70074545f217ba24f0274c0ccc2258bc58524dc9 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 19:26:11 +0200 Subject: [PATCH 28/43] ci(doc): rm constraints on docs action --- .github/workflows/sphinx-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index 0a265785..0cb5946d 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -22,7 +22,7 @@ jobs: - name: Deploy uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/docs-website' }} + # if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/docs-website' }} with: publish_branch: gh-pages github_token: ${{ secrets.GITHUB_TOKEN }} From cc9a9c74bcd7fa56fcd18d5a03f3e1f08ef225d0 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 22:16:47 +0200 Subject: [PATCH 29/43] doc(api): reduce autodoc ToC depth --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3c0249f9..8b4da83f 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ check: ## Run code quality tools. doc: ## Build sphinx documentation website locally @echo "📖 Building documentation" @cd docs - @poetry run sphinx-apidoc -f -o docs/api gimie + @poetry run sphinx-apidoc -d 3 -f -o docs/api gimie @poetry run sphinx-build docs/ docs/_build .PHONY: docker-build From 96e4b25f15220d2bca24fe60b74c1895961efb06 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 22:37:32 +0200 Subject: [PATCH 30/43] doc(theme): furo -> sphinxawesome --- docs/conf.py | 2 +- docs/intro/git.rst | 2 +- poetry.lock | 52 +++++++++++++++------------------------------- pyproject.toml | 2 +- 4 files changed, 20 insertions(+), 38 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 43c53be4..2ee0ec11 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -39,7 +39,7 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = "furo" +html_theme = "sphinxawesome_theme" html_static_path = ["_static"] diff --git a/docs/intro/git.rst b/docs/intro/git.rst index a98b87ae..00ef1288 100644 --- a/docs/intro/git.rst +++ b/docs/intro/git.rst @@ -1,7 +1,7 @@ Git repositories **************** -Software projects are usually versioned controlled and hosted on a server. Git is by far the most popular version control system, and is commonly used for scientific software and data science projects. +Software projects are usually version-controlled and hosted on a server. Git is by far the most popular version control system, and is commonly used for scientific software and data science projects. Git natively stores some metadata about the project authors and contributions in a local index, but git providers (servers) such has Github and GitLab store and expose more advanced information about the project and contributors. These information are served in provider-dependent format with specific APIs. diff --git a/poetry.lock b/poetry.lock index 6f00c2a6..478433aa 100644 --- a/poetry.lock +++ b/poetry.lock @@ -362,23 +362,6 @@ files = [ {file = "frozendict-2.3.4.tar.gz", hash = "sha256:15b4b18346259392b0d27598f240e9390fafbff882137a9c48a1e0104fb17f78"}, ] -[[package]] -name = "furo" -version = "2023.5.20" -description = "A clean customisable Sphinx documentation theme." -optional = false -python-versions = ">=3.7" -files = [ - {file = "furo-2023.5.20-py3-none-any.whl", hash = "sha256:594a8436ddfe0c071f3a9e9a209c314a219d8341f3f1af33fdf7c69544fab9e6"}, - {file = "furo-2023.5.20.tar.gz", hash = "sha256:40e09fa17c6f4b22419d122e933089226dcdb59747b5b6c79363089827dea16f"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -pygments = ">=2.7" -sphinx = ">=6.0,<8.0" -sphinx-basic-ng = "*" - [[package]] name = "gitdb" version = "4.0.10" @@ -1231,23 +1214,6 @@ docs = ["sphinxcontrib-websupport"] lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] -[[package]] -name = "sphinx-basic-ng" -version = "1.0.0b1" -description = "A modern skeleton for Sphinx themes." -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx_basic_ng-1.0.0b1-py3-none-any.whl", hash = "sha256:ade597a3029c7865b24ad0eda88318766bcc2f9f4cef60df7e28126fde94db2a"}, - {file = "sphinx_basic_ng-1.0.0b1.tar.gz", hash = "sha256:89374bd3ccd9452a301786781e28c8718e99960f2d4f411845ea75fc7bb5a9b0"}, -] - -[package.dependencies] -sphinx = ">=4.0" - -[package.extras] -docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] - [[package]] name = "sphinx-click" version = "4.4.0" @@ -1284,6 +1250,22 @@ sphinx = "*" code-style = ["pre-commit (==2.13.0)"] testing = ["bs4", "coverage", "pygments", "pytest (>=7.1,<8)", "pytest-cov", "pytest-regressions", "rinohtype", "sphinx-testing"] +[[package]] +name = "sphinxawesome-theme" +version = "4.1.0" +description = "An awesome theme for the Sphinx documentation generator" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "sphinxawesome_theme-4.1.0-py3-none-any.whl", hash = "sha256:fb6b4ba63583199d6c1d837ffc0fea8d63e4bc3537be9b27c563d82dcf3b25c2"}, + {file = "sphinxawesome_theme-4.1.0.tar.gz", hash = "sha256:827b810ce314adb3146ccbce4787d6a6fa94de6dea7c61ef081a239ba70a1d25"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.9.1,<5.0.0" +python-dotenv = ">=0.19,<1.1" +sphinx = ">4" + [[package]] name = "sphinxcontrib-applehelp" version = "1.0.4" @@ -1502,4 +1484,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "15e8b3760c94990ad15076e0026a1ce43661c7eae6f15df846b76406310cbe06" +content-hash = "e3931f7b9276951829226c163159af0ba17d2d6cae33934a7912497bd83d4a36" diff --git a/pyproject.toml b/pyproject.toml index 6f3236dc..d8d8abe0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,10 +41,10 @@ black = "^22.10.0" [tool.poetry.group.doc.dependencies] sphinx = "^7.0.1" -furo = "^2023.5.20" recommonmark = "^0.7.1" sphinx-click = "^4.4.0" sphinx-tabs = "^3.4.1" +sphinxawesome-theme = "^4.1.0" [build-system] requires = ["poetry-core"] From d6674cdefe1b32299c0c92b4f302f2366142b3fd Mon Sep 17 00:00:00 2001 From: cmdoret Date: Wed, 7 Jun 2023 22:40:08 +0200 Subject: [PATCH 31/43] doc: add sphinx-copybutton extension --- docs/conf.py | 1 + docs/intro/quickstart.rst | 16 ++++++++-------- poetry.lock | 20 +++++++++++++++++++- pyproject.toml | 1 + 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 2ee0ec11..3c9be6bb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -28,6 +28,7 @@ "sphinx.ext.autosectionlabel", "sphinx_click", "sphinx_tabs.tabs", + "sphinx_copybutton", ] templates_path = ["_templates"] diff --git a/docs/intro/quickstart.rst b/docs/intro/quickstart.rst index 7e87a92a..63baee3f 100644 --- a/docs/intro/quickstart.rst +++ b/docs/intro/quickstart.rst @@ -9,15 +9,15 @@ Install using pip or docker: .. tab:: pip - .. code-block:: bash + .. code-block:: - $ pip install gimie + pip install gimie .. tab:: docker - .. code-block:: bash + .. code-block:: - $ docker pull ghcr.io/sdsc-ord/gimie:latest + docker pull ghcr.io/sdsc-ord/gimie:latest @@ -25,13 +25,13 @@ Before running gimie, you will need to obtain a personal access token for the Gi Gimie can then be used as follows to extract repository metadata: -.. code-block:: bash +.. code-block:: console - $ gimie data > output.ttl + gimie data > output.ttl If running gimie in a container, you would have to pass your github or gitlab token as an environment variable inside the container: -.. code-block:: bash +.. code-block:: console - $ docker run -e GITHUB_TOKEN=${GITHUB_TOKEN} ghcr.io/sdsc-ord/gimie:latest > output.ttl + docker run -e GITHUB_TOKEN=${GITHUB_TOKEN} ghcr.io/sdsc-ord/gimie:latest data > output.ttl diff --git a/poetry.lock b/poetry.lock index 478433aa..4a1d25e3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1230,6 +1230,24 @@ click = ">=7.0" docutils = "*" sphinx = ">=2.0" +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +description = "Add a copy button to each of your code cells." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, +] + +[package.dependencies] +sphinx = ">=1.8" + +[package.extras] +code-style = ["pre-commit (==2.12.1)"] +rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] + [[package]] name = "sphinx-tabs" version = "3.4.1" @@ -1484,4 +1502,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e3931f7b9276951829226c163159af0ba17d2d6cae33934a7912497bd83d4a36" +content-hash = "faf0482b5fc736db79e3c81132d777d88826f82eb8e8fee8611cc109d933ec93" diff --git a/pyproject.toml b/pyproject.toml index d8d8abe0..4e87527f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,7 @@ recommonmark = "^0.7.1" sphinx-click = "^4.4.0" sphinx-tabs = "^3.4.1" sphinxawesome-theme = "^4.1.0" +sphinx-copybutton = "^0.5.2" [build-system] requires = ["poetry-core"] From d3650b499d14f0483e582c1c2ed03e2c62117020 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 00:23:25 +0200 Subject: [PATCH 32/43] doc(theme): add sphinx_design extension, downgrade to sphinx6 for compat --- docs/conf.py | 1 + docs/index.rst | 4 + docs/intro/quickstart.rst | 38 +++- docs/intro/tokens.rst | 4 +- poetry.lock | 467 +++++++++++++++++++------------------- pyproject.toml | 3 +- 6 files changed, 275 insertions(+), 242 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 3c9be6bb..9ccac1f8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,7 @@ "sphinx_click", "sphinx_tabs.tabs", "sphinx_copybutton", + "sphinx_design", ] templates_path = ["_templates"] diff --git a/docs/index.rst b/docs/index.rst index c2bd6201..5eb980fc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -7,6 +7,10 @@ Welcome to gimie's documentation! ================================= gimie (Git Meta Information Extractor) is a python library and command line tool to extract structured metadata from git repositories. +.. card:: :octicon:`mark-github;2em` `GitHub repository `_ + + Visit gimie's GitHub repository to follow the latest developments! + .. toctree:: :maxdepth: 2 :caption: Contents: diff --git a/docs/intro/quickstart.rst b/docs/intro/quickstart.rst index 63baee3f..478d44ff 100644 --- a/docs/intro/quickstart.rst +++ b/docs/intro/quickstart.rst @@ -5,33 +5,49 @@ The easiest way to use gimie is to run it as a command line tool. Here's how to Install using pip or docker: -.. tabs:: +.. tab-set:: - .. tab:: pip + .. tab-item:: pip + :sync: pip + :selected: - .. code-block:: + .. code-block:: console pip install gimie - .. tab:: docker + .. tab-item:: docker + :sync: docker - .. code-block:: + .. code-block:: console docker pull ghcr.io/sdsc-ord/gimie:latest +.. warning:: + + Before running gimie, you will need to obtain a personal access token for the GitHub and/or GitLab and export it as an environment variable. See :ref:`Token management` for more information. -Before running gimie, you will need to obtain a personal access token for the GitHub and/or GitLab and export it as an environment variable. See :ref:`Token management` for more information. Gimie can then be used as follows to extract repository metadata: -.. code-block:: console +.. tab-set:: + + .. tab-item:: pip + :sync: pip + :selected: + + .. code-block:: console + + gimie data > output.ttl + + .. tab-item:: docker + :sync: docker - gimie data > output.ttl + .. code-block:: console -If running gimie in a container, you would have to pass your github or gitlab token as an environment variable inside the container: + docker run -e GITHUB_TOKEN=${GITHUB_TOKEN} ghcr.io/sdsc-ord/gimie:latest data > output.ttl -.. code-block:: console +.. note:: - docker run -e GITHUB_TOKEN=${GITHUB_TOKEN} ghcr.io/sdsc-ord/gimie:latest data > output.ttl + When running gimie in a container, you need to pass your github or gitlab token as an environment variable inside the container: diff --git a/docs/intro/tokens.rst b/docs/intro/tokens.rst index c1a231f0..732642d1 100644 --- a/docs/intro/tokens.rst +++ b/docs/intro/tokens.rst @@ -20,4 +20,6 @@ Generating tokens can usually be done via the web interface of the service provi GITHUB_TOKEN= -While the latter approach can be convenient to persist your token locally, it is generally not recommended to store your tokens in plain text as they are sensitive information. Hence the first approach should be preferred in most cases. +.. tip:: + + While the latter approach can be convenient to persist your token locally, it is generally not recommended to store your tokens in plain text as they are sensitive information. Hence the first approach should be preferred in most cases. diff --git a/poetry.lock b/poetry.lock index 4a1d25e3..027eb549 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,24 +11,6 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] - [[package]] name = "babel" version = "2.12.1" @@ -98,24 +80,24 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cachetools" -version = "5.3.0" +version = "5.3.1" description = "Extensible memoizing collections and decorators" optional = false -python-versions = "~=3.7" +python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, - {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, + {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, + {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, ] [[package]] name = "calamus" -version = "0.4.1" +version = "0.4.2" description = "calamus is a library built on top of marshmallow to allow (de-)Serialization of Python classes to JSON-LD." optional = false python-versions = ">=3.7.1,<4.0.0" files = [ - {file = "calamus-0.4.1-py3-none-any.whl", hash = "sha256:f46dad6376e6d708cafa76642b99127db20ba09ee46a37fd268afd17e925f541"}, - {file = "calamus-0.4.1.tar.gz", hash = "sha256:a3b2c7ec870fea7de28b2fda414ce0c12362aac5596e66a697716ec19f745346"}, + {file = "calamus-0.4.2-py3-none-any.whl", hash = "sha256:3d1121a379ee850a44de540ce091ae8482d539c6257a711b471cfbe0ee5a1e39"}, + {file = "calamus-0.4.2.tar.gz", hash = "sha256:86a3b52aa737062c291e0f4cd7cdebc2e8aee9d88292982770b426dc1f086212"}, ] [package.dependencies] @@ -129,13 +111,13 @@ docs = ["Jinja2 (>=3.0.0,<3.1.0)", "sphinx (>=3.0.3,<4.0.0)", "sphinx-rtd-theme [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -151,99 +133,86 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.0.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = "*" -files = [ - {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, - {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] [[package]] @@ -309,13 +278,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.0" +version = "1.1.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] [package.extras] @@ -323,43 +292,63 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.9.0" +version = "3.12.0" description = "A platform independent file lock." optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, - {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "frozendict" -version = "2.3.4" +version = "2.3.8" description = "A simple immutable dictionary" optional = false python-versions = ">=3.6" files = [ - {file = "frozendict-2.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a3b32d47282ae0098b9239a6d53ec539da720258bd762d62191b46f2f87c5fc"}, - {file = "frozendict-2.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c9887179a245a66a50f52afa08d4d92ae0f269839fab82285c70a0fa0dd782"}, - {file = "frozendict-2.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:b98a0d65a59af6da03f794f90b0c3085a7ee14e7bf8f0ef36b079ee8aa992439"}, - {file = "frozendict-2.3.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d8042b7dab5e992e30889c9b71b781d5feef19b372d47d735e4d7d45846fd4a"}, - {file = "frozendict-2.3.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a6d2e8b7cf6b6e5677a1a4b53b4073e5d9ec640d1db30dc679627668d25e90"}, - {file = "frozendict-2.3.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dbbe1339ac2646523e0bb00d1896085d1f70de23780e4927ca82b36ab8a044d3"}, - {file = "frozendict-2.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95bac22f7f09d81f378f2b3f672b7a50a974ca180feae1507f5e21bc147e8bc8"}, - {file = "frozendict-2.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae686722c144b333c4dbdc16323a5de11406d26b76d2be1cc175f90afacb5ba"}, - {file = "frozendict-2.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:389f395a74eb16992217ac1521e689c1dea2d70113bcb18714669ace1ed623b9"}, - {file = "frozendict-2.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ccb6450a416c9cc9acef7683e637e28356e3ceeabf83521f74cc2718883076b7"}, - {file = "frozendict-2.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca59108b77cadc13ba7dfea7e8f50811208c7652a13dc6c7f92d7782a24d299"}, - {file = "frozendict-2.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:3ec86ebf143dd685184215c27ec416c36e0ba1b80d81b1b9482f7d380c049b4e"}, - {file = "frozendict-2.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5809e6ff6b7257043a486f7a3b73a7da71cf69a38980b4171e4741291d0d9eb3"}, - {file = "frozendict-2.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c550ed7fdf1962984bec21630c584d722b3ee5d5f57a0ae2527a0121dc0414a"}, - {file = "frozendict-2.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:3e93aebc6e69a8ef329bbe9afb8342bd33c7b5c7a0c480cb9f7e60b0cbe48072"}, - {file = "frozendict-2.3.4-py3-none-any.whl", hash = "sha256:d722f3d89db6ae35ef35ecc243c40c800eb344848c83dba4798353312cd37b15"}, - {file = "frozendict-2.3.4.tar.gz", hash = "sha256:15b4b18346259392b0d27598f240e9390fafbff882137a9c48a1e0104fb17f78"}, + {file = "frozendict-2.3.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d188d062084fba0e4bf32719ff7380b26c050b932ff164043ce82ab90587c52b"}, + {file = "frozendict-2.3.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f2a4e818ac457f6354401dcb631527af25e5a20fcfc81e6b5054b45fc245caca"}, + {file = "frozendict-2.3.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a506d807858fa961aaa5b48dab6154fdc6bd045bbe9310788bbff141bb42d13"}, + {file = "frozendict-2.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:750632cc890d8ee9484fe6d31b261159144b6efacc08e1317fe46accd1410373"}, + {file = "frozendict-2.3.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ee5fe2658a8ac9a57f748acaf563f6a47f80b8308cbf0a04fac0ba057d41f75"}, + {file = "frozendict-2.3.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23c4bb46e6b8246e1e7e49b5593c2bc09221db0d8f31f7c092be8dfb42b9e620"}, + {file = "frozendict-2.3.8-cp310-cp310-win_amd64.whl", hash = "sha256:c31abc8acea309b132dde441856829f6003a3d242da8b54bce4c0f2a3c8c63f0"}, + {file = "frozendict-2.3.8-cp310-cp310-win_arm64.whl", hash = "sha256:9ea5520e85447ff8d4681e181941e482662817ccba921b7cb3f87922056d892a"}, + {file = "frozendict-2.3.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f83fed36497af9562ead5e9fb8443224ba2781786bd3b92b1087cb7d0ff20135"}, + {file = "frozendict-2.3.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e27c5c1d29d0eda7979253ec88abc239da1313b38f39f4b16984db3b3e482300"}, + {file = "frozendict-2.3.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c785de7f1a13f15963945f400656b18f057c2fc76c089dacf127a2bb188c03"}, + {file = "frozendict-2.3.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8cf35ddd25513428ec152614def9696afb93ae5ec0eb54fa6aa6206eda77ac4c"}, + {file = "frozendict-2.3.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ffc684773de7c88724788fa9787d0016fd75830412d58acbd9ed1a04762c675b"}, + {file = "frozendict-2.3.8-cp36-cp36m-win_amd64.whl", hash = "sha256:4c258aab9c8488338634f2ec670ef049dbf0ab0e7a2fa9bc2c7b5009cb614801"}, + {file = "frozendict-2.3.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47fc26468407fdeb428cfc89495b7921419e670355c21b383765482fdf6c5c14"}, + {file = "frozendict-2.3.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ea638228692db2bf94bce40ea4b25f4077588497b516bd16576575560094bd9"}, + {file = "frozendict-2.3.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a75bf87e76c4386caecdbdd02a99e53ad43a6b5c38fb3d5a634a9fc9ce41462"}, + {file = "frozendict-2.3.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ed5a6c5c7a0f57269577c2a338a6002949aea21a23b7b7d06da7e7dced8b605b"}, + {file = "frozendict-2.3.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d086440328a465dea9bef2dbad7548d75d1a0a0d21f43a08c03e1ec79ac5240e"}, + {file = "frozendict-2.3.8-cp37-cp37m-win_amd64.whl", hash = "sha256:0bc4767e2f83db5b701c787e22380296977368b0c57e485ca71b2eedfa11c4a3"}, + {file = "frozendict-2.3.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:638cf363d3cbca31a341503cf2219eac52a5f5140449676fae3d9644cd3c5487"}, + {file = "frozendict-2.3.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b2fd8ce36277919b36e3c834d2389f3cd7ac068ae730c312671dd4439a5dd65"}, + {file = "frozendict-2.3.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3957d52f1906b0c85f641a1911d214255873f6408ab4e5ad657cc27a247fb145"}, + {file = "frozendict-2.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72cfe08ab8ae524e54848fa90b22d02c1b1ecfb3064438696bcaa4b953f18772"}, + {file = "frozendict-2.3.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4742e76c4111bd09198d3ab66cef94be8506212311338f9182d6ef5f5cb60493"}, + {file = "frozendict-2.3.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:313ed8d9ba6bac35d7635cd9580ee5721a0fb016f4d2d20f0efa05dbecbdb1be"}, + {file = "frozendict-2.3.8-cp38-cp38-win_amd64.whl", hash = "sha256:d3c6ce943946c2a61501c8cf116fff0892d11dd579877eb36e2aea2c27fddfef"}, + {file = "frozendict-2.3.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0f573dc4861dd7ec9e055c8cceaf45355e894e749f621f199aab7b311ac4bdb"}, + {file = "frozendict-2.3.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b3435e5f1ca5ae68a5e95e64b09d6d5c645cadd6b87569a0b3019dd248c8d00"}, + {file = "frozendict-2.3.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:145afd033ebfade28416093335261b8ec1af5cccc593482309e7add062ec8668"}, + {file = "frozendict-2.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da98427de26b5a2865727947480cbb53860089c4d195baa29c539da811cea617"}, + {file = "frozendict-2.3.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5e82befa7c385a668d569cebbebbdf49cee6fea4083f08e869a1b08cfb640a9f"}, + {file = "frozendict-2.3.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80abe81d36e889ceec665e06ec764a7638000fa3e7be09786ac4d3ddc64b76db"}, + {file = "frozendict-2.3.8-cp39-cp39-win_amd64.whl", hash = "sha256:8ccc94ac781710db44e142e1a11ff9b31d02c032c01c6868d51fcbef73086225"}, + {file = "frozendict-2.3.8-cp39-cp39-win_arm64.whl", hash = "sha256:e72dbc1bcc2203cef38d205f692396f5505921a5680f66aa9a7e8bb71fd38f28"}, + {file = "frozendict-2.3.8-py311-none-any.whl", hash = "sha256:ba41a7ed019bd03b62d63ed3f8dea35b8243d1936f7c9ed4b5298ca45a01928e"}, + {file = "frozendict-2.3.8.tar.gz", hash = "sha256:5526559eca8f1780a4ee5146896f59afc31435313560208dd394a3a5e537d3ff"}, ] [[package]] @@ -413,13 +402,13 @@ lxml = ["lxml"] [[package]] name = "identify" -version = "2.5.15" +version = "2.5.24" description = "File identification library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.15-py2.py3-none-any.whl", hash = "sha256:1f4b36c5f50f3f950864b2a047308743f064eaa6f6645da5e5c780d1c7125487"}, - {file = "identify-2.5.15.tar.gz", hash = "sha256:c22aa206f47cc40486ecf585d27ad5f40adbfc494a3fa41dc3ed0499a23b123f"}, + {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, + {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, ] [package.extras] @@ -747,24 +736,24 @@ tests = ["pytest", "pytz", "simplejson"] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "nodeenv" -version = "1.7.0" +version = "1.8.0" description = "Node.js virtual environment builder" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] [package.dependencies] @@ -786,40 +775,40 @@ rdflib = ">=6.0.2" [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] name = "pathspec" -version = "0.11.0" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, - {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] [[package]] name = "platformdirs" -version = "2.6.2" +version = "3.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, - {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, + {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, + {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -838,13 +827,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.0.0" +version = "3.3.2" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.8" files = [ - {file = "pre_commit-3.0.0-py2.py3-none-any.whl", hash = "sha256:6af0a0b4137c0903794632f77b7223c4af0373f5cd3337056d2dab32aa3a5caf"}, - {file = "pre_commit-3.0.0.tar.gz", hash = "sha256:de265f74325f0c3ff1a727a974449315ea9b11975cf6b02c11f26e50acfa48f1"}, + {file = "pre_commit-3.3.2-py2.py3-none-any.whl", hash = "sha256:8056bc52181efadf4aac792b1f4f255dfd2fb5a350ded7335d251a68561e8cb6"}, + {file = "pre_commit-3.3.2.tar.gz", hash = "sha256:66e37bec2d882de1f17f88075047ef8962581f83c234ac08da21a0c58953d1f0"}, ] [package.dependencies] @@ -873,16 +862,16 @@ tests = ["pytest", "pytest-cov", "pytest-lazy-fixture"] [[package]] name = "pydriller" -version = "2.4" +version = "2.5" description = "Framework for MSR" optional = false python-versions = ">=3.5" files = [ - {file = "PyDriller-2.4-py3-none-any.whl", hash = "sha256:2663dff95cd592cabdc624c49a407ca3ef0f83fb81d6023f2271418c521faea7"}, + {file = "PyDriller-2.5-py3-none-any.whl", hash = "sha256:514bbd6492f9e697542b385a528f0d16266ca6178db0d5123989396aef3ed8e8"}, ] [package.dependencies] -gitpython = "*" +gitpython = "3.1.30" lizard = "*" pytz = "*" types-pytz = "*" @@ -963,17 +952,16 @@ jsonld = ["rdflib-jsonld (>=0.4.0,<0.6)"] [[package]] name = "pytest" -version = "7.2.1" +version = "7.3.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, - {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -982,7 +970,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "python-dotenv" @@ -1000,13 +988,13 @@ cli = ["click (>=5.0)"] [[package]] name = "pytz" -version = "2022.7.1" +version = "2023.3" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, - {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] [[package]] @@ -1060,27 +1048,24 @@ files = [ [[package]] name = "rdflib" -version = "6.2.0" +version = "6.3.2" description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." optional = false -python-versions = ">=3.7" +python-versions = ">=3.7,<4.0" files = [ - {file = "rdflib-6.2.0-py3-none-any.whl", hash = "sha256:85c34a86dfc517a41e5f2425a41a0aceacc23983462b32e68610b9fad1383bca"}, - {file = "rdflib-6.2.0.tar.gz", hash = "sha256:62dc3c86d1712db0f55785baf8047f63731fa59b2682be03219cb89262065942"}, + {file = "rdflib-6.3.2-py3-none-any.whl", hash = "sha256:36b4e74a32aa1e4fa7b8719876fb192f19ecd45ff932ea5ebbd2e417a0247e63"}, + {file = "rdflib-6.3.2.tar.gz", hash = "sha256:72af591ff704f4caacea7ecc0c5a9056b8553e0489dd4f35a9bc52dbd41522e0"}, ] [package.dependencies] -isodate = "*" -pyparsing = "*" -setuptools = "*" +isodate = ">=0.6.0,<0.7.0" +pyparsing = ">=2.1.0,<4" [package.extras] -berkeleydb = ["berkeleydb"] -dev = ["black (==22.6.0)", "flake8", "flakeheaven", "isort", "mypy", "pep8-naming", "types-setuptools"] -docs = ["myst-parser", "sphinx (<6)", "sphinx-autodoc-typehints", "sphinxcontrib-apidoc", "sphinxcontrib-kroki"] -html = ["html5lib"] -networkx = ["networkx"] -tests = ["html5lib", "pytest", "pytest-cov"] +berkeleydb = ["berkeleydb (>=18.1.0,<19.0.0)"] +html = ["html5lib (>=1.0,<2.0)"] +lxml = ["lxml (>=4.3.0,<5.0.0)"] +networkx = ["networkx (>=2.0.0,<3.0.0)"] [[package]] name = "recommonmark" @@ -1100,20 +1085,20 @@ sphinx = ">=1.3.1" [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -1121,18 +1106,18 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" -version = "66.1.1" +version = "67.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-66.1.1-py3-none-any.whl", hash = "sha256:6f590d76b713d5de4e49fe4fbca24474469f53c83632d5d0fd056f7ff7e8112b"}, - {file = "setuptools-66.1.1.tar.gz", hash = "sha256:ac4008d396bc9cd983ea483cb7139c0240a07bbc74ffb6232fceffedc6cf03a8"}, + {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, + {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -1181,20 +1166,20 @@ files = [ [[package]] name = "sphinx" -version = "7.0.1" +version = "6.2.1" description = "Python documentation generator" optional = false python-versions = ">=3.8" files = [ - {file = "Sphinx-7.0.1.tar.gz", hash = "sha256:61e025f788c5977d9412587e733733a289e2b9fdc2fef8868ddfbfc4ccfe881d"}, - {file = "sphinx-7.0.1-py3-none-any.whl", hash = "sha256:60c5e04756c1709a98845ed27a2eed7a556af3993afb66e77fec48189f742616"}, + {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, + {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.21" +docutils = ">=0.18.1,<0.20" imagesize = ">=1.3" importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" @@ -1248,6 +1233,29 @@ sphinx = ">=1.8" code-style = ["pre-commit (==2.12.1)"] rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] +[[package]] +name = "sphinx-design" +version = "0.4.1" +description = "A sphinx extension for designing beautiful, view size responsive web components." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx_design-0.4.1-py3-none-any.whl", hash = "sha256:23bf5705eb31296d4451f68b0222a698a8a84396ffe8378dfd9319ba7ab8efd9"}, + {file = "sphinx_design-0.4.1.tar.gz", hash = "sha256:5b6418ba4a2dc3d83592ea0ff61a52a891fe72195a4c3a18b2fa1c7668ce4708"}, +] + +[package.dependencies] +sphinx = ">=4,<7" + +[package.extras] +code-style = ["pre-commit (>=2.12,<3.0)"] +rtd = ["myst-parser (>=0.18.0,<2)"] +testing = ["myst-parser (>=0.18.0,<2)", "pytest (>=7.1,<8.0)", "pytest-cov", "pytest-regressions"] +theme-furo = ["furo (>=2022.06.04,<2022.07)"] +theme-pydata = ["pydata-sphinx-theme (>=0.9.0,<0.10.0)"] +theme-rtd = ["sphinx-rtd-theme (>=1.0,<2.0)"] +theme-sbt = ["sphinx-book-theme (>=0.3.0,<0.4.0)"] + [[package]] name = "sphinx-tabs" version = "3.4.1" @@ -1406,61 +1414,62 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6. [[package]] name = "types-pytz" -version = "2022.7.1.0" +version = "2023.3.0.0" description = "Typing stubs for pytz" optional = false python-versions = "*" files = [ - {file = "types-pytz-2022.7.1.0.tar.gz", hash = "sha256:918f9c3e7a950ba7e7d6f84b18a7cacabc8886cb7125fb1927ff1c752b4b59de"}, - {file = "types_pytz-2022.7.1.0-py3-none-any.whl", hash = "sha256:10ec7d009a02340f1cecd654ac03f0c29b6088a03b63d164401fc52df45936b2"}, + {file = "types-pytz-2023.3.0.0.tar.gz", hash = "sha256:ecdc70d543aaf3616a7e48631543a884f74205f284cefd6649ddf44c6a820aac"}, + {file = "types_pytz-2023.3.0.0-py3-none-any.whl", hash = "sha256:4fc2a7fbbc315f0b6630e0b899fd6c743705abe1094d007b0e612d10da15e0f3"}, ] [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.6.3" description = "Backported and Experimental Type Hints for Python 3.7+" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, + {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, ] [[package]] name = "urllib3" -version = "1.26.14" +version = "2.0.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, - {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.17.1" +version = "20.23.0" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "virtualenv-20.17.1-py3-none-any.whl", hash = "sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4"}, - {file = "virtualenv-20.17.1.tar.gz", hash = "sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058"}, + {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, + {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, ] [package.dependencies] distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<3" +filelock = ">=3.11,<4" +platformdirs = ">=3.2,<4" [package.extras] -docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] -testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] [[package]] name = "wcwidth" @@ -1502,4 +1511,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "faf0482b5fc736db79e3c81132d777d88826f82eb8e8fee8611cc109d933ec93" +content-hash = "0be68815f9dc817de61caf7aa182174a306251d6b9b5f61e598306f68b2f37a8" diff --git a/pyproject.toml b/pyproject.toml index 4e87527f..1faa691b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,12 +40,13 @@ black = "^22.10.0" [tool.poetry.group.doc.dependencies] -sphinx = "^7.0.1" +sphinx = "<7.0.0" recommonmark = "^0.7.1" sphinx-click = "^4.4.0" sphinx-tabs = "^3.4.1" sphinxawesome-theme = "^4.1.0" sphinx-copybutton = "^0.5.2" +sphinx-design = "^0.4.1" [build-system] requires = ["poetry-core"] From adeca92408b311fa6a6237f24ad72c6460bb0894 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 01:43:47 +0200 Subject: [PATCH 33/43] doc: add changelog and configure git-cliff --- CHANGELOG.md | 41 +++++++++++++ Makefile | 4 ++ docs/changelog_link.md | 2 + docs/index.rst | 6 ++ poetry.lock | 132 +++++++++++++++++++++++++---------------- pyproject.toml | 51 +++++++++++++++- 6 files changed, 183 insertions(+), 53 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 docs/changelog_link.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..dd8a12fc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,41 @@ +Notable changes introduced in gimie releases are documented in this file + +# Changelog + +## [0.3.0] - 2023-02-24 + +### Bug Fixes +- Rename GITHUB_TOKEN to ACCESS_TOKEN +- Change token back to ACCESS_TOKEN since GITHUB_TOKEN failed +- GITHUB_TOKEN must be prefixed with github as environment variable +- Set test workflow back to using ACCESS_TOKEN as a repo secret +- Add .dockerignore, copy necessary files only and improve comments +- Rename container-publish.yml into docker-publish.yml +- 'building docker image' instead of 'building docker container' + + +### Documentation +- Readme badges (#25) +- Add section to the readme on how to provide a github token +- Adapt documentation to usage of ACCESS_TOKEN instead of GITHUB_TOKEN +- Adapt readme to installation with makefile +- Give options to install either PyPI or dev version of gimie +- Add message for docker-build Makefile rule +- Add image annotations to dockerfile +- Add docker instructions in readme + + +### Features +- Initial architecture with GithubExtractor (#23) +- Add python-dotenv to dependecies +- Pick up github token from the environment variables +- Add `.env.dist` file as an example for a `.env` file +- Provide option to provide github_token when calling extractor +- Add pre-commit to dependencies +- Add makefile to make installation easier +- Add Dockerfile and entrypoint.sh +- Add Makefile rule to build the docker image +- Add github workflow to push image to github container registry + + + diff --git a/Makefile b/Makefile index 8b4da83f..573af844 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,10 @@ test: ## Test the code with pytest @echo "🚀 Testing code: Running pytest" @poetry run pytest +.PHONY: changelog +changelog: ## Generate the changelog + @git-cliff -l -c pyproject.toml || echo "git-cliff must be installed" + .PHONY: help help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' diff --git a/docs/changelog_link.md b/docs/changelog_link.md new file mode 100644 index 00000000..66efc0fe --- /dev/null +++ b/docs/changelog_link.md @@ -0,0 +1,2 @@ +```{include} ../CHANGELOG.md +``` diff --git a/docs/index.rst b/docs/index.rst index 5eb980fc..11fd9e7d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,6 +15,11 @@ gimie (Git Meta Information Extractor) is a python library and command line tool :maxdepth: 2 :caption: Contents: +.. toctree:: + :maxdepth: 2 + + changelog_link + Introduction ============ @@ -45,6 +50,7 @@ CLI Reference cli + Indices and tables ================== diff --git a/poetry.lock b/poetry.lock index 027eb549..0b98f968 100644 --- a/poetry.lock +++ b/poetry.lock @@ -240,20 +240,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "commonmark" -version = "0.9.1" -description = "Python parser for the CommonMark Markdown spec" -optional = false -python-versions = "*" -files = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] - -[package.extras] -test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] - [[package]] name = "distlib" version = "0.3.6" @@ -655,6 +641,30 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.7)"] +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.3" @@ -734,6 +744,36 @@ docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sp lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] +[[package]] +name = "mdit-py-plugins" +version = "0.3.5" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, + {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -745,6 +785,32 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "myst-parser" +version = "1.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +optional = false +python-versions = ">=3.7" +files = [ + {file = "myst-parser-1.0.0.tar.gz", hash = "sha256:502845659313099542bd38a2ae62f01360e7dd4b1310f025dd014dfc0439cdae"}, + {file = "myst_parser-1.0.0-py3-none-any.whl", hash = "sha256:69fb40a586c6fa68995e6521ac0a525793935db7e724ca9bac1d33be51be9a4c"}, +] + +[package.dependencies] +docutils = ">=0.15,<0.20" +jinja2 = "*" +markdown-it-py = ">=1.0.0,<3.0.0" +mdit-py-plugins = ">=0.3.4,<0.4.0" +pyyaml = "*" +sphinx = ">=5,<7" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.7.5,<0.8.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] + [[package]] name = "nodeenv" version = "1.8.0" @@ -1067,22 +1133,6 @@ html = ["html5lib (>=1.0,<2.0)"] lxml = ["lxml (>=4.3.0,<5.0.0)"] networkx = ["networkx (>=2.0.0,<3.0.0)"] -[[package]] -name = "recommonmark" -version = "0.7.1" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." -optional = false -python-versions = "*" -files = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] - -[package.dependencies] -commonmark = ">=0.8.1" -docutils = ">=0.11" -sphinx = ">=1.3.1" - [[package]] name = "requests" version = "2.31.0" @@ -1256,26 +1306,6 @@ theme-pydata = ["pydata-sphinx-theme (>=0.9.0,<0.10.0)"] theme-rtd = ["sphinx-rtd-theme (>=1.0,<2.0)"] theme-sbt = ["sphinx-book-theme (>=0.3.0,<0.4.0)"] -[[package]] -name = "sphinx-tabs" -version = "3.4.1" -description = "Tabbed views for Sphinx" -optional = false -python-versions = "~=3.7" -files = [ - {file = "sphinx-tabs-3.4.1.tar.gz", hash = "sha256:d2a09f9e8316e400d57503f6df1c78005fdde220e5af589cc79d493159e1b832"}, - {file = "sphinx_tabs-3.4.1-py3-none-any.whl", hash = "sha256:7cea8942aeccc5d01a995789c01804b787334b55927f29b36ba16ed1e7cb27c6"}, -] - -[package.dependencies] -docutils = ">=0.18.0,<0.19.0" -pygments = "*" -sphinx = "*" - -[package.extras] -code-style = ["pre-commit (==2.13.0)"] -testing = ["bs4", "coverage", "pygments", "pytest (>=7.1,<8)", "pytest-cov", "pytest-regressions", "rinohtype", "sphinx-testing"] - [[package]] name = "sphinxawesome-theme" version = "4.1.0" @@ -1511,4 +1541,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "0be68815f9dc817de61caf7aa182174a306251d6b9b5f61e598306f68b2f37a8" +content-hash = "9b2cdf8b1c54912eb0291b2eafae33d39b4c84bcff4638cb757f065140737df8" diff --git a/pyproject.toml b/pyproject.toml index 1faa691b..1dd8584b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,12 +41,11 @@ black = "^22.10.0" [tool.poetry.group.doc.dependencies] sphinx = "<7.0.0" -recommonmark = "^0.7.1" sphinx-click = "^4.4.0" -sphinx-tabs = "^3.4.1" sphinxawesome-theme = "^4.1.0" sphinx-copybutton = "^0.5.2" sphinx-design = "^0.4.1" +myst-parser = "^1.0.0" [build-system] requires = ["poetry-core"] @@ -69,3 +68,51 @@ testpaths = ["gimie", "tests"] [tool.pyright] reportMissingTypeStubs = false reportUntypedBaseClass = false + +[tool.git-cliff.changelog] +header = "Notable changes introduced in gimie releases are documented in this file\n\n" +body = """ +# Changelog + +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | upper_first }} + {% for commit in commits + | filter(attribute="scope") + | sort(attribute="scope") %} + - *({{commit.scope}})* {{ commit.message | upper_first }} + {%- if commit.breaking %} + {% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}} + {%- endif -%} + {%- endfor -%} + {%- for commit in commits %} + {%- if commit.scope -%} + {% else -%} + - {{ commit.message | upper_first }} + {% if commit.breaking -%} + {% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}} + {% endif -%} + {% endif -%} + {% endfor -%} + {% raw %}\n{% endraw %}\ +{% endfor %}\n +""" +footer = "" + +[tool.git-cliff.git] +conventional_commits = true +filter_commits = true +commit_parsers = [ + {message = "^feat", group = "Features"}, + {message = "^fix", group = "Bug Fixes"}, + {message = "^doc", group = "Documentation"}, +] + +commit_preprocessors = [ + {pattern = 'Merged PR #[0-9]: (.*)', replace = "$1"}, + {pattern = " +", replace = " "}, +] From bbd615009a23fb263f53220168adad2c1a3edfd3 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 01:44:24 +0200 Subject: [PATCH 34/43] doc: replace deprecated commonmark parser with myst --- docs/conf.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 9ccac1f8..b84d6f5d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -27,13 +27,18 @@ "sphinx.ext.githubpages", "sphinx.ext.autosectionlabel", "sphinx_click", - "sphinx_tabs.tabs", "sphinx_copybutton", "sphinx_design", + "myst_parser", ] templates_path = ["_templates"] -source_suffix = [".rst", ".md"] + +source_suffix = { + ".rst": "restructuredtext", + ".md": "markdown", +} + exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] @@ -54,5 +59,3 @@ "rdflib": ("https://rdflib.readthedocs.io/en/stable/", None), "calamus": ("https://calamus.readthedocs.io/en/latest/", None), } - -source_parsers = {".md": "recommonmark.parser.CommonMarkParser"} From 19efc3f934ffd525d4e373cf8317303118974119 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 02:12:01 +0200 Subject: [PATCH 35/43] doc: enable placeholder highlighting extension --- docs/conf.py | 1 + docs/index.rst | 9 +++++---- docs/intro/quickstart.rst | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index b84d6f5d..495afe06 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,6 +30,7 @@ "sphinx_copybutton", "sphinx_design", "myst_parser", + "sphinxawesome_theme.highlighting", ] templates_path = ["_templates"] diff --git a/docs/index.rst b/docs/index.rst index 11fd9e7d..37993e72 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,10 +15,6 @@ gimie (Git Meta Information Extractor) is a python library and command line tool :maxdepth: 2 :caption: Contents: -.. toctree:: - :maxdepth: 2 - - changelog_link Introduction ============ @@ -57,3 +53,8 @@ Indices and tables * :ref:`genindex` * :ref:`modindex` * :ref:`search` + +.. toctree:: + :maxdepth: 2 + + changelog_link diff --git a/docs/intro/quickstart.rst b/docs/intro/quickstart.rst index 478d44ff..94683cd7 100644 --- a/docs/intro/quickstart.rst +++ b/docs/intro/quickstart.rst @@ -37,6 +37,7 @@ Gimie can then be used as follows to extract repository metadata: :selected: .. code-block:: console + :emphasize-text: gimie data > output.ttl @@ -44,6 +45,7 @@ Gimie can then be used as follows to extract repository metadata: :sync: docker .. code-block:: console + :emphasize-text: docker run -e GITHUB_TOKEN=${GITHUB_TOKEN} ghcr.io/sdsc-ord/gimie:latest data > output.ttl From 7a8b06ca769c039cc0b0ab303d603fcb37632f44 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 08:41:27 +0200 Subject: [PATCH 36/43] fix: prevent license finder from picking up docs files --- gimie/sources/common/license.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gimie/sources/common/license.py b/gimie/sources/common/license.py index e354181a..c84e7c5b 100644 --- a/gimie/sources/common/license.py +++ b/gimie/sources/common/license.py @@ -5,7 +5,7 @@ from gimie.graph.namespaces import GIMIE -def locate_licenses(path: str) -> List[str]: +def locate_licenses(path: str, recurse: bool = False) -> List[str]: """Returns valid potential paths to license files in the project. This uses pattern-matching on file names. @@ -13,6 +13,8 @@ def locate_licenses(path: str) -> List[str]: ---------- path: The root path to search for license files. + recurse: + Whether to look into subdirectories. Returns ------- @@ -27,6 +29,7 @@ def locate_licenses(path: str) -> List[str]: """ license_files = [] pattern = r".*(license(s)?|reus(e|ing)|copy(ing)?)(\.(txt|md|rst))?$" + for root, _, files in os.walk(path): # skip toplevel hidden dirs (e.g. .git/) subdir = os.path.relpath(root, path) @@ -41,6 +44,10 @@ def locate_licenses(path: str) -> List[str]: license_path = os.path.join(root, file) license_files.append(license_path) + # The first root of os.walk is the current dir + if not recurse: + return license_files + return license_files From 851e03312eecced69640b54b124ae16feb4fe2ae Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 08:42:54 +0200 Subject: [PATCH 37/43] refactor: gimie.model.IRI -> calamus.fields.IRI, bump calamus version --- gimie/models.py | 23 +---------------------- gimie/sources/github.py | 5 ++--- gimie/sources/gitlab.py | 3 +-- poetry.lock | 2 +- pyproject.toml | 2 +- 5 files changed, 6 insertions(+), 29 deletions(-) diff --git a/gimie/models.py b/gimie/models.py index d79bfcbf..4a2abb65 100644 --- a/gimie/models.py +++ b/gimie/models.py @@ -26,27 +26,6 @@ from gimie.graph.namespaces import SDO -class IRI(fields.String): - """An external IRI reference. - NOTE: This is a temporary solution until calamus correctly serializes IRI fields.""" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def _serialize(self, value, attr, obj, **kwargs): - if self.parent.opts.add_value_types or self.add_value_types: - return {"@id": value} - - value = super()._serialize(value, attr, obj, **kwargs) - if value: - return {"@id": value} - - def _deserialize(self, value, attr, data, **kwargs): - if "@id" in value: - value = value["@id"] - return super()._deserialize(value, attr, data, **kwargs) - - @dataclass(order=True) class Release: """ @@ -85,7 +64,7 @@ class OrganizationSchema(JsonLDSchema): legal_name = fields.String(SDO.legalName) email = fields.String(SDO.email) description = fields.String(SDO.description) - logo = IRI(SDO.logo) + logo = fields.IRI(SDO.logo) class Meta: rdf_type = SDO.Organization diff --git a/gimie/sources/github.py b/gimie/sources/github.py index bae23502..8ae15962 100644 --- a/gimie/sources/github.py +++ b/gimie/sources/github.py @@ -34,7 +34,6 @@ OrganizationSchema, Person, PersonSchema, - IRI, ) from gimie.graph.namespaces import SDO from gimie.sources.common.license import get_spdx_url @@ -294,8 +293,8 @@ class GithubExtractorSchema(JsonLDSchema): description = fields.String(SDO.description) date_created = fields.Date(SDO.dateCreated) date_modified = fields.Date(SDO.dateModified) - license = IRI(SDO.license) - path = IRI(SDO.CodeRepository) + license = fields.IRI(SDO.license) + path = fields.IRI(SDO.CodeRepository) keywords = fields.List(SDO.keywords, fields.String) version = fields.String(SDO.version) diff --git a/gimie/sources/gitlab.py b/gimie/sources/gitlab.py index 625cec84..417d168c 100644 --- a/gimie/sources/gitlab.py +++ b/gimie/sources/gitlab.py @@ -17,7 +17,6 @@ OrganizationSchema, Person, PersonSchema, - IRI, ) from gimie.graph.namespaces import SDO from gimie.sources.common.queries import send_graphql_query, send_rest_query @@ -292,7 +291,7 @@ class GitlabExtractorSchema(JsonLDSchema): date_created = fields.Date(SDO.dateCreated) date_modified = fields.Date(SDO.dateModified) # license = IRI(SDO.license) - path = IRI(SDO.CodeRepository) + path = fields.IRI(SDO.CodeRepository) keywords = fields.List(SDO.keywords, fields.String) version = fields.String(SDO.version) diff --git a/poetry.lock b/poetry.lock index 0b98f968..cf1f5dd0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1541,4 +1541,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "9b2cdf8b1c54912eb0291b2eafae33d39b4c84bcff4638cb757f065140737df8" +content-hash = "40b97ec9d5dcc870ac7df12be12c609473f6f1c1c2bb2ab79e5935d458dc7ef1" diff --git a/pyproject.toml b/pyproject.toml index 1dd8584b..7435107b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ pyshacl = "^0.20.0" # temporarily disabled due to installation problems # scancode-toolkit = "^31.2.4" typer = "^0.7.0" -calamus = "^0.4.1" +calamus = "^0.4.2" requests = "^2.28.2" python-dotenv = "^0.21.1" pre-commit = "^3.0.0" From 35bb10a1c02786532e87fbe44ba932a316ead770 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 17:49:55 +0200 Subject: [PATCH 38/43] doc: improve index format --- CHANGELOG.md | 2 -- docs/index.rst | 54 +++++++++++++------------------------------------- 2 files changed, 14 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd8a12fc..ba30f9a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,5 @@ Notable changes introduced in gimie releases are documented in this file -# Changelog - ## [0.3.0] - 2023-02-24 ### Bug Fixes diff --git a/docs/index.rst b/docs/index.rst index 37993e72..a3c84524 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,50 +11,24 @@ gimie (Git Meta Information Extractor) is a python library and command line tool Visit gimie's GitHub repository to follow the latest developments! -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - -Introduction -============ - -.. toctree:: - :maxdepth: 3 - - intro/quickstart - intro/linked_data - intro/git - intro/tokens - intro/usage_python - - -API Reference -============= .. toctree:: - :maxdepth: 2 - - api/modules - + :maxdepth: 2 + :caption: Background -CLI Reference -============= + Linked data - What is it and why do we use it? + Git repositories - Where code lives + Access tokens - Authenticate gimie on your behalf .. toctree:: - :maxdepth: 2 - - cli - + :maxdepth: 1 + :caption: Documentation -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - -.. toctree:: - :maxdepth: 2 + intro/quickstart + intro/usage_python + API Documentation + CLI Documentation - changelog_link +.. toctree:: changelog_link + :maxdepth: 1 + :caption: Changelog From e3cd424bf39868afc6741fccf5ec49516058137e Mon Sep 17 00:00:00 2001 From: cmdoret Date: Thu, 8 Jun 2023 18:01:23 +0200 Subject: [PATCH 39/43] doc: add windows variant for env var --- docs/intro/tokens.rst | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/intro/tokens.rst b/docs/intro/tokens.rst index 732642d1..0a23f703 100644 --- a/docs/intro/tokens.rst +++ b/docs/intro/tokens.rst @@ -7,10 +7,26 @@ Generating tokens can usually be done via the web interface of the service provi 1. Set the corresponding Environment variable. The token will only be accessible for the current session: -.. code-block:: - export GITLAB_TOKEN= - export GITHUB_TOKEN= +.. tab-set:: + + .. tab-item:: Linux/Mac/BSD + :selected: + + .. code-block:: console + :emphasize-text: + + export GITLAB_TOKEN= + export GITHUB_TOKEN= + + .. tab-item:: Windows + + .. code-block:: console + :emphasize-text: + + set GITLAB_TOKEN= + set GITHUB_TOKEN= + 2. Use a ``.env`` file in the current directory. Gimie will look for a file named ``.env`` and source it. The file contents should be as follows: From c3222e275d4c9ca1717f988dc16250ca81a53f2a Mon Sep 17 00:00:00 2001 From: cmdoret Date: Fri, 9 Jun 2023 11:28:22 +0200 Subject: [PATCH 40/43] doc(tokens): Add tutorial for encrypted tokens --- docs/intro/tokens.rst | 57 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/docs/intro/tokens.rst b/docs/intro/tokens.rst index 0a23f703..ff6595ff 100644 --- a/docs/intro/tokens.rst +++ b/docs/intro/tokens.rst @@ -24,18 +24,63 @@ Generating tokens can usually be done via the web interface of the service provi .. code-block:: console :emphasize-text: - set GITLAB_TOKEN= - set GITHUB_TOKEN= + # You may need to restart windows after this + setx GITLAB_TOKEN + setx GITHUB_TOKEN 2. Use a ``.env`` file in the current directory. Gimie will look for a file named ``.env`` and source it. The file contents should be as follows: .. code-block:: - GITLAB_TOKEN= - GITHUB_TOKEN= - + GITLAB_TOKEN= + GITHUB_TOKEN= .. tip:: - While the latter approach can be convenient to persist your token locally, it is generally not recommended to store your tokens in plain text as they are sensitive information. Hence the first approach should be preferred in most cases. + To persist (unencrypted) tokens on windows, you can also use `setx` command instead of `set`. + + +While the latter approach can be convenient to persist your token locally, it is generally not recommended to store your tokens in plain text as they are sensitive information. Hence the first approach should be preferred in most cases. + +Encrypting tokens +================= + +If you are serious about security, you should use a tool like `sops `_ or `pass `_ to encrypt your secrets. + +Below is a quick guide on how to use ``sops`` to store encrypted tokens, and decrypt them on the file when using gimie. + +.. dropdown:: Generating PGP key + + PGP is a public key encryption system. If you don't already have one, you will need to generate a key pair to encrypt your secrets. + You can use the following command to generate a key pair. You will be prompted for a passphrase, but you may leave it empty if you wish. + + .. code-block:: bash + + gpg --gen-key + +.. dropdown:: Set up SOPS + + SOPS needs to be configured to use your PGP key. You can do so by running the following command: + Replace ```` with the fingerprint of your PGP key (it looks like ``69AB B75E ...``). You can find it by running ``gpg --fingerprint`` + Upon running the command below, `sops` will open a `vim` buffer where you can enter the desired content of your .env file. + Upon saving the file (``:wq``), ``sops`` will encrypt the file and save it as ``.enc.env``. + + .. code-block:: bash + + sops --pgp "${FINGERPRINT}" .enc.env + +.. dropdown:: Source tokens + + Whenever you want to run gimie, you can decrypt secrets on the fly and pass them to gimie using the following command: + + .. code-block:: bash + :emphasize-text: + + sops exec-env .enc.env 'gimie data ' + + Or if you just want to inspect the decrypted file: + + .. code-block:: bash + + sops --decrypt .enc.env From 1875b1582c28dc63d9e1ad865696f086677f48c9 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Fri, 9 Jun 2023 11:34:45 +0200 Subject: [PATCH 41/43] doc(tokens): fix windows instructions --- docs/intro/tokens.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/intro/tokens.rst b/docs/intro/tokens.rst index ff6595ff..0594ce6d 100644 --- a/docs/intro/tokens.rst +++ b/docs/intro/tokens.rst @@ -32,14 +32,12 @@ Generating tokens can usually be done via the web interface of the service provi 2. Use a ``.env`` file in the current directory. Gimie will look for a file named ``.env`` and source it. The file contents should be as follows: .. code-block:: + :emphasize-text: + :caption: File: .env GITLAB_TOKEN= GITHUB_TOKEN= -.. tip:: - - To persist (unencrypted) tokens on windows, you can also use `setx` command instead of `set`. - While the latter approach can be convenient to persist your token locally, it is generally not recommended to store your tokens in plain text as they are sensitive information. Hence the first approach should be preferred in most cases. From 5adef52b883a403e7cdf485db236ada4f4cabf95 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Fri, 9 Jun 2023 14:33:43 +0200 Subject: [PATCH 42/43] doc(style): add logo + favicon --- docs/conf.py | 2 + docs/gimie_favicon.ico | Bin 0 -> 4286 bytes docs/gimie_logo.svg | 104 +++++++++++++++++++++++++++++++++++++++++ docs/index.rst | 2 +- docs/intro/tokens.rst | 2 +- 5 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 docs/gimie_favicon.ico create mode 100644 docs/gimie_logo.svg diff --git a/docs/conf.py b/docs/conf.py index 495afe06..feb36a1c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -49,6 +49,8 @@ html_theme = "sphinxawesome_theme" html_static_path = ["_static"] +html_logo = "gimie_logo.svg" +html_favicon = "gimie_favicon.ico" # -- Extension configuration ------------------------------------------------- diff --git a/docs/gimie_favicon.ico b/docs/gimie_favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..33d26857b005e12e7a8d34f70d5b92a7e1d183f6 GIT binary patch literal 4286 zcmcha&ui2`6vtDmR8gr#@F2=o4^kBm;>Cm1qA2LuJ%|VOQuLy>J2Ty~Nji!k;;CNr zFDS)d6cHg!vb$RG2S`y=P()n>uWGB(BGU0Yo1`7rq(8DrQ{HCg&CL6}nR)Xj)wBlu zwYF;VR~uZTY3npiYlA?gbwH%P`k*b-=!vID_tzq1rNi@^i$-pj!@IYX_&Iox&hxmd zYlUO71CCA%*C4kYgMNgF8u^2I$u9KlN!klrr>ARJwQQwMepsByZA$EU-r2d#Hpu(= z`cTyA;l$v+A=jiw=gW5sxlGc0flzmJ`g$%OY=b^cnl0^l^Jl;2;$!aZN%E_)Z?OJ= z>l$<-DA&H>pg+JKO5L~402Q9;_R`}k$k=-Xpi%DOnUuao74H_jcxSoP;JV5hrYkP{^W(z+q+h6 zUub!lv-Q#z=C0%sDzF{{CC-L|CLW)R)N4O# zygX;N$+$mfA!8`Gub^WdpFM~gA4l&R>=f)GcawKm*U@RVL2s#hjF`^*ZKXJzurZF# zjwn3ke6fDc`4V-EtCNE4i+ylZeLZF5t-%of+c2A$zwY<7!`kEMBJ$duFk4`ok`F(u zu=Y4Q8P~8m?$1lE|D;`DyTfeF#3j2Q)*e@9>130%4Y}y>+_oq?xN|OeezJQ}ebUrd z{qydCyJ>QwY$NV3`TH~!)hA6o*q0?=erKe~iL#B{G*IQ6^cn8mrBVIT&?7gV!MRiN z6D{7zX7L|g`j6yb-s%~x`r(?nL+R5s?Ga^=;E& + + + + + + + + + + + + + + + gimie + + diff --git a/docs/index.rst b/docs/index.rst index a3c84524..d67f2161 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,7 +13,7 @@ gimie (Git Meta Information Extractor) is a python library and command line tool .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Background Linked data - What is it and why do we use it? diff --git a/docs/intro/tokens.rst b/docs/intro/tokens.rst index 0594ce6d..181c0cd9 100644 --- a/docs/intro/tokens.rst +++ b/docs/intro/tokens.rst @@ -46,7 +46,7 @@ Encrypting tokens If you are serious about security, you should use a tool like `sops `_ or `pass `_ to encrypt your secrets. -Below is a quick guide on how to use ``sops`` to store encrypted tokens, and decrypt them on the file when using gimie. +Below is a quick guide on how to use ``sops`` to store encrypted tokens, and decrypt them on the fly when using gimie. .. dropdown:: Generating PGP key From 2a7192953673a77df2f6a82c53a4b1d348102ad7 Mon Sep 17 00:00:00 2001 From: cmdoret Date: Fri, 9 Jun 2023 14:56:22 +0200 Subject: [PATCH 43/43] doc(style): add logo to front page --- docs/conf.py | 4 +- docs/{gimie_favicon.ico => favicon.ico} | Bin docs/index.rst | 5 ++ docs/{gimie_logo.svg => logo.svg} | 0 docs/logo_notext.svg | 94 ++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 2 deletions(-) rename docs/{gimie_favicon.ico => favicon.ico} (100%) rename docs/{gimie_logo.svg => logo.svg} (100%) create mode 100644 docs/logo_notext.svg diff --git a/docs/conf.py b/docs/conf.py index feb36a1c..5d9668ad 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -49,8 +49,8 @@ html_theme = "sphinxawesome_theme" html_static_path = ["_static"] -html_logo = "gimie_logo.svg" -html_favicon = "gimie_favicon.ico" +html_logo = "logo_notext.svg" +html_favicon = "favicon.ico" # -- Extension configuration ------------------------------------------------- diff --git a/docs/gimie_favicon.ico b/docs/favicon.ico similarity index 100% rename from docs/gimie_favicon.ico rename to docs/favicon.ico diff --git a/docs/index.rst b/docs/index.rst index d67f2161..86b44442 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,6 +3,11 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. +.. image:: logo.svg + :width: 200 + :alt: gimie logo + + Welcome to gimie's documentation! ================================= gimie (Git Meta Information Extractor) is a python library and command line tool to extract structured metadata from git repositories. diff --git a/docs/gimie_logo.svg b/docs/logo.svg similarity index 100% rename from docs/gimie_logo.svg rename to docs/logo.svg diff --git a/docs/logo_notext.svg b/docs/logo_notext.svg new file mode 100644 index 00000000..658cc974 --- /dev/null +++ b/docs/logo_notext.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + +