From 57ed94e6e928913e2af54d1662f3113e04ea7f47 Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Tue, 5 Apr 2022 20:21:15 +0200 Subject: [PATCH 1/8] Change metrics cli flag to x --- srcopsmetrics/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcopsmetrics/cli.py b/srcopsmetrics/cli.py index d1f24ee3..1d3d595a 100755 --- a/srcopsmetrics/cli.py +++ b/srcopsmetrics/cli.py @@ -125,7 +125,7 @@ def get_entities_as_list(entities_raw: Optional[str]) -> List[str]: ) @click.option( "--metrics", - "-m", + "-x", is_flag=True, required=False, help="""Launch Metrics Calculation for specified repository.""", From fa81d01d71716521f1b0974c8afad1a00785955a Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Tue, 5 Apr 2022 20:22:40 +0200 Subject: [PATCH 2/8] Change log level to info --- srcopsmetrics/entities/tools/storage.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/srcopsmetrics/entities/tools/storage.py b/srcopsmetrics/entities/tools/storage.py index ea84e016..d560cef3 100644 --- a/srcopsmetrics/entities/tools/storage.py +++ b/srcopsmetrics/entities/tools/storage.py @@ -128,7 +128,6 @@ def load_data(self, file_path: Optional[Path] = None, as_json: bool = False) -> else self.load_remotely(file_path, as_json=as_json) ) - _LOGGER.info("Data from file %s loaded") return results @staticmethod @@ -137,7 +136,7 @@ def load_locally(file_path: Path, as_json: bool = False) -> pd.DataFrame: _LOGGER.info("Loading knowledge locally") if not file_path.exists(): - _LOGGER.debug("Knowledge %s not found locally" % file_path) + _LOGGER.info("Knowledge %s not found locally" % file_path) return pd.DataFrame() if as_json: @@ -156,5 +155,5 @@ def load_remotely(self, file_path: Path, as_json: bool = False) -> pd.DataFrame: return data except NotFoundError: - _LOGGER.debug("Knowledge %s not found on Ceph" % ceph_filename) + _LOGGER.info("Knowledge %s not found on Ceph" % ceph_filename) return pd.DataFrame() From 0483715fc2bf4766be3a74edccdb0325a9a253d5 Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Wed, 6 Apr 2022 19:36:06 +0200 Subject: [PATCH 3/8] Update metrics parameter, remove unused imports --- srcopsmetrics/cli.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/srcopsmetrics/cli.py b/srcopsmetrics/cli.py index 1d3d595a..b8fb76b6 100755 --- a/srcopsmetrics/cli.py +++ b/srcopsmetrics/cli.py @@ -20,7 +20,6 @@ import logging import os from datetime import date, timedelta -from pathlib import Path from typing import List, Optional import click @@ -30,8 +29,6 @@ from srcopsmetrics.enums import EntityTypeEnum, StoragePath from srcopsmetrics.github_knowledge import GitHubKnowledge from srcopsmetrics.kebechet_metrics import KebechetMetrics -from srcopsmetrics.metrics import Metrics -from srcopsmetrics.storage import KnowledgeStorage _LOGGER = logging.getLogger("aicoe-src-ops-metrics") logging.basicConfig(level=logging.INFO) @@ -191,20 +188,21 @@ def cli( kebechet_metrics = KebechetMetrics(repository=repo, day=yesterday, is_local=is_local) kebechet_metrics.evaluate_and_store_kebechet_metrics() - if metrics: - repo_metrics = Metrics(repository=repos[0], visualize=visualize_statistics) + # TODO metrics class not working + # if metrics: + # repo_metrics = Metrics(repository=repos[0], visualize=visualize_statistics) - repo_metrics.get_metrics_outliers_pull_requests() - repo_metrics.get_metrics_outliers_issues() + # repo_metrics.get_metrics_outliers_pull_requests() + # repo_metrics.get_metrics_outliers_issues() - scores = repo_metrics.evaluate_scores_for_pull_requests() + # scores = repo_metrics.evaluate_scores_for_pull_requests() - path = Path(f"./srcopsmetrics/metrics/{repos[0]}/pr_scores.json") - KnowledgeStorage(is_local=is_local).save_knowledge(file_path=path, data=scores) + # path = Path(f"./srcopsmetrics/metrics/{repos[0]}/pr_scores.json") + # KnowledgeStorage(is_local=is_local).save_knowledge(file_path=path, data=scores) - scores_issues = repo_metrics.evaluate_scores_for_issues() - path = Path(f"./srcopsmetrics/metrics/{repos[0]}/issue_scores.json") - KnowledgeStorage(is_local=is_local).save_knowledge(file_path=path, data=scores_issues) + # scores_issues = repo_metrics.evaluate_scores_for_issues() + # path = Path(f"./srcopsmetrics/metrics/{repos[0]}/issue_scores.json") + # KnowledgeStorage(is_local=is_local).save_knowledge(file_path=path, data=scores_issues) if merge: if thoth: From e30cab3333469956180255ba3ac3911a1df6f0f9 Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Wed, 6 Apr 2022 19:37:28 +0200 Subject: [PATCH 4/8] Add update manager metrics aggregation --- srcopsmetrics/kebechet_metrics.py | 190 ++++++++++++++++++++++++++---- 1 file changed, 168 insertions(+), 22 deletions(-) diff --git a/srcopsmetrics/kebechet_metrics.py b/srcopsmetrics/kebechet_metrics.py index b4b83614..e7fa9435 100644 --- a/srcopsmetrics/kebechet_metrics.py +++ b/srcopsmetrics/kebechet_metrics.py @@ -26,11 +26,10 @@ import numpy as np import pandas as pd -from github import Github -from srcopsmetrics import utils from srcopsmetrics.entities.issue import Issue from srcopsmetrics.entities.pull_request import PullRequest +from srcopsmetrics.entities.thoth_advise_metrics import ThothAdviseMetrics from srcopsmetrics.entities.tools.storage import KnowledgeStorage from srcopsmetrics.storage import get_merge_path @@ -43,6 +42,28 @@ "initial_lock": "Initial dependency lock", } +VERSION_TYPES_AND_KEYWORDS = { + "calendar": "New calendar release", + "major": "New major release", + "minor": "New minor release", + "patch": "New patch release", + "pre-release": "New pre-release", + "build": "New build release", +} + +ADVISE_DATAFRAME_COLUMNS = [ + "metrics_type", + "metrics_day", + "created_pull_requests", + "median_ttm", + "merged", + "merged_by_kebechet_bot", + "merged_by_other", + "rejected", + "rejected_by_kebechet_bot", + "rejected_by_other", +] + _LOGGER = logging.getLogger(__name__) _GITHUB_ACCESS_TOKEN = os.getenv("GITHUB_ACCESS_TOKEN") @@ -59,16 +80,25 @@ def get_update_manager_request_type(title: str) -> Optional[str]: return None +def get_version_manager_request_type(title: str) -> Optional[str]: + """Get the type of the update request.""" + for request_type, keyword in UPDATE_TYPES_AND_KEYWORDS.items(): + if keyword in title: + return request_type + + return None + + class KebechetMetrics: """Kebechet Metrics inspected by MI.""" def __init__(self, repository: str, is_local: bool = False, day: Optional[date] = None): """Initialize with collected knowledge.""" - gh_repo = Github(login_or_token=_GITHUB_ACCESS_TOKEN, timeout=50).get_repo(repository) - self.repo_name = repository - self.prs = PullRequest(gh_repo).load_previous_knowledge(is_local=is_local) - self.issues = Issue(gh_repo).load_previous_knowledge(is_local=is_local) + + self.prs = PullRequest(repository_name=repository).load_previous_knowledge(is_local=is_local) + self.issues = Issue(repository_name=repository).load_previous_knowledge(is_local=is_local) + self.day = day self.is_local = is_local self.root_dir = get_merge_path() @@ -137,6 +167,25 @@ def _get_update_manager_pull_requests(self) -> pd.DataFrame: return requests.sort_values(by=["created_at"]).reset_index(drop=True) + def _get_advise_manager_pull_requests(self) -> pd.DataFrame: + + if self.prs.empty: + return pd.DataFrame() + + requests = self.prs.copy() + + requests["ttm"] = requests.merged_at.sub(requests.created_at) + requests["tta"] = requests.first_approve_at - requests.created_at + requests["ttfr"] = requests.created_at - requests.first_review_at + + not_merged = requests["merged_at"].isna() + closed_by_bot = requests.closed_by.isin(BOT_NAMES) + + requests["merged_by_kebechet_bot"] = requests.merged_by.isin(BOT_NAMES) + requests["rejected_by_kebechet_bot"] = not_merged & closed_by_bot + + return requests.sort_values(by=["created_at"]).reset_index(drop=True) + def get_overall_stats_update_manager(self) -> Dict[str, Any]: """Return stats over whole repository age.""" prs = self._get_update_manager_pull_requests() @@ -196,27 +245,12 @@ def get_daily_stats_update_manager(self) -> Dict[str, Any]: if self.day: median_time = prs[prs["days"] == self.day]["ttm"].median() day["median_ttm"] = median_time if not np.isnan(median_time) else 0 - return day + # return day stats[str(specific_date)] = day return stats - def evaluate_and_store_kebechet_metrics(self): - """Calculate and store metrics for every kebechet manager in repository.""" - for get_stats in [self.update_manager]: - stats = get_stats() - - path = Path(f"./{self.root_dir}/{self.repo_name}/") - utils.check_directory(path) - - file_name = f"kebechet_{get_stats.__name__}" - if self.day: - file_name += f"_{str(self.day)}" - file_name += ".json" - - KnowledgeStorage(is_local=self.is_local).save_data(file_path=path.joinpath(file_name), data=stats) - @staticmethod def merge_kebechet_metrics_per_day(day: date, is_local: bool = False): """Merge all the collected metrics under given parent directory.""" @@ -258,6 +292,102 @@ def update_manager(self): daily_stats = self.get_daily_stats_update_manager() return {"overall": overall_stats, "daily": daily_stats} + def fill_advise_metrics_overall(self): + """Return stats over whole repository age.""" + prs = self._get_advise_manager_pull_requests() + + if prs.empty: + return + + stats_id = f"{str(self.day)}_overall" + if stats_id in self.advise_metrics.index: + return + + stats: Dict[str, Any] = {"metrics_type": "overall", "metrics_day": str(self.day)} + stats["created_pull_requests"] = len(prs) + + stats["rejected"] = len(prs[np.isnan(prs["ttm"])]) + stats["rejected_by_kebechet_bot"] = len(prs[prs["rejected_by_kebechet_bot"] == 1]) + stats["rejected_by_other"] = stats["rejected"] - stats["rejected_by_kebechet_bot"] + + stats["merged"] = len(prs) - stats["rejected"] + stats["merged_by_kebechet_bot"] = len(prs[prs["merged_by_kebechet_bot"] == 1]) + stats["merged_by_other"] = stats["merged"] - stats["merged_by_kebechet_bot"] + + median_time = prs["ttm"].median() + stats["median_ttm"] = median_time.total_seconds() if not pd.isna(median_time) else 0 + + self.advise_metrics = pd.concat([self.advise_metrics, pd.DataFrame(stats, index=[stats_id])]) + + return + + def fill_advise_metrics_daily(self): + """Get daily stats. + + If self.day is set, return only stats for that day. + """ + prs = self._get_advise_manager_pull_requests() + + if prs.empty: + return + + prs["date"] = pd.to_datetime(prs.created_at).dt.date + + if self.day: + prs = prs[prs.date == self.day] + + for specific_date in prs.date.unique(): + stats_id = f"{specific_date}_daily" + + if stats_id in self.advise_metrics.index: + continue + + prs_day = prs[prs.date == specific_date] # TODO CHYBA treba porovnavat s pd.datetime + + day = {"metrics_type": "daily", "metrics_day": str(specific_date)} + + day["created_pull_requests"] = len(prs_day) + + day["rejected"] = prs_day.merged_at.isna().sum() + + day["rejected_by_kebechet_bot"] = prs_day.rejected_by_kebechet_bot.sum() + day["rejected_by_other"] = day["rejected"] - day["rejected_by_kebechet_bot"] + + day["merged"] = prs_day.merged_at.notna().sum() + day["merged_by_kebechet_bot"] = prs_day.merged_by_kebechet_bot.sum() + day["merged_by_other"] = day["merged"] - day["merged_by_kebechet_bot"] + + # TODO consider adding median_time to every day statistics (rolling windown maybe?) + + if self.day: + median_time = prs[prs.date == self.day]["ttm"].median() + day["median_ttm"] = median_time.total_seconds() if not pd.isnull(median_time) else 0 + self.advise_metrics = pd.concat([self.advise_metrics, pd.DataFrame(day, index=[stats_id])]) + + def advise_manager(self): + """Calculate and store version manager metrics.""" + self.advise_metrics_entity = ThothAdviseMetrics(self.repo_name, self.is_local) + self.advise_metrics = self.advise_metrics_entity.load_previous_knowledge() + + if self.advise_metrics.empty: + self.advise_metrics = pd.DataFrame(columns=ADVISE_DATAFRAME_COLUMNS) + + self.fill_advise_metrics_overall() + self.fill_advise_metrics_daily() + + self.advise_metrics_entity.stored_entities = self.advise_metrics + self.advise_metrics_entity.save_knowledge(from_dataframe=True, from_singleton=True) + + path = Path(f"./{self.root_dir}/{self.repo_name}/") + file_name = f"kebechet_advise_{str(self.day)}.json" + self.advise_metrics_entity.save_knowledge( + file_path=path.joinpath(file_name), + is_local=self.is_local, + as_csv=True, + from_dataframe=True, + from_singleton=True, + ) + def label_bot_manager(self): """Calculate and store label bot manager metrics.""" raise NotImplementedError @@ -273,3 +403,19 @@ def thoth_provenance(self): def pipfile_requirements(self): """Calculate and store pipfile requirements manager metrics.""" raise NotImplementedError + + def evaluate_and_store_kebechet_metrics(self): + """Calculate and store metrics for every kebechet manager in repository.""" + for get_stats in [ + self.advise_manager, + ]: + get_stats() + + # path = Path(f"./{self.root_dir}/{self.repo_name}/") + # utils.check_directory(path) + + # file_name = f"kebechet_{get_stats.__name__}_{str(self.day)}.json" + + # KnowledgeStorage(is_local=self.is_local).save_data( + # file_path=path.joinpath(file_name), data=stats.to_json() + # ) From 558a9d75120f893761c26e61a039584feff5d900 Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Wed, 6 Apr 2022 19:38:10 +0200 Subject: [PATCH 5/8] Add options for working with dataframe loading&saving --- srcopsmetrics/entities/tools/storage.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/srcopsmetrics/entities/tools/storage.py b/srcopsmetrics/entities/tools/storage.py index d560cef3..dab90d64 100644 --- a/srcopsmetrics/entities/tools/storage.py +++ b/srcopsmetrics/entities/tools/storage.py @@ -36,9 +36,14 @@ def load_data_frame(path_or_buf: Union[Path, Any]) -> pd.DataFrame: """Load DataFrame from either string data or path.""" - df = pd.read_json(path_or_buf, orient="records", lines=True) - if not df.empty: + df = pd.DataFrame() + + if isinstance(path_or_buf, dict): + df = pd.DataFrame.from_dict(path_or_buf, orient="index") + else: + df = pd.read_json(path_or_buf, orient="records", lines=True) df = df.set_index("id") + return df From 2929a7ac909f02fd4a98630abee33e9a549033bc Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Wed, 6 Apr 2022 19:38:47 +0200 Subject: [PATCH 6/8] Add options for working with dataframe loading&saving --- srcopsmetrics/entities/interface.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/srcopsmetrics/entities/interface.py b/srcopsmetrics/entities/interface.py index e11bcdc9..ef821603 100644 --- a/srcopsmetrics/entities/interface.py +++ b/srcopsmetrics/entities/interface.py @@ -29,7 +29,7 @@ from voluptuous.error import MultipleInvalid from voluptuous.schema_builder import Schema -from srcopsmetrics import github_handling, utils +from srcopsmetrics import utils from srcopsmetrics.entities.tools.storage import KnowledgeStorage from srcopsmetrics.enums import StoragePath @@ -55,8 +55,8 @@ def __init__(self, repository_name: Optional[str] = None, repository: Optional[R raise ValueError("Repository object or slug is required") self.repository = repository - if not repository: - self.repository = github_handling.connect_to_source(repository_name) + # if not repository: + # self.repository = github_handling.connect_to_source(repository_name) @classmethod def name(cls) -> str: @@ -113,7 +113,14 @@ def file_path(self) -> Path: appendix = ".json" # if as_csv else ".json" TODO implement as_csv bool return project_path.joinpath("./" + self.filename + appendix) - def save_knowledge(self, file_path: Path = None, is_local: bool = False, as_csv: bool = False): + def save_knowledge( + self, + file_path: Path = None, + is_local: bool = False, + as_csv: bool = False, + from_dataframe: bool = False, + from_singleton: bool = False, + ): """Save collected knowledge as json.""" if self.stored_entities is None or len(self.stored_entities) == 0: _LOGGER.info("Nothing to store.") @@ -129,8 +136,14 @@ def save_knowledge(self, file_path: Path = None, is_local: bool = False, as_csv: _LOGGER.warning("Data found to be inconsistent with its schema, original message:") _LOGGER.warning(str(e)) - new_data = pd.DataFrame.from_dict(self.stored_entities).T - to_save = pd.concat([new_data, self.previous_knowledge]) + if from_dataframe: + if from_singleton: + to_save = self.stored_entities + else: + raise NotImplementedError + else: + new_data = pd.DataFrame.from_dict(self.stored_entities).T + to_save = pd.concat([new_data, self.previous_knowledge]) _LOGGER.info("Knowledge file %s", (os.path.basename(file_path))) _LOGGER.info("new %d entities", len(self.stored_entities)) From 11b136a0f0f5709954b41751397cb5c39ddf8b0f Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Wed, 6 Apr 2022 20:02:02 +0200 Subject: [PATCH 7/8] Fix pre-commit to 2.15.0, autoupdate --- .pre-commit-config.yaml | 6 +- Pipfile | 2 +- Pipfile.lock | 395 ++++++++++++++++++++-------------------- 3 files changed, 203 insertions(+), 200 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 017f9c26..8ea2ee04 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ --- repos: - repo: https://github.com/Lucas-C/pre-commit-hooks - rev: v1.1.12 + rev: v1.1.13 hooks: - id: remove-tabs @@ -31,14 +31,14 @@ repos: - id: pydocstyle - repo: https://github.com/pre-commit/mirrors-mypy - rev: v0.931 + rev: v0.942 hooks: - id: mypy exclude: '^(docs|tasks|tests)|setup\.py' args: [--ignore-missing-imports, --no-strict-optional] - repo: https://github.com/psf/black - rev: 22.1.0 + rev: 22.3.0 hooks: - id: black args: ['--target-version', 'py38'] diff --git a/Pipfile b/Pipfile index 999a663a..f97c1e42 100644 --- a/Pipfile +++ b/Pipfile @@ -22,7 +22,7 @@ hypothesis-auto = "*" hypothesis = "*" pytest-mypy = "*" mypy = "*" -pre-commit = "*" +pre-commit = "==2.15.0" twine = "*" autopep8 = "*" rope = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 7b460d9e..8eb798ab 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "dd6db8e89b8c9311a3b43de4c4438f0bf85bd29200636b0fc0d031a279cefca4" + "sha256": "5d8430f3d4f72412caf143cae1bd096ef82b456f817c3ca1efa96fe2de6eccc5" }, "pipfile-spec": 6, "requires": { @@ -179,19 +179,19 @@ }, "boto3": { "hashes": [ - "sha256:39195734d887bf906629bda9248637f1715522da457a304aa83936b449dd3d8c", - "sha256:61375a673f3a293ea6f9d94c1b781c3bb19233093001a998a4e0bf7b3a67ae33" + "sha256:6cbc3aae70af5f35869d7b2f114cc953edf925231febf892d609682b2ba3f9f0", + "sha256:9d2175ad0f5de587473f20b062b1ef462d1e5ee547bb22bdd36e28442823e0a9" ], "markers": "python_version >= '3.6'", - "version": "==1.21.25" + "version": "==1.21.34" }, "botocore": { "hashes": [ - "sha256:6a28568e3922212a1c89622bc795a4ecba2ef3395ed17f8a26697bf648b7a95a", - "sha256:7f04738ca133e61f4e6cebfc0c7c09fe63bdf3087029cf9cc527b15b066f360c" + "sha256:4402900838fad0c46c78f16a497709039f10e945c6ef1f0df5d9a98c80f1563b", + "sha256:ec849864a6791c04ac6c52539dae34d53856cd32eb7e5481a3465aab7bd93555" ], "markers": "python_version >= '3.6'", - "version": "==1.24.25" + "version": "==1.24.34" }, "cachetools": { "hashes": [ @@ -273,11 +273,11 @@ }, "click": { "hashes": [ - "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", - "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb" + "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e", + "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72" ], - "markers": "python_version >= '3.6'", - "version": "==8.0.4" + "markers": "python_version >= '3.7'", + "version": "==8.1.2" }, "cycler": { "hashes": [ @@ -439,19 +439,19 @@ }, "importlib-resources": { "hashes": [ - "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45", - "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b" + "sha256:1b93238cbf23b4cde34240dd8321d99e9bf2eb4bc91c0c99b2886283e7baad85", + "sha256:a9dd72f6cc106aeb50f6e66b86b69b454766dd6e39b69ac68450253058706bcc" ], "markers": "python_version < '3.9'", - "version": "==5.4.0" + "version": "==5.6.0" }, "jinja2": { "hashes": [ - "sha256:a2f09a92f358b96b5f6ca6ecb4502669c4acb55d8733bbb2b2c9c4af5564c605", - "sha256:da424924c069a4013730d8dd010cbecac7e7bb752be388db3741688bffb48dc6" + "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119", + "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9" ], "markers": "python_version >= '3.7'", - "version": "==3.1.0" + "version": "==3.1.1" }, "jmespath": { "hashes": [ @@ -470,52 +470,52 @@ }, "kiwisolver": { "hashes": [ - "sha256:139c75216e5875ee5f8f4f7adcc3cd339f46f0d66bda2e10d8d21386d635476f", - "sha256:14f43edc25daa0646d4b4e86c2ebdd32d785ab73a65a570130a3d234a4554b07", - "sha256:17ec8bd4e162fd0a8723467395c5bb16fd665a528b78e9339886c82965ed8efb", - "sha256:199f32bf6f3d3e2246024326497513c5c49c62aecee86f0ac019f5991978d505", - "sha256:1cf8c81e8a5fb4f5dcbd473fdb619b895313d29b7c60e4545827dcc6efbd8efc", - "sha256:2467fe5fff6ed2a728e10dca9b1f37e9b911ca5b228a7d8990c8e3abf80c1724", - "sha256:313724e85fd14d581a939fa02424f4dc772fd914bc04499a8a6377d47313b966", - "sha256:334a7e3d498a0a791245f0964c746d0414e9b13aef73237f0d798a2101fdbae9", - "sha256:34e2e39a219b203fa3a82af5b9f8d386a8718677de7a9b82a9634e292a8f4e0a", - "sha256:384b5076b2c0172003abca9ba8b8c5efcaaffd31616f3f5e0a09dcc34772d012", - "sha256:3891527ec51b0365bb50de9bf826ce3d5b1adc276685b2779889762437bbd359", - "sha256:38ebc0cb30ed2f59bd15e23591a53698005123e90e880f1af4600fcdbe4912e1", - "sha256:4471a48f53d20d49f263ca888aab77b754525ef35e6767657e1a44a724a8b0af", - "sha256:4b70f0729947d6327cd659e1b3477ced44a317a4ba441238b2a3642990f0ebd7", - "sha256:576ba51b9f4e4d0d583c1cd257f53397bdc5e66a5e49fe68712f658426115777", - "sha256:5ca92de8e48678a2cbbd90adb10773e3553bb9fd1c090bf0dfe5fc3337a181ea", - "sha256:5ecf82bb25cec7df4bfcf37afe49f6f6202b4fa4029be7cb0848ed319c72d356", - "sha256:65cbdbe14dc5988e362eb15e02dd24c6724238cb235132f812f1e3a29a61a3de", - "sha256:676f9fac93f97f529dc80b5d6731099fad337549408e8bdd929343b7cb679797", - "sha256:6bf0080449d6ea39b817d85abd2c20d2d42fd9b1587544d64371d28d93c379cf", - "sha256:6c19457f58941da61681efaabd5b1c37893108a2f922b9b19538f6921911186d", - "sha256:70e7b7a4ebeddef423115ea31857732fc04e0f38dd1e6385e1af05b6164a3d0f", - "sha256:71d44a6a59ea53d41e5950a42ec496fa821bd86f292fb3e10aa1b3932ecfc65e", - "sha256:734e943ae519cdb8534d9053f478417c525ec921c06896ec7119e65d9ea4a687", - "sha256:7508b01e211178a85d21f1f87029846b77b2404a4c68cbd14748d4d4142fa3b8", - "sha256:87367ba1ad3819f7189fe8faff5f75a7603f526576033e7b86e10b598f8790b2", - "sha256:895b2df026006ff7434b03ca495983d0d26da96f6d58414c77d616747ee77e34", - "sha256:8cd1f81bc35ec24cb82a7d0b805521e3d71b25b8a493d5810d18dc29644c6ef8", - "sha256:8f63b981678ca894bb665bcd5043bde2c9ba600e69df730c1ceeadd73ddbcb8c", - "sha256:925a32900fc16430ba0dec2c0fca2e776eaf2fdc0930d5552be0a59e23304001", - "sha256:97372c837add54e3e64a811464b14bb01428c4e9256072b6296f04157ea23246", - "sha256:9b4d1db32a4f1682df1480fd68eb1400235ac8f9ad8932e1624fdb23eb891904", - "sha256:a0a6f3d5063e7fd6662e4773778ad2cb36e598abc6eb171af4a072ca86b441d0", - "sha256:af6a7c956a45ee721e4263f5823e1a3b2e6b21a7e2b3646b3794e000620609d0", - "sha256:b1ff5582bf55e85728119c5a23f695b8e408e15eee7d0f5effe0ee8ad1f8b523", - "sha256:bb997d1631b20745b18674d68dd6f1d9d45db512efd5fe0f162a5d4a6bbdd211", - "sha256:c29496625c61e18d97a6f6c2f2a55759ca8290fc21a751bc57824599c431c0d2", - "sha256:caff7ae6fb6dce2f520b2d46efc801605fa1378fb19bb4580aebc6174eab05a0", - "sha256:cbf9aa926de224af15c974750fecdc7d2c0043428372acaaf61216e202abbf21", - "sha256:cd0223a3a4ddcc0d0e06c6cfeb0adde2bc19c08b4c7fc79d48dac2486a4b115b", - "sha256:daf2030bf18c21bf91fa9cf6a403a765519c9168bd7a91ba1d66d5c7f70ded1e", - "sha256:ed30c5e58e578a2981c67346b2569e04120d1b80fa6906c207fe824d24603313", - "sha256:ed937691f522cc2362c280c903837a4e35195659b9935b598e3cd448db863605" + "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b", + "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0", + "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0", + "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf", + "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377", + "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2", + "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae", + "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc", + "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f", + "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f", + "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24", + "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a", + "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479", + "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e", + "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d", + "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2", + "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8", + "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190", + "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65", + "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9", + "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d", + "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526", + "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8", + "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f", + "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a", + "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408", + "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca", + "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c", + "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d", + "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff", + "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159", + "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720", + "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2", + "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40", + "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b", + "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973", + "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c", + "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436", + "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96", + "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0", + "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255", + "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261", + "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219" ], "markers": "python_version >= '3.7'", - "version": "==1.4.0" + "version": "==1.4.2" }, "kubernetes": { "hashes": [ @@ -816,30 +816,30 @@ }, "pandas": { "hashes": [ - "sha256:0259cd11e7e6125aaea3af823b80444f3adad6149ff4c97fef760093598b3e34", - "sha256:04dd15d9db538470900c851498e532ef28d4e56bfe72c9523acb32042de43dfb", - "sha256:0b1a13f647e4209ed7dbb5da3497891d0045da9785327530ab696417ef478f84", - "sha256:19f7c632436b1b4f84615c3b127bbd7bc603db95e3d4332ed259dc815c9aaa26", - "sha256:1b384516dbb4e6aae30e3464c2e77c563da5980440fbdfbd0968e3942f8f9d70", - "sha256:1d85d5f6be66dfd6d1d8d13b9535e342a2214260f1852654b19fa4d7b8d1218b", - "sha256:2e5a7a1e0ecaac652326af627a3eca84886da9e667d68286866d4e33f6547caf", - "sha256:3129a35d9dad1d80c234dd78f8f03141b914395d23f97cf92a366dcd19f8f8bf", - "sha256:358b0bc98a5ff067132d23bf7a2242ee95db9ea5b7bbc401cf79205f11502fd3", - "sha256:3dfb32ed50122fe8c5e7f2b8d97387edd742cc78f9ec36f007ee126cd3720907", - "sha256:4e1176f45981c8ccc8161bc036916c004ca51037a7ed73f2d2a9857e6dbe654f", - "sha256:508c99debccd15790d526ce6b1624b97a5e1e4ca5b871319fb0ebfd46b8f4dad", - "sha256:6105af6533f8b63a43ea9f08a2ede04e8f43e49daef0209ab0d30352bcf08bee", - "sha256:6d6ad1da00c7cc7d8dd1559a6ba59ba3973be6b15722d49738b2be0977eb8a0c", - "sha256:7ea47ba1d6f359680130bd29af497333be6110de8f4c35b9211eec5a5a9630fa", - "sha256:8db93ec98ac7cb5f8ac1420c10f5e3c43533153f253fe7fb6d891cf5aa2b80d2", - "sha256:96e9ece5759f9b47ae43794b6359bbc54805d76e573b161ae770c1ea59393106", - "sha256:bbb15ad79050e8b8d39ec40dd96a30cd09b886a2ae8848d0df1abba4d5502a67", - "sha256:c614001129b2a5add5e3677c3a213a9e6fd376204cb8d17c04e84ff7dfc02a73", - "sha256:e6a7bbbb7950063bfc942f8794bc3e31697c020a14f1cd8905fc1d28ec674a01", - "sha256:f02e85e6d832be37d7f16cf6ac8bb26b519ace3e5f3235564a91c7f658ab2a43" + "sha256:0010771bd9223f7afe5f051eb47c4a49534345dfa144f2f5470b27189a4dd3b5", + "sha256:061609334a8182ab500a90fe66d46f6f387de62d3a9cb9aa7e62e3146c712167", + "sha256:09d8be7dd9e1c4c98224c4dfe8abd60d145d934e9fc1f5f411266308ae683e6a", + "sha256:295872bf1a09758aba199992c3ecde455f01caf32266d50abc1a073e828a7b9d", + "sha256:3228198333dd13c90b6434ddf61aa6d57deaca98cf7b654f4ad68a2db84f8cfe", + "sha256:385c52e85aaa8ea6a4c600a9b2821181a51f8be0aee3af6f2dcb41dafc4fc1d0", + "sha256:51649ef604a945f781105a6d2ecf88db7da0f4868ac5d45c51cb66081c4d9c73", + "sha256:5586cc95692564b441f4747c47c8a9746792e87b40a4680a2feb7794defb1ce3", + "sha256:5a206afa84ed20e07603f50d22b5f0db3fb556486d8c2462d8bc364831a4b417", + "sha256:5b79af3a69e5175c6fa7b4e046b21a646c8b74e92c6581a9d825687d92071b51", + "sha256:5c54ea4ef3823108cd4ec7fb27ccba4c3a775e0f83e39c5e17f5094cb17748bc", + "sha256:8c5bf555b6b0075294b73965adaafb39cf71c312e38c5935c93d78f41c19828a", + "sha256:92bc1fc585f1463ca827b45535957815b7deb218c549b7c18402c322c7549a12", + "sha256:95c1e422ced0199cf4a34385ff124b69412c4bc912011ce895582bee620dfcaa", + "sha256:b8134651258bce418cb79c71adeff0a44090c98d955f6953168ba16cc285d9f7", + "sha256:be67c782c4f1b1f24c2f16a157e12c2693fd510f8df18e3287c77f33d124ed07", + "sha256:c072c7f06b9242c855ed8021ff970c0e8f8b10b35e2640c657d2a541c5950f59", + "sha256:d0d4f13e4be7ce89d7057a786023c461dd9370040bdb5efa0a7fe76b556867a0", + "sha256:df82739e00bb6daf4bba4479a40f38c718b598a84654cbd8bb498fd6b0aa8c16", + "sha256:f549097993744ff8c41b5e8f2f0d3cbfaabe89b4ae32c8c08ead6cc535b80139", + "sha256:ff08a14ef21d94cdf18eef7c569d66f2e24e0bc89350bcd7d243dd804e3b5eb2" ], "index": "pypi", - "version": "==1.4.1" + "version": "==1.4.2" }, "pexpect": { "hashes": [ @@ -850,44 +850,47 @@ }, "pillow": { "hashes": [ - "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97", - "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049", - "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c", - "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae", - "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28", - "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030", - "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56", - "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976", - "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e", - "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e", - "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f", - "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b", - "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a", - "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e", - "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa", - "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7", - "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00", - "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838", - "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360", - "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b", - "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a", - "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd", - "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4", - "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70", - "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204", - "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc", - "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b", - "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669", - "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7", - "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e", - "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c", - "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092", - "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c", - "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5", - "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac" + "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e", + "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595", + "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512", + "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c", + "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477", + "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a", + "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4", + "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e", + "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5", + "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378", + "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a", + "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652", + "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7", + "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a", + "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a", + "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6", + "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165", + "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160", + "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331", + "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b", + "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458", + "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033", + "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8", + "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481", + "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58", + "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7", + "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3", + "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea", + "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34", + "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3", + "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8", + "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581", + "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244", + "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef", + "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0", + "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2", + "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97", + "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717" ], "markers": "python_version >= '3.7'", - "version": "==9.0.1" + "version": "==9.1.0" }, "psycopg2-binary": { "hashes": [ @@ -1308,17 +1311,17 @@ }, "thoth-common": { "hashes": [ - "sha256:4c7c850de3dda5c381c509726b732bfd7c714313aca08578e0f2ca850956d35e", - "sha256:9bd73618d9c31463ae9959988d061923879915c4f89e6f02bd254a4cffd33699" + "sha256:d653965525a7986360134369f54b4cbf10e5e65df03d6051edaa90f6b4b6ff07", + "sha256:e6be7fda59ac7568e2dd6860ac64b63fa0098dd40f1667e4f6c3c02a7a6b23ea" ], - "version": "==0.36.0" + "version": "==0.36.1" }, "thoth-python": { "hashes": [ - "sha256:485fef2def2d632103db8116175ac0c56b8e9b5985dda2dd25e6f69c2dbe3ebb", - "sha256:6f949d7d8f5815b0d87a1b5d9640093b8a071ae3e11ce5ff054017e4f53a4261" + "sha256:652eb186dcf9a3689eea2bd2169708d1b6ad21dee987eaf62183f8fd00080420", + "sha256:6be7c4723fdeea6043c372f9de4240613c3d5cf6b8aee3b41324f85dbd22a4de" ], - "version": "==0.16.9" + "version": "==0.16.10" }, "thoth-ssdeep": { "hashes": [ @@ -1348,11 +1351,11 @@ }, "tqdm": { "hashes": [ - "sha256:4230a49119a416c88cc47d0d2d32d5d90f1a282d5e497d49801950704e49863d", - "sha256:6461b009d6792008d0000e1b0c7ca50195ec78c0e808a3a6b668a56a3236c3a5" + "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d", + "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6" ], "index": "pypi", - "version": "==4.63.1" + "version": "==4.64.0" }, "types-pytz": { "hashes": [ @@ -1371,11 +1374,11 @@ }, "tzlocal": { "hashes": [ - "sha256:0f28015ac68a5c067210400a9197fc5d36ba9bc3f8eaf1da3cbd59acdfed9e09", - "sha256:28ba8d9fcb6c9a782d6e0078b4f6627af1ea26aeaa32b4eab5324abc7df4149f" + "sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745", + "sha256:ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7" ], "markers": "python_version >= '3.6'", - "version": "==4.1" + "version": "==4.2" }, "urllib3": { "hashes": [ @@ -1387,18 +1390,19 @@ }, "voluptuous": { "hashes": [ - "sha256:4db1ac5079db9249820d49c891cb4660a6f8cae350491210abce741fabf56513" + "sha256:cae6a4526b434b642816b34a00e1186d5a5f5e0c948ab94d2a918e01e5874066", + "sha256:e3b5f6cb68fcb0230701b5c756db4caa6766223fc0eaf613931fdba51025981b" ], "index": "pypi", - "version": "==0.12.2" + "version": "==0.13.0" }, "websocket-client": { "hashes": [ - "sha256:074e2ed575e7c822fc0940d31c3ac9bb2b1142c303eafcf3e304e6ce035522e8", - "sha256:6278a75065395418283f887de7c3beafb3aa68dada5cacbe4b214e8d26da499b" + "sha256:50b21db0058f7a953d67cc0445be4b948d7fc196ecbeb8083d68d94628e4abf6", + "sha256:722b171be00f2b90e1d4fb2f2b53146a536ca38db1da8ff49c972a4e1365d0ef" ], - "markers": "python_version >= '3.6'", - "version": "==1.3.1" + "markers": "python_version >= '3.7'", + "version": "==1.3.2" }, "wrapt": { "hashes": [ @@ -1550,11 +1554,11 @@ }, "zipp": { "hashes": [ - "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d", - "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375" + "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad", + "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099" ], "markers": "python_version < '3.10'", - "version": "==3.7.0" + "version": "==3.8.0" } }, "develop": { @@ -1660,13 +1664,12 @@ "markers": "python_version >= '3'", "version": "==2.0.12" }, - "colorama": { + "commonmark": { "hashes": [ - "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", - "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" + "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60", + "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.4.4" + "version": "==0.9.1" }, "coverage": { "extras": [ @@ -1769,11 +1772,11 @@ }, "hypothesis": { "hashes": [ - "sha256:41503e20a246ab4522d78f2df8afc40fd7349eeaf0fe07cdc233069c671e6e35", - "sha256:f60b1dfaa8c2175c40513449f9c49b7543d50e66e16a5e22cf5fca460e864037" + "sha256:ca931c5a6414f3f9636fdaf978a216ee9b5c4a6b4415adf628e9d5e5003dcd99", + "sha256:de48abb676fc76e4397cd002926e5747cef518570d132221244d27e1075c0bec" ], "index": "pypi", - "version": "==6.39.4" + "version": "==6.41.0" }, "hypothesis-auto": { "hashes": [ @@ -1816,11 +1819,11 @@ }, "jeepney": { "hashes": [ - "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac", - "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f" + "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", + "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" ], "markers": "sys_platform == 'linux'", - "version": "==0.7.1" + "version": "==0.8.0" }, "keyring": { "hashes": [ @@ -1832,32 +1835,32 @@ }, "mypy": { "hashes": [ - "sha256:080097eee5393fd740f32c63f9343580aaa0fb1cda0128fd859dfcf081321c3d", - "sha256:0d3bcbe146247997e03bf030122000998b076b3ac6925b0b6563f46d1ce39b50", - "sha256:0dd441fbacf48e19dc0c5c42fafa72b8e1a0ba0a39309c1af9c84b9397d9b15a", - "sha256:108f3c7e14a038cf097d2444fa0155462362c6316e3ecb2d70f6dd99cd36084d", - "sha256:3bada0cf7b6965627954b3a128903a87cac79a79ccd83b6104912e723ef16c7b", - "sha256:3cf77f138efb31727ee7197bc824c9d6d7039204ed96756cc0f9ca7d8e8fc2a4", - "sha256:42c216a33d2bdba08098acaf5bae65b0c8196afeb535ef4b870919a788a27259", - "sha256:465a6ce9ca6268cadfbc27a2a94ddf0412568a6b27640ced229270be4f5d394d", - "sha256:6a8e1f63357851444940351e98fb3252956a15f2cabe3d698316d7a2d1f1f896", - "sha256:745071762f32f65e77de6df699366d707fad6c132a660d1342077cbf671ef589", - "sha256:818cfc51c25a5dbfd0705f3ac1919fff6971eb0c02e6f1a1f6a017a42405a7c0", - "sha256:8e5974583a77d630a5868eee18f85ac3093caf76e018c510aeb802b9973304ce", - "sha256:8eaf55fdf99242a1c8c792247c455565447353914023878beadb79600aac4a2a", - "sha256:98f61aad0bb54f797b17da5b82f419e6ce214de0aa7e92211ebee9e40eb04276", - "sha256:b2ce2788df0c066c2ff4ba7190fa84f18937527c477247e926abeb9b1168b8cc", - "sha256:b30d29251dff4c59b2e5a1fa1bab91ff3e117b4658cb90f76d97702b7a2ae699", - "sha256:bf446223b2e0e4f0a4792938e8d885e8a896834aded5f51be5c3c69566495540", - "sha256:cbcc691d8b507d54cb2b8521f0a2a3d4daa477f62fe77f0abba41e5febb377b7", - "sha256:d051ce0946521eba48e19b25f27f98e5ce4dbc91fff296de76240c46b4464df0", - "sha256:d61b73c01fc1de799226963f2639af831307fe1556b04b7c25e2b6c267a3bc76", - "sha256:eea10982b798ff0ccc3b9e7e42628f932f552c5845066970e67cd6858655d52c", - "sha256:f79137d012ff3227866222049af534f25354c07a0d6b9a171dba9f1d6a1fdef4", - "sha256:fc5ecff5a3bbfbe20091b1cad82815507f5ae9c380a3a9bf40f740c70ce30a9b" + "sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e", + "sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16", + "sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2", + "sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c", + "sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67", + "sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5", + "sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b", + "sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6", + "sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58", + "sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d", + "sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17", + "sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0", + "sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca", + "sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6", + "sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322", + "sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534", + "sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3", + "sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db", + "sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904", + "sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c", + "sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46", + "sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8", + "sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee" ], "index": "pypi", - "version": "==0.941" + "version": "==0.942" }, "mypy-extensions": { "hashes": [ @@ -1906,11 +1909,11 @@ }, "pre-commit": { "hashes": [ - "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616", - "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a" + "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7", + "sha256:a4ed01000afcb484d9eb8d504272e642c4c4099bbad3a6b27e519bd6a3e928a6" ], "index": "pypi", - "version": "==2.17.0" + "version": "==2.15.0" }, "py": { "hashes": [ @@ -2095,6 +2098,14 @@ "markers": "python_version >= '3.7'", "version": "==2.0.0" }, + "rich": { + "hashes": [ + "sha256:c50f3d253bc6a9bb9c79d61a26d510d74abdf1b16881260fab5edfc3edfb082f", + "sha256:ea74bc9dad9589d8eea3e3fd0b136d8bf6e428888955f215824c2894f0da8b47" + ], + "markers": "python_full_version >= '3.6.3' and python_full_version < '4.0.0'", + "version": "==12.2.0" + }, "rope": { "hashes": [ "sha256:edf2ed3c9b35a8814752ffd3ea55b293c791e5087e252461de898e953cf9c146", @@ -2142,28 +2153,20 @@ "markers": "python_version >= '3.6'", "version": "==2.0.1" }, - "tqdm": { - "hashes": [ - "sha256:4230a49119a416c88cc47d0d2d32d5d90f1a282d5e497d49801950704e49863d", - "sha256:6461b009d6792008d0000e1b0c7ca50195ec78c0e808a3a6b668a56a3236c3a5" - ], - "index": "pypi", - "version": "==4.63.1" - }, "twine": { "hashes": [ - "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19", - "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8" + "sha256:6f7496cf14a3a8903474552d5271c79c71916519edb42554f23f42a8563498a9", + "sha256:817aa0c0bdc02a5ebe32051e168e23c71a0608334e624c793011f120dbbc05b7" ], "index": "pypi", - "version": "==3.8.0" + "version": "==4.0.0" }, "typing-extensions": { "hashes": [ "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42", "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2" ], - "markers": "python_version >= '3.6'", + "markers": "python_version < '3.9'", "version": "==4.1.1" }, "urllib3": { @@ -2176,11 +2179,11 @@ }, "virtualenv": { "hashes": [ - "sha256:c3e01300fb8495bc00ed70741f5271fc95fed067eb7106297be73d30879af60c", - "sha256:ce8901d3bbf3b90393498187f2d56797a8a452fb2d0d7efc6fd837554d6f679c" + "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66", + "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==20.13.4" + "version": "==20.14.0" }, "webencodings": { "hashes": [ @@ -2191,11 +2194,11 @@ }, "zipp": { "hashes": [ - "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d", - "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375" + "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad", + "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099" ], "markers": "python_version < '3.10'", - "version": "==3.7.0" + "version": "==3.8.0" } } } From 307aad8c9135cb60eebe6e4b7df2405887c6961d Mon Sep 17 00:00:00 2001 From: Dominik Tuchyna Date: Wed, 6 Apr 2022 20:21:54 +0200 Subject: [PATCH 8/8] Add advise metrics entity, change pyproject.toml setup --- pyproject.toml | 5 +- .../entities/thoth_advise_metrics.py | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 srcopsmetrics/entities/thoth_advise_metrics.py diff --git a/pyproject.toml b/pyproject.toml index cc7f1abc..4efc3c95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,9 @@ +[build-system] +requires = ["setuptools", "wheel"] + [tool.black] line-length = 120 -py38 = true +target-version = ['py38'] include = '\.pyi?$' exclude = ''' /( diff --git a/srcopsmetrics/entities/thoth_advise_metrics.py b/srcopsmetrics/entities/thoth_advise_metrics.py new file mode 100644 index 00000000..9ca99351 --- /dev/null +++ b/srcopsmetrics/entities/thoth_advise_metrics.py @@ -0,0 +1,46 @@ +# Copyright (C) 2022 Dominik Tuchyna +# +# This file is part of thoth-station/mi - Meta-information Indicators. +# +# thoth-station/mi - Meta-information Indicators is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# thoth-station/mi - Meta-information Indicators is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with thoth-station/mi - Meta-information Indicators. If not, see . + +"""Adivse manager metrics.""" + +from typing import List + +from voluptuous.schema_builder import Schema +from voluptuous.validators import Any + +from srcopsmetrics.entities import Entity + + +class ThothAdviseMetrics(Entity): + """Kebechet managers metrics class for a repository. + + Intended to be used only for loading and storing operations. + """ + + entity_schema = Schema({int: {str: Any(str, int)}}) + + def analyse(self) -> List[Any]: + """Override :func:`~Entity.analyse`.""" + raise NotImplementedError("cannot use with metrics") + + def store(self, github_entity): + """Override :func:`~Entity.store`.""" + raise NotImplementedError("cannot use with metrics") + + def get_raw_github_data(self): + """Override :func:`~Entity.get_raw_github_data`.""" + raise NotImplementedError("cannot use with metrics")