From e9f2ff267b8dc841f8b0333fb8f932df204019ef Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 9 Dec 2022 10:54:41 -0800 Subject: [PATCH 001/301] adding mn onboard script --- scripts/mnonboard.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 scripts/mnonboard.py diff --git a/scripts/mnonboard.py b/scripts/mnonboard.py new file mode 100644 index 00000000..ffe27df2 --- /dev/null +++ b/scripts/mnonboard.py @@ -0,0 +1,5 @@ +import os +import sys +import json +import click + From 8e1e2a472ce24fe3747854ccf3bca2ee53b60561 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 9 Dec 2022 14:24:49 -0800 Subject: [PATCH 002/301] creating mnonboard module --- mnonboard/README.md | 4 ++++ mnonboard/__init__.py | 0 {scripts => mnonboard}/mnonboard.py | 0 mnonboard/utils.py | 7 +++++++ 4 files changed, 11 insertions(+) create mode 100644 mnonboard/README.md create mode 100644 mnonboard/__init__.py rename {scripts => mnonboard}/mnonboard.py (100%) create mode 100644 mnonboard/utils.py diff --git a/mnonboard/README.md b/mnonboard/README.md new file mode 100644 index 00000000..5ea9af3c --- /dev/null +++ b/mnonboard/README.md @@ -0,0 +1,4 @@ +# mnonboard + +This module is designed to provide a wrapper around `opersist` in order to streamline the [DataONE member node onboarding process](https://github.com/DataONEorg/mnlite/blob/feature/onboarding/docs/operation.md). +It takes as input either a json document manually edited from a template, or converts direct user input to a json document. diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/scripts/mnonboard.py b/mnonboard/mnonboard.py similarity index 100% rename from scripts/mnonboard.py rename to mnonboard/mnonboard.py diff --git a/mnonboard/utils.py b/mnonboard/utils.py new file mode 100644 index 00000000..6fcae468 --- /dev/null +++ b/mnonboard/utils.py @@ -0,0 +1,7 @@ +import json + +def default_json(): + jstr = r'''{ + +} +''' \ No newline at end of file From 3595080b9acd97cb158933abb260dc09bffcde75 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 08:53:18 -0800 Subject: [PATCH 003/301] adding default json text; renaming to avoid collisions --- mnonboard/mnutils.py | 36 ++++++++++++++++++++++++++++++++++++ mnonboard/utils.py | 7 ------- 2 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 mnonboard/mnutils.py delete mode 100644 mnonboard/utils.py diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py new file mode 100644 index 00000000..479f0f57 --- /dev/null +++ b/mnonboard/mnutils.py @@ -0,0 +1,36 @@ +import json + +def default_json(): + jstr = r'''{ + "node": { + "node_id": "", + "state": "up", + "name": "", + "description": "", + "base_url": "", + "schedule": { + "hour": "*", + "day": "*", + "min": "0,10,20,30,40,50", + "mon": "*", + "sec": "0", + "wday": "?", + "year": "*" + }, + "subject": "", + "contact_subject": "" + }, + "data_folder": "data", + "content_database": "sqlite:///content.db", + "log_database": "sqlite:///eventlog.db", + "created": "", + "default_submitter": "", + "default_owner": "", + "spider": { + "sitemap_urls":[ + "" + ] + } +} +''' + return json.loads(jstr) diff --git a/mnonboard/utils.py b/mnonboard/utils.py deleted file mode 100644 index 6fcae468..00000000 --- a/mnonboard/utils.py +++ /dev/null @@ -1,7 +0,0 @@ -import json - -def default_json(): - jstr = r'''{ - -} -''' \ No newline at end of file From 2af896fa0bb0588511128b0d6d2912aa3acb2a2c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 10:38:38 -0800 Subject: [PATCH 004/301] updating onboarding processes --- mnonboard/__init__.py | 5 +++++ mnonboard/mnonboard.py | 3 +++ mnonboard/mnutils.py | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index e69de29b..5e95798d 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -0,0 +1,5 @@ +import os +import logging + +from opersist.cli import LOG_LEVELS, LOG_DATE_FORMAT, LOG_FORMAT + diff --git a/mnonboard/mnonboard.py b/mnonboard/mnonboard.py index ffe27df2..6454ba77 100644 --- a/mnonboard/mnonboard.py +++ b/mnonboard/mnonboard.py @@ -3,3 +3,6 @@ import json import click +from . import mnutils + + diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 479f0f57..d1e25735 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -1,6 +1,10 @@ import json +import pyshacl def default_json(): + """ + A function that spits out a json file to be used in onboarding. + """ jstr = r'''{ "node": { "node_id": "", From 910eda700f207ff505f38ea091f9d63f23248657 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 16:44:03 -0800 Subject: [PATCH 005/301] adding defs file with json text and input dictionaries --- mnonboard/defs.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 mnonboard/defs.py diff --git a/mnonboard/defs.py b/mnonboard/defs.py new file mode 100644 index 00000000..ba3d66e5 --- /dev/null +++ b/mnonboard/defs.py @@ -0,0 +1,62 @@ + + +DEFAULT_JSON = r'''{ + "node": { + "node_id": "", + "state": "up", + "name": "", + "description": "", + "base_url": "", + "schedule": { + "hour": "*", + "day": "*", + "min": "0,10,20,30,40,50", + "mon": "*", + "sec": "0", + "wday": "?", + "year": "*" + }, + "subject": "", + "contact_subject": "" + }, + "data_folder": "data", + "content_database": "sqlite:///content.db", + "log_database": "sqlite:///eventlog.db", + "created": "", + "default_submitter": "", + "default_owner": "", + "spider": { + "sitemap_urls":[ + "" + ] + } +} +''' + +FIELDS = { + 'node_id': ['Member node identifier (must be unique): ', None], + 'name': ['Repository name: ', None], + 'description': ['Repository description: ', None], + 'base_url': ['Base URL of repository: ', None], + 'contact_subject_name': ['Repository technical contact name: ', None], + 'contact_subject': ["Technical contact's ORCiD number: ", None], + 'default_submitter_name': ['Repository submitter name: ', None], + 'default_submitter': ["Submitter's ORCiD number: ", None], + 'default_owner_name': ['Repository owner name: ', None], + 'default_owner': ["Owner's ORCiD number: ", None], + 'num_sitemap_urls': ['Number of sitemap URLs (need at least 1): ', None], +} + +FILL_FIELDS = [ + 'node_id', + 'node', + 'description', + 'base_url', + 'contact_subject', + 'default_submitter', + 'default_owner' +] + +SITEMAP_URLS = { + 0: '', +} From 98edb343e70f29f64ab37aed77cbeed00a2e0dd9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 16:44:37 -0800 Subject: [PATCH 006/301] add logging --- mnonboard/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 5e95798d..1b91ee65 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -3,3 +3,9 @@ from opersist.cli import LOG_LEVELS, LOG_DATE_FORMAT, LOG_FORMAT +logging.basicConfig( + level=LOG_LEVELS.get("INFO", logging.INFO), + format=LOG_FORMAT, + datefmt=LOG_DATE_FORMAT, +) +L = logging.getLogger("main") From a34a19af4af51f797783a1414ed5c51633c525d0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 16:45:08 -0800 Subject: [PATCH 007/301] add the utils to use in data collection --- mnonboard/mnutils.py | 70 +++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index d1e25735..de5e5d60 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -1,40 +1,38 @@ import json import pyshacl +from .defs import DEFAULT_JSON, FIELDS, FILL_FIELDS, SITEMAP_URLS +from . import L + def default_json(): - """ - A function that spits out a json file to be used in onboarding. - """ - jstr = r'''{ - "node": { - "node_id": "", - "state": "up", - "name": "", - "description": "", - "base_url": "", - "schedule": { - "hour": "*", - "day": "*", - "min": "0,10,20,30,40,50", - "mon": "*", - "sec": "0", - "wday": "?", - "year": "*" - }, - "subject": "", - "contact_subject": "" - }, - "data_folder": "data", - "content_database": "sqlite:///content.db", - "log_database": "sqlite:///eventlog.db", - "created": "", - "default_submitter": "", - "default_owner": "", - "spider": { - "sitemap_urls":[ - "" - ] - } -} -''' - return json.loads(jstr) + """ + A function that spits out a json file to be used in onboarding. + """ + return json.loads(DEFAULT_JSON) + +def user_input(): + """ + We need a few pieces of information to fill the json fields. + """ + for f in FIELDS: + if f in 'num_sitemap_urls': + while True: + FIELDS[f][1] = int(input(FIELDS[f][0])) + if FIELDS[f][1] > 1: + break + else: + L.warning("The number of database sitemap URLs can't be less than 1.") + else: + FIELDS[f][1] = input(FIELDS[f][0]) + return FIELDS + +def sitemap_urls(num_urls): + """ + Collect the sitemap URLs. + Usually there will be just one of these but we will prepare for more. + """ + i = 0 + while i < num_urls: + SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) + i += 1 + return SITEMAP_URLS \ No newline at end of file From 23abaedbca9ec0794cb15715e84cfae8388c810f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 16:49:58 -0800 Subject: [PATCH 008/301] bug fix for sitemap url number logic --- mnonboard/mnutils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index de5e5d60..827fceb7 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -18,7 +18,7 @@ def user_input(): if f in 'num_sitemap_urls': while True: FIELDS[f][1] = int(input(FIELDS[f][0])) - if FIELDS[f][1] > 1: + if FIELDS[f][1] >= 1: break else: L.warning("The number of database sitemap URLs can't be less than 1.") From 2711f89a05b3fca3b70d64fe70bdaa7255b720e9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 17:24:04 -0800 Subject: [PATCH 009/301] adding user input logic --- mnonboard/mnutils.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 827fceb7..7e8254e1 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -17,11 +17,24 @@ def user_input(): for f in FIELDS: if f in 'num_sitemap_urls': while True: - FIELDS[f][1] = int(input(FIELDS[f][0])) + try: + FIELDS[f][1] = int(input(FIELDS[f][0])) + break + except ValueError as e: + L.warning(e) + print('Please enter an integer.') + while True: if FIELDS[f][1] >= 1: break else: L.warning("The number of database sitemap URLs can't be less than 1.") + elif f in ('contact_subject', 'default_submitter', 'default_owner'): + while True: + FIELDS[f][1] = input(FIELDS[f][0]) + if len(FIELDS[f][1]) == 19: + break + else: + print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') else: FIELDS[f][1] = input(FIELDS[f][0]) return FIELDS @@ -35,4 +48,4 @@ def sitemap_urls(num_urls): while i < num_urls: SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) i += 1 - return SITEMAP_URLS \ No newline at end of file + return SITEMAP_URLS From c7baed351e7e5c031c2859aef854a337f0444074 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 19:47:37 -0800 Subject: [PATCH 010/301] adding orcid validation function --- mnonboard/mnutils.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 7e8254e1..1644cb63 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -10,6 +10,39 @@ def default_json(): """ return json.loads(DEFAULT_JSON) +def valid_orcid(orcid): + """ + Checks the validity of an ORCiD number. + ORCiDs have 4 groupings of 4 of integers separated by dashes (-) + for a total of 19 characters, thus `0000-0000-0000-0000` is valid + but `0000-0000-00000-000` and `0000-0000-0000-000` are not. + """ + if (len(orcid) == 19): + # it's 19 characters long. start test loop + for i in range(0,19): + # does it have a dash (-) in positions 5, 9, and 13? + if i in (4, 9, 14): + if orcid[i] in '-': + # dash exists in correct position, next test + continue + else: + # fail (not a dash) + #print('no dash at %s' % i) + return False + try: + # int exists in correct position, next test + int(orcid[i]) + except ValueError as e: + # fail (not an integer) + #print('valueerror at %s' % i) + return False + # pass + return True + else: + # fail (not 19 characters) + #print('not 19 chars') + return False + def user_input(): """ We need a few pieces of information to fill the json fields. @@ -17,6 +50,7 @@ def user_input(): for f in FIELDS: if f in 'num_sitemap_urls': while True: + # make sure user enters an int try: FIELDS[f][1] = int(input(FIELDS[f][0])) break @@ -24,14 +58,16 @@ def user_input(): L.warning(e) print('Please enter an integer.') while True: + # make sure user enters 1 or more if FIELDS[f][1] >= 1: break else: L.warning("The number of database sitemap URLs can't be less than 1.") elif f in ('contact_subject', 'default_submitter', 'default_owner'): while True: + # make sure user enters a valid ORCiD number FIELDS[f][1] = input(FIELDS[f][0]) - if len(FIELDS[f][1]) == 19: + if valid_orcid(FIELDS[f][1]): break else: print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') From defda87880ab97fb38e25e009f7b3eefd75b232b Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 19:56:28 -0800 Subject: [PATCH 011/301] adding to docstring --- mnonboard/mnutils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 1644cb63..4875ecd1 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -13,9 +13,13 @@ def default_json(): def valid_orcid(orcid): """ Checks the validity of an ORCiD number. + ORCiDs have 4 groupings of 4 of integers separated by dashes (-) for a total of 19 characters, thus `0000-0000-0000-0000` is valid but `0000-0000-00000-000` and `0000-0000-0000-000` are not. + + This seems like overkill but is probably good to have since it will be + used to store contacts for database upkeep/maintenance. """ if (len(orcid) == 19): # it's 19 characters long. start test loop From 6770ec813eac74f5dfd7906d905c1dd3cfb9a568 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 12 Dec 2022 19:57:39 -0800 Subject: [PATCH 012/301] correcting position numbers --- mnonboard/mnutils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 4875ecd1..53665e94 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -24,7 +24,7 @@ def valid_orcid(orcid): if (len(orcid) == 19): # it's 19 characters long. start test loop for i in range(0,19): - # does it have a dash (-) in positions 5, 9, and 13? + # does it have a dash (-) in positions 5, 10, and 15? if i in (4, 9, 14): if orcid[i] in '-': # dash exists in correct position, next test From f5853ab7af84d70ea812a86ca145a59281aecef0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 13 Dec 2022 08:32:31 -0800 Subject: [PATCH 013/301] adding paths defs and logic --- mnonboard/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 1b91ee65..f3978ec0 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -9,3 +9,17 @@ datefmt=LOG_DATE_FORMAT, ) L = logging.getLogger("main") + +# absolute path of current file +CUR_PATH_ABS = os.path.dirname(os.path.abspath(__file__)) + +# relative path to nodes directory +NODE_PATH_REL = 'instance/nodes/' + +def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS): + """ + Get the absolute path of the nodes directory where new members will go. + Currently the nodes directory lives at `../instance/nodes/` (relative to + the mnonboard dir that this file is in). + """ + return os.path.abspath(os.path.join(CUR_PATH_ABS, '../', NODE_PATH_REL)) From 76b243ae7c0f0fe7c1b6fa5abcf13f998b2bf439 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 13 Dec 2022 08:33:18 -0800 Subject: [PATCH 014/301] adding json load/save fxs --- mnonboard/mnutils.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 53665e94..ca9ad988 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -10,6 +10,20 @@ def default_json(): """ return json.loads(DEFAULT_JSON) +def load_json(loc): + """ + Load json from file. + """ + with open(loc, 'r') as f: + return json.load(f) + +def save_json(loc, jf): + """ + Output json to file. + """ + with open(loc, 'w') as f: + json.dump(jf, f) + def valid_orcid(orcid): """ Checks the validity of an ORCiD number. From 81f022fca3d1f921ecf38b60972421f8a1bbe754 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 13 Dec 2022 11:31:12 -0800 Subject: [PATCH 015/301] adding main script and simple click commands --- mnonboard/mnonboard.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/mnonboard/mnonboard.py b/mnonboard/mnonboard.py index 6454ba77..399cd779 100644 --- a/mnonboard/mnonboard.py +++ b/mnonboard/mnonboard.py @@ -5,4 +5,22 @@ from . import mnutils +@click.command() +@click.option("--jsonfile", default=None, + help="JSON file to load (defaults to None).") +@click.option("--createjson", default=None, + help="Create a default blanked JSON file for the user to fill in themselves.") +def main(loc): + """ + Wrapper around opersist that simplifies the process of onboarding a new + member node to DataONE. + """ + if loc is None: + # do the full user-driven info gathering process + else: + # grab the info from a json + + +if __name__ == '__main__': + main() From 84d57189223cf5b499a4cf57cb92edda4fe4756d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 13 Dec 2022 16:06:26 -0800 Subject: [PATCH 016/301] adding sitemap URLs to fill fields --- mnonboard/defs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index ba3d66e5..4029228a 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -54,7 +54,8 @@ 'base_url', 'contact_subject', 'default_submitter', - 'default_owner' + 'default_owner', + 'sitemap_urls' ] SITEMAP_URLS = { From 21a6c651fbe8fe9491ab996d8c707befbf0fa58f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 13 Dec 2022 16:08:16 -0800 Subject: [PATCH 017/301] adding comments --- mnonboard/mnutils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index ca9ad988..07118dd7 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -70,6 +70,7 @@ def user_input(): while True: # make sure user enters an int try: + # ask the user for input FIELDS[f][1] = int(input(FIELDS[f][0])) break except ValueError as e: @@ -83,8 +84,9 @@ def user_input(): L.warning("The number of database sitemap URLs can't be less than 1.") elif f in ('contact_subject', 'default_submitter', 'default_owner'): while True: - # make sure user enters a valid ORCiD number + # ask the user for an ORCiD number FIELDS[f][1] = input(FIELDS[f][0]) + # make sure user has entered a valid ORCiD number if valid_orcid(FIELDS[f][1]): break else: @@ -100,6 +102,8 @@ def sitemap_urls(num_urls): """ i = 0 while i < num_urls: + # add URLs one at a time (should only be a few at most) + # if we start getting MNs with 10+ sitemap URLs, maybe we change to accept lists SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) i += 1 return SITEMAP_URLS From 15f2b7b7041dd97940d30ee92741d6cd3a5cffc3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 08:58:29 -0800 Subject: [PATCH 018/301] fix imports --- mnonboard/mnutils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 07118dd7..7f0217d5 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -1,8 +1,8 @@ import json import pyshacl -from .defs import DEFAULT_JSON, FIELDS, FILL_FIELDS, SITEMAP_URLS -from . import L +from defs import DEFAULT_JSON, FIELDS, FILL_FIELDS, SITEMAP_URLS +import logging as L def default_json(): """ From bf46c8658361f6801c86d562f905ca8ec6510ed6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 08:58:49 -0800 Subject: [PATCH 019/301] adding to main fx --- mnonboard/mnonboard.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mnonboard/mnonboard.py b/mnonboard/mnonboard.py index 399cd779..a8f76779 100644 --- a/mnonboard/mnonboard.py +++ b/mnonboard/mnonboard.py @@ -3,14 +3,15 @@ import json import click -from . import mnutils +import mnutils +from opersist.cli import getOpersistInstance @click.command() -@click.option("--jsonfile", default=None, +@click.option("-j", "--jsonfile", default=None, help="JSON file to load (defaults to None).") -@click.option("--createjson", default=None, +@click.option("-c", "--createjson", default='node.json', help="Create a default blanked JSON file for the user to fill in themselves.") -def main(loc): +def main(ctx, loc): """ Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. @@ -18,8 +19,13 @@ def main(loc): if loc is None: # do the full user-driven info gathering process + fields = mnutils.user_input() + fields['sitemap_urls'] = ['Sitemap URLs: ', ''] + # get the sitemap urls as a list + fields['sitemap_urls'][1] = mnutils.sitemap_urls(fields['num_sitemap_urls'][1]) # type: ignore else: # grab the info from a json + pass if __name__ == '__main__': From 0071d8e33a7b391906ab4dc28fcb28a2ac15a906 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 10:19:12 -0800 Subject: [PATCH 020/301] cleaning up mnonboard --- mnonboard/mnonboard.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/mnonboard/mnonboard.py b/mnonboard/mnonboard.py index a8f76779..b38acf7e 100644 --- a/mnonboard/mnonboard.py +++ b/mnonboard/mnonboard.py @@ -2,31 +2,29 @@ import sys import json import click +import pyshacl +from mnonboard import L import mnutils from opersist.cli import getOpersistInstance @click.command() @click.option("-j", "--jsonfile", default=None, help="JSON file to load (defaults to None).") -@click.option("-c", "--createjson", default='node.json', - help="Create a default blanked JSON file for the user to fill in themselves.") -def main(ctx, loc): +@click.pass_context +def main(ctx, jsonfile): """ Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ - if loc is None: + if jsonfile is None: # do the full user-driven info gathering process fields = mnutils.user_input() - fields['sitemap_urls'] = ['Sitemap URLs: ', ''] - # get the sitemap urls as a list - fields['sitemap_urls'][1] = mnutils.sitemap_urls(fields['num_sitemap_urls'][1]) # type: ignore else: # grab the info from a json - pass - + fields = mnutils.load_json(jsonfile) + mnutils.input_test(fields) if __name__ == '__main__': main() From c66ee76b5b408d24786dbcdfbde725579c73f25a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 10:21:07 -0800 Subject: [PATCH 021/301] splitting user input function and cleaning up --- mnonboard/mnutils.py | 102 +++++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 37 deletions(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 7f0217d5..3c84cfd4 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -2,7 +2,7 @@ import pyshacl from defs import DEFAULT_JSON, FIELDS, FILL_FIELDS, SITEMAP_URLS -import logging as L +from mnonboard import L def default_json(): """ @@ -14,8 +14,15 @@ def load_json(loc): """ Load json from file. """ - with open(loc, 'r') as f: - return json.load(f) + try: + with open(loc, 'r') as f: + return json.load(f) + except FileNotFoundError as e: + L.error('File does not exist - %s' % e) + exit(1) + except Exception as e: + L.error('Error: %s' % e) + exit(1) def save_json(loc, jf): """ @@ -61,40 +68,6 @@ def valid_orcid(orcid): #print('not 19 chars') return False -def user_input(): - """ - We need a few pieces of information to fill the json fields. - """ - for f in FIELDS: - if f in 'num_sitemap_urls': - while True: - # make sure user enters an int - try: - # ask the user for input - FIELDS[f][1] = int(input(FIELDS[f][0])) - break - except ValueError as e: - L.warning(e) - print('Please enter an integer.') - while True: - # make sure user enters 1 or more - if FIELDS[f][1] >= 1: - break - else: - L.warning("The number of database sitemap URLs can't be less than 1.") - elif f in ('contact_subject', 'default_submitter', 'default_owner'): - while True: - # ask the user for an ORCiD number - FIELDS[f][1] = input(FIELDS[f][0]) - # make sure user has entered a valid ORCiD number - if valid_orcid(FIELDS[f][1]): - break - else: - print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') - else: - FIELDS[f][1] = input(FIELDS[f][0]) - return FIELDS - def sitemap_urls(num_urls): """ Collect the sitemap URLs. @@ -107,3 +80,58 @@ def sitemap_urls(num_urls): SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) i += 1 return SITEMAP_URLS + +def enter_int(prompt): + """ + Make sure the user enters an integer value of 1 or greater. + """ + while True: + # make sure user enters an int + try: + # ask the user for input + i = int(input(prompt)) + # must be 1 or greater + assert i >= 1 + # tests ok + return i + except ValueError as e: + L.warning(e) + print('Please enter an integer.') + except AssertionError as e: + L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) + print('Please enter 1 or greater.') + +def enter_orcid(prompt): + """ + Make sure the user enters an integer value of 1 or greater. + """ + while True: + # ask the user for an ORCiD number + o = input(prompt) + # make sure user has entered a valid ORCiD number + if valid_orcid(o): + return o + else: + L.warning("Invalid ORCiD number entered: %s" % o) + print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') + +def user_input(): + """ + We need a few pieces of information to fill the json fields. + """ + for f in FIELDS: + if f in 'num_sitemap_urls': + FIELDS[f][1] = enter_int(FIELDS[f][0]) + elif f in ('contact_subject', 'default_submitter', 'default_owner'): + FIELDS[f][1] = enter_orcid(FIELDS[f][0]) + else: + FIELDS[f][1] = input(FIELDS[f][0]) + # add the sitemap URLs field now that we're done with the loops + FIELDS['sitemap_urls'] = ['Sitemap URLs: ', {}] + # pass the number of mn sitemap URLs to sitemap_urls() + # fx will ask the user to enter the URL(s) and return them as a dict + # we then store it as the second list item in the 'sitemap_urls' field + FIELDS['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) + return FIELDS + + From de56376a3355d3710de9aadd2e8d5099c5e8c51c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 10:27:06 -0800 Subject: [PATCH 022/301] defining variable explicitly --- mnonboard/mnutils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 3c84cfd4..7c288f44 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -85,11 +85,12 @@ def enter_int(prompt): """ Make sure the user enters an integer value of 1 or greater. """ + i = None while True: # make sure user enters an int try: # ask the user for input - i = int(input(prompt)) + i = int(input(prompt)) # must be 1 or greater assert i >= 1 # tests ok From e49060022462582d87ddade4ed7b3ae2f725b606 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 10:58:42 -0800 Subject: [PATCH 023/301] adding context and jsonfile fields to make pylance happy --- mnonboard/mnonboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/mnonboard.py b/mnonboard/mnonboard.py index b38acf7e..ce458d40 100644 --- a/mnonboard/mnonboard.py +++ b/mnonboard/mnonboard.py @@ -27,4 +27,4 @@ def main(ctx, jsonfile): mnutils.input_test(fields) if __name__ == '__main__': - main() + main(ctx=None, jsonfile=None) From e32458eef5a83f24e2891c2ede6b086e82470078 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 10:59:26 -0800 Subject: [PATCH 024/301] adding function to verify loaded json data --- mnonboard/mnutils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 7c288f44..5efb11d6 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -135,4 +135,5 @@ def user_input(): FIELDS['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) return FIELDS - +def input_test(fields): + return From 8164027d4ef9aa8f7f466a013862f739d9c24c6d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 15:56:37 -0800 Subject: [PATCH 025/301] adding logic to test loaded json --- mnonboard/mnutils.py | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 5efb11d6..6f848972 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -8,6 +8,7 @@ def default_json(): """ A function that spits out a json file to be used in onboarding. """ + L.info('Loading default json template.') return json.loads(DEFAULT_JSON) def load_json(loc): @@ -53,6 +54,7 @@ def valid_orcid(orcid): else: # fail (not a dash) #print('no dash at %s' % i) + L.warning('ORCiD number failed check (%s has no dash in position %s)' % (orcid, i+1)) return False try: # int exists in correct position, next test @@ -60,8 +62,10 @@ def valid_orcid(orcid): except ValueError as e: # fail (not an integer) #print('valueerror at %s' % i) + L.warning('ORCiD number failed check (%s has no integer in position %s)' % (orcid, i+1)) return False # pass + L.info('ORCiD number passed checks. (%s)' % orcid) return True else: # fail (not 19 characters) @@ -78,6 +82,7 @@ def sitemap_urls(num_urls): # add URLs one at a time (should only be a few at most) # if we start getting MNs with 10+ sitemap URLs, maybe we change to accept lists SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) + L.info('Sitemap URL #%s: %s' % (i+1, SITEMAP_URLS[i])) i += 1 return SITEMAP_URLS @@ -90,13 +95,15 @@ def enter_int(prompt): # make sure user enters an int try: # ask the user for input - i = int(input(prompt)) + i = input(prompt) + L.info('User has entered %s' % i) + i = int(i) # must be 1 or greater assert i >= 1 # tests ok return i except ValueError as e: - L.warning(e) + L.warning('Not an integer. Error text: %s' % e) print('Please enter an integer.') except AssertionError as e: L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) @@ -109,6 +116,7 @@ def enter_orcid(prompt): while True: # ask the user for an ORCiD number o = input(prompt) + L.info('User has entered ORCiD number %s' % o) # make sure user has entered a valid ORCiD number if valid_orcid(o): return o @@ -120,6 +128,7 @@ def user_input(): """ We need a few pieces of information to fill the json fields. """ + L.info('Collecting user input (mnonboard.mnutils.user_input()).') for f in FIELDS: if f in 'num_sitemap_urls': FIELDS[f][1] = enter_int(FIELDS[f][0]) @@ -136,4 +145,24 @@ def user_input(): return FIELDS def input_test(fields): - return + # first, test that there are the fields we need + L.info('Running mnonboard.mnutils.input_test() on imported json.') + for f in FILL_FIELDS: + try: + if f in ('contact_subject', 'default_submitter', 'default_owner'): + # orcid number will be preceded by a https://orcid.org/ url prefix + if fields[f][-1] in '/': + L.error('ORCiD number in %s field has a trailing slash.') + print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) + exit(1) + assert valid_orcid(fields[f]) + L.info('Loaded json info has passed checks.') + return + except ValueError as e: + L.error('No "%s" field found in json.' % f) + print('Please add the "%s" field to the json and re-run the script.' % f) + exit(1) + except AssertionError as e: + L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) + print('Please correct the ORCiD number in field "%s"' % f) + exit(1) From dabcbeb3a4b7843b62754d9c603cf05a39e23a43 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 14 Dec 2022 16:07:03 -0800 Subject: [PATCH 026/301] adding logging to json read/write fxs --- mnonboard/mnutils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 6f848972..04c437bd 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -15,6 +15,7 @@ def load_json(loc): """ Load json from file. """ + L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: return json.load(f) @@ -29,6 +30,7 @@ def save_json(loc, jf): """ Output json to file. """ + L.info('Writing member node json to %s' % loc) with open(loc, 'w') as f: json.dump(jf, f) From 28b04e566c44eb450b32412f6810ffa0a0e8aee0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 08:21:47 -0800 Subject: [PATCH 027/301] adding orcid url prefix definition --- mnonboard/defs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 4029228a..313f9efe 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,4 +1,5 @@ +ORCID_PREFIX = 'https://orcid.org/' DEFAULT_JSON = r'''{ "node": { From 77555b4a3d22a6f3e1f1e65ca94259550eee662e Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 08:22:27 -0800 Subject: [PATCH 028/301] fixing bugs and adding context --- mnonboard/mnutils.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 04c437bd..378b1aa4 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -1,7 +1,7 @@ import json import pyshacl -from defs import DEFAULT_JSON, FIELDS, FILL_FIELDS, SITEMAP_URLS +from defs import DEFAULT_JSON, FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX from mnonboard import L def default_json(): @@ -61,6 +61,7 @@ def valid_orcid(orcid): try: # int exists in correct position, next test int(orcid[i]) + continue except ValueError as e: # fail (not an integer) #print('valueerror at %s' % i) @@ -121,7 +122,7 @@ def enter_orcid(prompt): L.info('User has entered ORCiD number %s' % o) # make sure user has entered a valid ORCiD number if valid_orcid(o): - return o + return ORCID_PREFIX + o else: L.warning("Invalid ORCiD number entered: %s" % o) print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') @@ -152,14 +153,15 @@ def input_test(fields): for f in FILL_FIELDS: try: if f in ('contact_subject', 'default_submitter', 'default_owner'): - # orcid number will be preceded by a https://orcid.org/ url prefix + # orcid number will be preceded by a url prefix but no trailing slash + if ORCID_PREFIX not in fields[f]: + L.error('ORCiD number in %s field does not have the correct URL prefix.' % (f)) + print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field %s' % (ORCID_PREFIX,f)) if fields[f][-1] in '/': L.error('ORCiD number in %s field has a trailing slash.') print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) exit(1) - assert valid_orcid(fields[f]) - L.info('Loaded json info has passed checks.') - return + assert valid_orcid(fields[f].split('/')[-1]) except ValueError as e: L.error('No "%s" field found in json.' % f) print('Please add the "%s" field to the json and re-run the script.' % f) @@ -168,3 +170,5 @@ def input_test(fields): L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) print('Please correct the ORCiD number in field "%s"' % f) exit(1) + L.info('Loaded json info has passed checks.') + return True From 9023acad6ed49af2cc439663e5271987f85b3f60 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 08:31:18 -0800 Subject: [PATCH 029/301] moving collections and checks to new module; mnutils for ops stuff --- mnonboard/info_chx.py | 143 +++++++++++++++++++++++++++++++++++++++++ mnonboard/mnonboard.py | 5 +- mnonboard/mnutils.py | 140 +--------------------------------------- 3 files changed, 147 insertions(+), 141 deletions(-) create mode 100644 mnonboard/info_chx.py diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py new file mode 100644 index 00000000..d5d30c12 --- /dev/null +++ b/mnonboard/info_chx.py @@ -0,0 +1,143 @@ +from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX +from mnonboard import L + +# user info checks + +def valid_orcid(orcid): + """ + Checks the validity of an ORCiD number. + + ORCiDs have 4 groupings of 4 of integers separated by dashes (-) + for a total of 19 characters, thus `0000-0000-0000-0000` is valid + but `0000-0000-00000-000` and `0000-0000-0000-000` are not. + + This seems like overkill but is probably good to have since it will be + used to store contacts for database upkeep/maintenance. + """ + if (len(orcid) == 19): + # it's 19 characters long. start test loop + for i in range(0,19): + # does it have a dash (-) in positions 5, 10, and 15? + if i in (4, 9, 14): + if orcid[i] in '-': + # dash exists in correct position, next test + continue + else: + # fail (not a dash) + #print('no dash at %s' % i) + L.warning('ORCiD number failed check (%s has no dash in position %s)' % (orcid, i+1)) + return False + try: + # int exists in correct position, next test + int(orcid[i]) + continue + except ValueError as e: + # fail (not an integer) + #print('valueerror at %s' % i) + L.warning('ORCiD number failed check (%s has no integer in position %s)' % (orcid, i+1)) + return False + # pass + L.info('ORCiD number passed checks. (%s)' % orcid) + return True + else: + # fail (not 19 characters) + #print('not 19 chars') + return False + +def sitemap_urls(num_urls): + """ + Collect the sitemap URLs. + Usually there will be just one of these but we will prepare for more. + """ + i = 0 + while i < num_urls: + # add URLs one at a time (should only be a few at most) + # if we start getting MNs with 10+ sitemap URLs, maybe we change to accept lists + SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) + L.info('Sitemap URL #%s: %s' % (i+1, SITEMAP_URLS[i])) + i += 1 + return SITEMAP_URLS + +def enter_int(prompt): + """ + Make sure the user enters an integer value of 1 or greater. + """ + i = None + while True: + # make sure user enters an int + try: + # ask the user for input + i = input(prompt) + L.info('User has entered %s' % i) + i = int(i) + # must be 1 or greater + assert i >= 1 + # tests ok + return i + except ValueError as e: + L.warning('Not an integer. Error text: %s' % e) + print('Please enter an integer.') + except AssertionError as e: + L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) + print('Please enter 1 or greater.') + +def enter_orcid(prompt): + """ + Make sure the user enters an integer value of 1 or greater. + """ + while True: + # ask the user for an ORCiD number + o = input(prompt) + L.info('User has entered ORCiD number %s' % o) + # make sure user has entered a valid ORCiD number + if valid_orcid(o): + return ORCID_PREFIX + o + else: + L.warning("Invalid ORCiD number entered: %s" % o) + print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') + +def user_input(): + """ + We need a few pieces of information to fill the json fields. + """ + L.info('Collecting user input (mnonboard.mnutils.user_input()).') + for f in FIELDS: + if f in 'num_sitemap_urls': + FIELDS[f][1] = enter_int(FIELDS[f][0]) + elif f in ('contact_subject', 'default_submitter', 'default_owner'): + FIELDS[f][1] = enter_orcid(FIELDS[f][0]) + else: + FIELDS[f][1] = input(FIELDS[f][0]) + # add the sitemap URLs field now that we're done with the loops + FIELDS['sitemap_urls'] = ['Sitemap URLs: ', {}] + # pass the number of mn sitemap URLs to sitemap_urls() + # fx will ask the user to enter the URL(s) and return them as a dict + # we then store it as the second list item in the 'sitemap_urls' field + FIELDS['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) + return FIELDS + +def input_test(fields): + # first, test that there are the fields we need + L.info('Running mnonboard.mnutils.input_test() on imported json.') + for f in FILL_FIELDS: + try: + if f in ('contact_subject', 'default_submitter', 'default_owner'): + # orcid number will be preceded by a url prefix but no trailing slash + if ORCID_PREFIX not in fields[f]: + L.error('ORCiD number in %s field does not have the correct URL prefix.' % (f)) + print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field %s' % (ORCID_PREFIX,f)) + if fields[f][-1] in '/': + L.error('ORCiD number in %s field has a trailing slash.') + print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) + exit(1) + assert valid_orcid(fields[f].split('/')[-1]) + except ValueError as e: + L.error('No "%s" field found in json.' % f) + print('Please add the "%s" field to the json and re-run the script.' % f) + exit(1) + except AssertionError as e: + L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) + print('Please correct the ORCiD number in field "%s"' % f) + exit(1) + L.info('Loaded json info has passed checks.') + return True diff --git a/mnonboard/mnonboard.py b/mnonboard/mnonboard.py index ce458d40..ede6e250 100644 --- a/mnonboard/mnonboard.py +++ b/mnonboard/mnonboard.py @@ -6,6 +6,7 @@ from mnonboard import L import mnutils +import info_chx from opersist.cli import getOpersistInstance @click.command() @@ -20,11 +21,11 @@ def main(ctx, jsonfile): if jsonfile is None: # do the full user-driven info gathering process - fields = mnutils.user_input() + fields = info_chx.user_input() else: # grab the info from a json fields = mnutils.load_json(jsonfile) - mnutils.input_test(fields) + info_chx.input_test(fields) if __name__ == '__main__': main(ctx=None, jsonfile=None) diff --git a/mnonboard/mnutils.py b/mnonboard/mnutils.py index 378b1aa4..4eeeade0 100644 --- a/mnonboard/mnutils.py +++ b/mnonboard/mnutils.py @@ -1,7 +1,7 @@ import json import pyshacl -from defs import DEFAULT_JSON, FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX +from defs import DEFAULT_JSON from mnonboard import L def default_json(): @@ -34,141 +34,3 @@ def save_json(loc, jf): with open(loc, 'w') as f: json.dump(jf, f) -def valid_orcid(orcid): - """ - Checks the validity of an ORCiD number. - - ORCiDs have 4 groupings of 4 of integers separated by dashes (-) - for a total of 19 characters, thus `0000-0000-0000-0000` is valid - but `0000-0000-00000-000` and `0000-0000-0000-000` are not. - - This seems like overkill but is probably good to have since it will be - used to store contacts for database upkeep/maintenance. - """ - if (len(orcid) == 19): - # it's 19 characters long. start test loop - for i in range(0,19): - # does it have a dash (-) in positions 5, 10, and 15? - if i in (4, 9, 14): - if orcid[i] in '-': - # dash exists in correct position, next test - continue - else: - # fail (not a dash) - #print('no dash at %s' % i) - L.warning('ORCiD number failed check (%s has no dash in position %s)' % (orcid, i+1)) - return False - try: - # int exists in correct position, next test - int(orcid[i]) - continue - except ValueError as e: - # fail (not an integer) - #print('valueerror at %s' % i) - L.warning('ORCiD number failed check (%s has no integer in position %s)' % (orcid, i+1)) - return False - # pass - L.info('ORCiD number passed checks. (%s)' % orcid) - return True - else: - # fail (not 19 characters) - #print('not 19 chars') - return False - -def sitemap_urls(num_urls): - """ - Collect the sitemap URLs. - Usually there will be just one of these but we will prepare for more. - """ - i = 0 - while i < num_urls: - # add URLs one at a time (should only be a few at most) - # if we start getting MNs with 10+ sitemap URLs, maybe we change to accept lists - SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) - L.info('Sitemap URL #%s: %s' % (i+1, SITEMAP_URLS[i])) - i += 1 - return SITEMAP_URLS - -def enter_int(prompt): - """ - Make sure the user enters an integer value of 1 or greater. - """ - i = None - while True: - # make sure user enters an int - try: - # ask the user for input - i = input(prompt) - L.info('User has entered %s' % i) - i = int(i) - # must be 1 or greater - assert i >= 1 - # tests ok - return i - except ValueError as e: - L.warning('Not an integer. Error text: %s' % e) - print('Please enter an integer.') - except AssertionError as e: - L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) - print('Please enter 1 or greater.') - -def enter_orcid(prompt): - """ - Make sure the user enters an integer value of 1 or greater. - """ - while True: - # ask the user for an ORCiD number - o = input(prompt) - L.info('User has entered ORCiD number %s' % o) - # make sure user has entered a valid ORCiD number - if valid_orcid(o): - return ORCID_PREFIX + o - else: - L.warning("Invalid ORCiD number entered: %s" % o) - print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') - -def user_input(): - """ - We need a few pieces of information to fill the json fields. - """ - L.info('Collecting user input (mnonboard.mnutils.user_input()).') - for f in FIELDS: - if f in 'num_sitemap_urls': - FIELDS[f][1] = enter_int(FIELDS[f][0]) - elif f in ('contact_subject', 'default_submitter', 'default_owner'): - FIELDS[f][1] = enter_orcid(FIELDS[f][0]) - else: - FIELDS[f][1] = input(FIELDS[f][0]) - # add the sitemap URLs field now that we're done with the loops - FIELDS['sitemap_urls'] = ['Sitemap URLs: ', {}] - # pass the number of mn sitemap URLs to sitemap_urls() - # fx will ask the user to enter the URL(s) and return them as a dict - # we then store it as the second list item in the 'sitemap_urls' field - FIELDS['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) - return FIELDS - -def input_test(fields): - # first, test that there are the fields we need - L.info('Running mnonboard.mnutils.input_test() on imported json.') - for f in FILL_FIELDS: - try: - if f in ('contact_subject', 'default_submitter', 'default_owner'): - # orcid number will be preceded by a url prefix but no trailing slash - if ORCID_PREFIX not in fields[f]: - L.error('ORCiD number in %s field does not have the correct URL prefix.' % (f)) - print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field %s' % (ORCID_PREFIX,f)) - if fields[f][-1] in '/': - L.error('ORCiD number in %s field has a trailing slash.') - print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) - exit(1) - assert valid_orcid(fields[f].split('/')[-1]) - except ValueError as e: - L.error('No "%s" field found in json.' % f) - print('Please add the "%s" field to the json and re-run the script.' % f) - exit(1) - except AssertionError as e: - L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) - print('Please correct the ORCiD number in field "%s"' % f) - exit(1) - L.info('Loaded json info has passed checks.') - return True From b8d1823292a5860ff065eb35f06be39ca563e2b6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 09:44:05 -0800 Subject: [PATCH 030/301] changed my mind, going with getopt not click --- mnonboard/cli.py | 46 ++++++++++++++++++++++++++++++ mnonboard/data_chx.py | 3 ++ mnonboard/defs.py | 10 +++++++ mnonboard/mnonboard.py | 31 -------------------- mnonboard/{mnutils.py => utils.py} | 0 5 files changed, 59 insertions(+), 31 deletions(-) create mode 100644 mnonboard/cli.py create mode 100644 mnonboard/data_chx.py delete mode 100644 mnonboard/mnonboard.py rename mnonboard/{mnutils.py => utils.py} (100%) diff --git a/mnonboard/cli.py b/mnonboard/cli.py new file mode 100644 index 00000000..f8565c92 --- /dev/null +++ b/mnonboard/cli.py @@ -0,0 +1,46 @@ +import os, sys +import subprocess +import getopt + +import utils +import info_chx +from defs import CFG, HELP_TEXT +from mnonboard import L +from opersist.cli import getOpersistInstance + + +def init_repo(loc): + ''' + Initialize a new instance using opersist. + ''' + subprocess.call('opersist -f %s' % (loc)) + + +def run(cfg): + """ + Wrapper around opersist that simplifies the process of onboarding a new + member node to DataONE. + """ + if cfg['load_json'] is False: + # do the full user-driven info gathering process + fields = info_chx.user_input() + else: + # grab the info from a json + fields = utils.load_json(cfg['json_file']) + info_chx.input_test(fields) + + +def main(): + """ + Uses getopt to set config values in order to call run(). + """ + # get arguments + try: + opts = getopt.getopt(sys.argv[1:], 'hid:l:', + ['help', 'init', 'dump=' 'load='] + )[0] + except Exception as e: + L.error('Error: %s' % e) + +if __name__ == '__main__': + main() # type: ignore diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py new file mode 100644 index 00000000..e961466a --- /dev/null +++ b/mnonboard/data_chx.py @@ -0,0 +1,3 @@ +import pyshacl + + diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 313f9efe..5df0b01c 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,6 +1,16 @@ ORCID_PREFIX = 'https://orcid.org/' +CFG = { + 'load_json': False, + 'json_file': 'node.json', + +} + +HELP_TEXT = """DataONE member node onboard script +v0.0.1 NCEAS/Ian Nesbitt +""" + DEFAULT_JSON = r'''{ "node": { "node_id": "", diff --git a/mnonboard/mnonboard.py b/mnonboard/mnonboard.py deleted file mode 100644 index ede6e250..00000000 --- a/mnonboard/mnonboard.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -import sys -import json -import click -import pyshacl - -from mnonboard import L -import mnutils -import info_chx -from opersist.cli import getOpersistInstance - -@click.command() -@click.option("-j", "--jsonfile", default=None, - help="JSON file to load (defaults to None).") -@click.pass_context -def main(ctx, jsonfile): - """ - Wrapper around opersist that simplifies the process of onboarding a new - member node to DataONE. - """ - - if jsonfile is None: - # do the full user-driven info gathering process - fields = info_chx.user_input() - else: - # grab the info from a json - fields = mnutils.load_json(jsonfile) - info_chx.input_test(fields) - -if __name__ == '__main__': - main(ctx=None, jsonfile=None) diff --git a/mnonboard/mnutils.py b/mnonboard/utils.py similarity index 100% rename from mnonboard/mnutils.py rename to mnonboard/utils.py From 03cd9ba049998c1d7e17ae69debf8467bef88a37 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 10:25:34 -0800 Subject: [PATCH 031/301] adding clarification --- mnonboard/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index f3978ec0..2e371c5a 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -13,7 +13,7 @@ # absolute path of current file CUR_PATH_ABS = os.path.dirname(os.path.abspath(__file__)) -# relative path to nodes directory +# relative path from root of mnlite dir to nodes directory NODE_PATH_REL = 'instance/nodes/' def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS): From 2e8be6835bc5cb2b12c22ffe14f746087456ca87 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 10:26:14 -0800 Subject: [PATCH 032/301] adding logic for save and initialization --- mnonboard/utils.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 4eeeade0..18aaae10 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -1,5 +1,5 @@ import json -import pyshacl +import subprocess from defs import DEFAULT_JSON from mnonboard import L @@ -18,7 +18,9 @@ def load_json(loc): L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: - return json.load(f) + json.load(f) + L.info('File loaded from %s' % loc) + return except FileNotFoundError as e: L.error('File does not exist - %s' % e) exit(1) @@ -31,6 +33,24 @@ def save_json(loc, jf): Output json to file. """ L.info('Writing member node json to %s' % loc) - with open(loc, 'w') as f: - json.dump(jf, f) + try: + with open(loc, 'w') as f: + json.dump(jf, f) + L.info('File written to %s' % loc) + return + except FileExistsError as e: + L.error('File exists - %s' % e) + exit(1) + except Exception as e: + L.error('Error: %s' % e) + exit(1) +def init_repo(loc): + ''' + Initialize a new instance using opersist. + ''' + try: + assert subprocess.call('opersist -f %s init' % (loc)) == 0 + except AssertionError as e: + L.error('opersist command failed: %s' % e) + exit(1) From 3486aedf5f37376f3c702b8e7d0cfd30017f2ffd Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 10:27:04 -0800 Subject: [PATCH 033/301] updating config structure --- mnonboard/defs.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 5df0b01c..7b0cdbac 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -2,9 +2,8 @@ ORCID_PREFIX = 'https://orcid.org/' CFG = { - 'load_json': False, + 'mode': 'user', 'json_file': 'node.json', - } HELP_TEXT = """DataONE member node onboard script From 4edc3218eb1f90dbd704fc565677e4b35eb9ba7f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 10:27:53 -0800 Subject: [PATCH 034/301] adding structure --- mnonboard/cli.py | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index f8565c92..e9f01506 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -1,19 +1,14 @@ import os, sys -import subprocess import getopt import utils import info_chx from defs import CFG, HELP_TEXT from mnonboard import L +from mnonboard import node_path from opersist.cli import getOpersistInstance -def init_repo(loc): - ''' - Initialize a new instance using opersist. - ''' - subprocess.call('opersist -f %s' % (loc)) def run(cfg): @@ -21,13 +16,19 @@ def run(cfg): Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ - if cfg['load_json'] is False: + if cfg['mode'] is 'user': # do the full user-driven info gathering process fields = info_chx.user_input() else: # grab the info from a json fields = utils.load_json(cfg['json_file']) info_chx.input_test(fields) + # now we're cooking + # get the node path using the end of the path in the 'subject' field + loc = node_path(fields['node']['subject'].split('/')[-1]) + # initialize a repository there + utils.init_repo(loc) + def main(): @@ -41,6 +42,26 @@ def main(): )[0] except Exception as e: L.error('Error: %s' % e) + print(HELP_TEXT) + exit(1) + for o, a in opts: + if o in ('-h', '--help'): + print(HELP_TEXT) + exit(0) + if o in ('-i', '--init'): + # do data gathering + CFG['mode'] = 'user' + run(CFG) + if o in ('-d', '--dump='): + # dump default json to file + utils.save_json(a, utils.default_json()) + if o in ('-l', '--load='): + # load from json file + CFG['mode'] = 'json' + CFG['json_file'] = a + run(CFG) + + if __name__ == '__main__': main() # type: ignore From e551e890c24e8dda2f554b1542689284bff512fd Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 11:34:26 -0800 Subject: [PATCH 035/301] adding subject creation function --- mnonboard/utils.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 18aaae10..38901b02 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -52,5 +52,13 @@ def init_repo(loc): try: assert subprocess.call('opersist -f %s init' % (loc)) == 0 except AssertionError as e: - L.error('opersist command failed: %s' % e) + L.error('opersist init command failed (node folder: %s): %s' % (loc, e)) exit(1) + +def new_subject(loc, name, orcid): + try: + assert subprocess.call('opersist -f %s sub -n "%s" -s %s' % (loc, name, orcid)) == 0 + except AssertionError as e: + L.error('opersist subject creation command failed for %s (%s): %s' % (name, orcid, e)) + exit(1) + From 229223bd09945c5ebec041be77405daa45bb855c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 11:34:50 -0800 Subject: [PATCH 036/301] adding structure to run --- mnonboard/cli.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index e9f01506..d78c7516 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -3,7 +3,7 @@ import utils import info_chx -from defs import CFG, HELP_TEXT +from defs import CFG, HELP_TEXT, DEFAULT_JSON from mnonboard import L from mnonboard import node_path from opersist.cli import getOpersistInstance @@ -16,9 +16,10 @@ def run(cfg): Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ + fields = DEFAULT_JSON if cfg['mode'] is 'user': # do the full user-driven info gathering process - fields = info_chx.user_input() + fields, dbinfo = info_chx.user_input() else: # grab the info from a json fields = utils.load_json(cfg['json_file']) @@ -28,7 +29,10 @@ def run(cfg): loc = node_path(fields['node']['subject'].split('/')[-1]) # initialize a repository there utils.init_repo(loc) - + for f in ('default_owner', 'default_submitter'): + # if mode is json maybe we use scrapy here to get orcid user's name + name = 'Test User' + utils.new_subject(loc, name, fields[f]) def main(): From 431e318802c53f734a248f83469298a9e4b3bf50 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 14:53:55 -0800 Subject: [PATCH 037/301] bug fixes and added structure --- mnonboard/cli.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index d78c7516..e33215bf 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -6,9 +6,6 @@ from defs import CFG, HELP_TEXT, DEFAULT_JSON from mnonboard import L from mnonboard import node_path -from opersist.cli import getOpersistInstance - - def run(cfg): @@ -17,7 +14,7 @@ def run(cfg): member node to DataONE. """ fields = DEFAULT_JSON - if cfg['mode'] is 'user': + if cfg['mode'] == 'user': # do the full user-driven info gathering process fields, dbinfo = info_chx.user_input() else: @@ -31,7 +28,12 @@ def run(cfg): utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): # if mode is json maybe we use scrapy here to get orcid user's name - name = 'Test User' + try: + # try to get the user's name from their orcid record + name = info_chx.scr_orcid_name(fields[f]) + except Exception as e: + L.warning('Was not able to scrape name from orcid record %s' % fields[f]) + utils.new_subject(loc, name, fields[f]) @@ -66,6 +68,5 @@ def main(): run(CFG) - if __name__ == '__main__': main() # type: ignore From 9141e0d5c63044e95ffff5edf8fb7f256f6b6ad3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 14:55:25 -0800 Subject: [PATCH 038/301] adding help text and restructuring fields var --- mnonboard/defs.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 7b0cdbac..0bbc2f7a 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -8,6 +8,18 @@ HELP_TEXT = """DataONE member node onboard script v0.0.1 NCEAS/Ian Nesbitt + +Usage: cli [ OPTIONS ] +where OPTIONS := { + -h | --help + display this help message + -i | --init + initialize a new member node from scratch + -l | --load + initialize a new member node from a json file + -d | --dump + dump default member node json file to configure manually +} """ DEFAULT_JSON = r'''{ @@ -44,10 +56,12 @@ ''' FIELDS = { - 'node_id': ['Member node identifier (must be unique): ', None], - 'name': ['Repository name: ', None], - 'description': ['Repository description: ', None], - 'base_url': ['Base URL of repository: ', None], + 'node': { + 'node_id': ['Member node identifier (must be unique): ', None], + 'name': ['Repository name: ', None], + 'description': ['Repository description: ', None], + 'base_url': ['Base URL of repository: ', None], + }, 'contact_subject_name': ['Repository technical contact name: ', None], 'contact_subject': ["Technical contact's ORCiD number: ", None], 'default_submitter_name': ['Repository submitter name: ', None], From be6717fd44f70206673694e83c5cfecf3b4ff881 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 14:56:24 -0800 Subject: [PATCH 039/301] adding spiders file --- mnonboard/spiders.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 mnonboard/spiders.py diff --git a/mnonboard/spiders.py b/mnonboard/spiders.py new file mode 100644 index 00000000..f549fee1 --- /dev/null +++ b/mnonboard/spiders.py @@ -0,0 +1,13 @@ +from scrapy import Spider +from scrapy.crawler import CrawlerProcess + +from mnonboard import L + +class OrcidSpider(Spider): + name = "orcid_name_spider" + allowed_domains = ["orcid.org"] + logging = L + + def parse(self, response): + self.orcid_name = response.xpath('//h1[@class="name orc-font-heading-small"]/text()').extract() + self.logging.info('Found name from ORCiD record: %s' % self.orcid_name) From 1753fe6a0eb7444fabda647c264e80fdb239fcc6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 15 Dec 2022 14:57:11 -0800 Subject: [PATCH 040/301] adding orcid spider call --- mnonboard/info_chx.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index d5d30c12..fe3df4db 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -1,3 +1,4 @@ +from spiders import OrcidSpider from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX from mnonboard import L @@ -102,10 +103,13 @@ def user_input(): """ L.info('Collecting user input (mnonboard.mnutils.user_input()).') for f in FIELDS: - if f in 'num_sitemap_urls': - FIELDS[f][1] = enter_int(FIELDS[f][0]) + if f in 'node': + for nf in FIELDS[f]: + FIELDS[f][nf][1] = input(FIELDS[f][0]) elif f in ('contact_subject', 'default_submitter', 'default_owner'): FIELDS[f][1] = enter_orcid(FIELDS[f][0]) + elif f in 'num_sitemap_urls': + FIELDS[f][1] = enter_int(FIELDS[f][0]) else: FIELDS[f][1] = input(FIELDS[f][0]) # add the sitemap URLs field now that we're done with the loops @@ -117,6 +121,9 @@ def user_input(): return FIELDS def input_test(fields): + """ + Testing the manually filled json file. + """ # first, test that there are the fields we need L.info('Running mnonboard.mnutils.input_test() on imported json.') for f in FILL_FIELDS: @@ -141,3 +148,6 @@ def input_test(fields): exit(1) L.info('Loaded json info has passed checks.') return True + +def scr_orcid_name(orcid_url): + orcid_spider = OrcidSpider() From c26a58ae13d04ad8a870beccc7a21ea2c02719c5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 10:31:14 -0800 Subject: [PATCH 041/301] scratch that, rendering javascript is not worth it --- mnonboard/cli.py | 8 +------- mnonboard/info_chx.py | 3 --- mnonboard/spiders.py | 13 ------------- 3 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 mnonboard/spiders.py diff --git a/mnonboard/cli.py b/mnonboard/cli.py index e33215bf..2c2e93a8 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -27,13 +27,7 @@ def run(cfg): # initialize a repository there utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): - # if mode is json maybe we use scrapy here to get orcid user's name - try: - # try to get the user's name from their orcid record - name = info_chx.scr_orcid_name(fields[f]) - except Exception as e: - L.warning('Was not able to scrape name from orcid record %s' % fields[f]) - + name = input('Please enter the name of ORCiD user %s (%s): ' % (fields[f], f)) utils.new_subject(loc, name, fields[f]) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index fe3df4db..0c893178 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -148,6 +148,3 @@ def input_test(fields): exit(1) L.info('Loaded json info has passed checks.') return True - -def scr_orcid_name(orcid_url): - orcid_spider = OrcidSpider() diff --git a/mnonboard/spiders.py b/mnonboard/spiders.py deleted file mode 100644 index f549fee1..00000000 --- a/mnonboard/spiders.py +++ /dev/null @@ -1,13 +0,0 @@ -from scrapy import Spider -from scrapy.crawler import CrawlerProcess - -from mnonboard import L - -class OrcidSpider(Spider): - name = "orcid_name_spider" - allowed_domains = ["orcid.org"] - logging = L - - def parse(self, response): - self.orcid_name = response.xpath('//h1[@class="name orc-font-heading-small"]/text()').extract() - self.logging.info('Found name from ORCiD record: %s' % self.orcid_name) From 4ad964ed9991f6c12b4a18ca3f65e84c39112142 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 11:34:25 -0800 Subject: [PATCH 042/301] cleaning up --- mnonboard/cli.py | 2 +- mnonboard/info_chx.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 2c2e93a8..37d78232 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -27,7 +27,7 @@ def run(cfg): # initialize a repository there utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): - name = input('Please enter the name of ORCiD user %s (%s): ' % (fields[f], f)) + name = info_chx.orcid_name(fields[f], f) utils.new_subject(loc, name, fields[f]) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 0c893178..7a9f2fc2 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -82,6 +82,15 @@ def enter_int(prompt): L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) print('Please enter 1 or greater.') +def orcid_name(orcid, f): + """ + Ask the user for the name of an orcid number. + """ + L.info('Asking for name of ORCiD user %s (%s)' % (orcid, f)) + name = input('Please enter the name of ORCiD user %s (%s): ' % (orcid, f)) + L.info('User has entered %s' % name) + return name + def enter_orcid(prompt): """ Make sure the user enters an integer value of 1 or greater. From fe8c1d53ba1eafc6ec7f5b434da3b42ea4a465a1 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 15:49:33 -0800 Subject: [PATCH 043/301] adding indents --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 38901b02..8d9a21ca 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -35,7 +35,7 @@ def save_json(loc, jf): L.info('Writing member node json to %s' % loc) try: with open(loc, 'w') as f: - json.dump(jf, f) + json.dump(jf, f, indent=4) L.info('File written to %s' % loc) return except FileExistsError as e: From 00ae894b7f142349fcc90bc819c2f5f0556d2457 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 15:50:31 -0800 Subject: [PATCH 044/301] adding function to combine user input with mnlite json structure --- mnonboard/info_chx.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 7a9f2fc2..12540877 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -1,5 +1,6 @@ -from spiders import OrcidSpider -from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX +import json + +from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX, DEFAULT_JSON from mnonboard import L # user info checks @@ -129,6 +130,18 @@ def user_input(): FIELDS['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) return FIELDS +def transfer_info(ufields): + """ + Take a user fields dict and translate it to the default json object. + """ + fields = json.loads(DEFAULT_JSON) + for f in ufields: + if f in 'node': + for nf in ufields[f]: + fields[f][nf] = ufields[f][nf] + fields[f] = ufields[f] + return fields + def input_test(fields): """ Testing the manually filled json file. From 714abd2a4e733c9ac97798de0598647770d04452 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 15:52:02 -0800 Subject: [PATCH 045/301] bug fix and adding to run function --- mnonboard/cli.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 37d78232..493e911b 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -13,10 +13,11 @@ def run(cfg): Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ - fields = DEFAULT_JSON + fields = utils.json.loads(DEFAULT_JSON) if cfg['mode'] == 'user': # do the full user-driven info gathering process - fields, dbinfo = info_chx.user_input() + ufields, dbinfo = info_chx.user_input() + fields = info_chx.transfer_info(ufields) else: # grab the info from a json fields = utils.load_json(cfg['json_file']) From 03f63b2ccb041afbb22fea779086b9afa9a1b3c2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 16:17:27 -0800 Subject: [PATCH 046/301] adding file logging --- mnonboard/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 2e371c5a..8ce65103 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -1,14 +1,27 @@ import os import logging +from datetime import datetime from opersist.cli import LOG_LEVELS, LOG_DATE_FORMAT, LOG_FORMAT +LOG_DIR = '/var/log/mnlite/' +LOG_NAME = 'mnonboard-%s.log' % datetime.now().strftime('%Y-%m-%d') +LOG_LOC = os.path.join(LOG_DIR, LOG_NAME) + logging.basicConfig( level=LOG_LEVELS.get("INFO", logging.INFO), format=LOG_FORMAT, datefmt=LOG_DATE_FORMAT, ) L = logging.getLogger("main") +formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) +# this initializes logging to file +f = logging.FileHandler(LOG_LOC) +f.setLevel('INFO') +f.setFormatter(formatter) +# warnings also go to file +# initialize logging +L.addHandler(f) # absolute path of current file CUR_PATH_ABS = os.path.dirname(os.path.abspath(__file__)) From 92788f6161f8c612117ea0ebce1e3c564639c160 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 16:55:47 -0800 Subject: [PATCH 047/301] adding logging start script and version --- mnonboard/__init__.py | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 8ce65103..0bfd495a 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -4,24 +4,31 @@ from opersist.cli import LOG_LEVELS, LOG_DATE_FORMAT, LOG_FORMAT +__version__ = 'v0.0.1' + LOG_DIR = '/var/log/mnlite/' LOG_NAME = 'mnonboard-%s.log' % datetime.now().strftime('%Y-%m-%d') LOG_LOC = os.path.join(LOG_DIR, LOG_NAME) -logging.basicConfig( - level=LOG_LEVELS.get("INFO", logging.INFO), - format=LOG_FORMAT, - datefmt=LOG_DATE_FORMAT, -) -L = logging.getLogger("main") -formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) -# this initializes logging to file -f = logging.FileHandler(LOG_LOC) -f.setLevel('INFO') -f.setFormatter(formatter) -# warnings also go to file -# initialize logging -L.addHandler(f) +def start_logging(): + logging.basicConfig( + level=LOG_LEVELS.get("INFO", logging.INFO), + format=LOG_FORMAT, + datefmt=LOG_DATE_FORMAT, + ) + l = logging.getLogger("main") + formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) + # this initializes logging to file + f = logging.FileHandler(LOG_LOC) + f.setLevel('INFO') + f.setFormatter(formatter) + # warnings also go to file + # initialize logging + l.addHandler(f) + return l + +L = start_logging() +L.info('----- mnonboard %s start -----' % __version__) # absolute path of current file CUR_PATH_ABS = os.path.dirname(os.path.abspath(__file__)) From e722d476a5fb6d0474d81aba6a1b9103467bb66a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 16:57:43 -0800 Subject: [PATCH 048/301] bug fixes --- mnonboard/cli.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 493e911b..8ace0a39 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -3,17 +3,16 @@ import utils import info_chx -from defs import CFG, HELP_TEXT, DEFAULT_JSON +from defs import CFG, HELP_TEXT from mnonboard import L from mnonboard import node_path - def run(cfg): """ Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ - fields = utils.json.loads(DEFAULT_JSON) + fields = utils.default_json() if cfg['mode'] == 'user': # do the full user-driven info gathering process ufields, dbinfo = info_chx.user_input() @@ -64,4 +63,4 @@ def main(): if __name__ == '__main__': - main() # type: ignore + main() From 27723e280dc33c8850b7f8e4a713aceb6ea35639 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 16:58:08 -0800 Subject: [PATCH 049/301] adding version --- mnonboard/defs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 0bbc2f7a..ba305804 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,3 +1,4 @@ +from mnonboard import __version__ ORCID_PREFIX = 'https://orcid.org/' @@ -7,7 +8,7 @@ } HELP_TEXT = """DataONE member node onboard script -v0.0.1 NCEAS/Ian Nesbitt +%s NCEAS/Ian Nesbitt Usage: cli [ OPTIONS ] where OPTIONS := { @@ -20,7 +21,7 @@ -d | --dump dump default member node json file to configure manually } -""" +""" % __version__ DEFAULT_JSON = r'''{ "node": { From 346f08449693b68ae84a124d21d37de5b115cdb9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 16 Dec 2022 16:58:42 -0800 Subject: [PATCH 050/301] adding context to logging --- mnonboard/info_chx.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 12540877..f260f639 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -135,11 +135,13 @@ def transfer_info(ufields): Take a user fields dict and translate it to the default json object. """ fields = json.loads(DEFAULT_JSON) + L.info('Adding user fields to default fields.') for f in ufields: if f in 'node': for nf in ufields[f]: fields[f][nf] = ufields[f][nf] fields[f] = ufields[f] + L.info('Successfully merged. Returning json object.') return fields def input_test(fields): From 1fd473c9aa04c4812894fa535915efdc1442b8c4 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 09:45:17 -0800 Subject: [PATCH 051/301] fixing bug --- mnonboard/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 8ace0a39..1d1b988a 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -38,7 +38,7 @@ def main(): # get arguments try: opts = getopt.getopt(sys.argv[1:], 'hid:l:', - ['help', 'init', 'dump=' 'load='] + ['help', 'init', 'dump=', 'load='] )[0] except Exception as e: L.error('Error: %s' % e) From 467886c4175fe5609e1302590ad67a66b3fb9033 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 09:46:56 -0800 Subject: [PATCH 052/301] bug fixes; url validation to separate function --- mnonboard/info_chx.py | 50 +++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index f260f639..d9be1eae 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -46,6 +46,20 @@ def valid_orcid(orcid): #print('not 19 chars') return False +def valid_url_prefix(url, prefix, f): + """ + Validate a URL prefix (such as for an ORCiD number). + """ + # orcid number will be preceded by a url prefix but no trailing slash + if prefix not in url: + L.error('ORCiD number in %s field does not have the correct URL prefix.' % (f)) + print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field %s' % (ORCID_PREFIX,f)) + if url[-1] in '/': + L.error('ORCiD number in %s field has a trailing slash.') + print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) + exit(1) + return + def sitemap_urls(num_urls): """ Collect the sitemap URLs. @@ -150,25 +164,23 @@ def input_test(fields): """ # first, test that there are the fields we need L.info('Running mnonboard.mnutils.input_test() on imported json.') - for f in FILL_FIELDS: - try: - if f in ('contact_subject', 'default_submitter', 'default_owner'): - # orcid number will be preceded by a url prefix but no trailing slash - if ORCID_PREFIX not in fields[f]: - L.error('ORCiD number in %s field does not have the correct URL prefix.' % (f)) - print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field %s' % (ORCID_PREFIX,f)) - if fields[f][-1] in '/': - L.error('ORCiD number in %s field has a trailing slash.') - print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) - exit(1) + f = '' + try: + # test orcid records + for f in FILL_FIELDS: + if f in ['default_submitter', 'default_owner']: + assert valid_url_prefix(fields[f], ORCID_PREFIX, f) assert valid_orcid(fields[f].split('/')[-1]) - except ValueError as e: - L.error('No "%s" field found in json.' % f) - print('Please add the "%s" field to the json and re-run the script.' % f) - exit(1) - except AssertionError as e: - L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) - print('Please correct the ORCiD number in field "%s"' % f) - exit(1) + f = "'node' -> 'contact_subject'" + assert valid_url_prefix(fields['node']['contact_subject'], ORCID_PREFIX, f) + assert valid_orcid(fields['node']['contact_subject'].split('/')[-1]) + except ValueError as e: + L.error('No "%s" field found in json.' % f) + print('Please add the "%s" field to the json and re-run the script.' % f) + exit(1) + except AssertionError as e: + L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) + print('Please correct the ORCiD number in field "%s"' % f) + exit(1) L.info('Loaded json info has passed checks.') return True From 546fbd9e4bdeaa29cb9c323dd9965b9211a625d6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 09:47:15 -0800 Subject: [PATCH 053/301] bug fix --- mnonboard/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 8d9a21ca..0e53b77e 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -18,9 +18,9 @@ def load_json(loc): L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: - json.load(f) + j = json.load(f) L.info('File loaded from %s' % loc) - return + return j except FileNotFoundError as e: L.error('File does not exist - %s' % e) exit(1) From 12f19c37467b688f4becf027695a7d37a7a27e50 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 09:50:37 -0800 Subject: [PATCH 054/301] bug fix --- mnonboard/info_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index d9be1eae..c2129b2f 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -58,7 +58,7 @@ def valid_url_prefix(url, prefix, f): L.error('ORCiD number in %s field has a trailing slash.') print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) exit(1) - return + return True def sitemap_urls(num_urls): """ From 0338243266bfb5389ca9a56135521ac5c4fceb9f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 11:31:14 -0800 Subject: [PATCH 055/301] bug fix --- mnonboard/info_chx.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index c2129b2f..aa9954d6 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -52,8 +52,9 @@ def valid_url_prefix(url, prefix, f): """ # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: - L.error('ORCiD number in %s field does not have the correct URL prefix.' % (f)) + L.error('ORCiD number in %s field does not have the correct URL prefix. (URL: %s)' % (f, url)) print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field %s' % (ORCID_PREFIX,f)) + exit(1) if url[-1] in '/': L.error('ORCiD number in %s field has a trailing slash.') print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) From 388f8aa1f168c1e9212c90d5106f729e415b2512 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 14:39:39 -0800 Subject: [PATCH 056/301] fixing a getopt problem --- mnonboard/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 1d1b988a..3e5a4820 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -52,10 +52,10 @@ def main(): # do data gathering CFG['mode'] = 'user' run(CFG) - if o in ('-d', '--dump='): + if o in ('-d', '--dump'): # dump default json to file utils.save_json(a, utils.default_json()) - if o in ('-l', '--load='): + if o in ('-l', '--load'): # load from json file CFG['mode'] = 'json' CFG['json_file'] = a From 353fca22013d5f60df10c999dccecb13c655b98e Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 15:48:28 -0800 Subject: [PATCH 057/301] adding json pretty printing function for visual checks --- mnonboard/cli.py | 2 ++ mnonboard/utils.py | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 3e5a4820..11c659a1 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -25,6 +25,8 @@ def run(cfg): # get the node path using the end of the path in the 'subject' field loc = node_path(fields['node']['subject'].split('/')[-1]) # initialize a repository there + json.dumps(fields, indent=4) + print(loc) utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): name = info_chx.orcid_name(fields[f], f) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0e53b77e..0d07009c 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -45,6 +45,12 @@ def save_json(loc, jf): L.error('Error: %s' % e) exit(1) +def dumps_json(js): + """ + Quick and dirty way to output formatted json. + """ + print(json.dumps(js, indent=4)) + def init_repo(loc): ''' Initialize a new instance using opersist. From e100bd93f9aec9fb439b63590e77735ed0a4c2d2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 15:50:15 -0800 Subject: [PATCH 058/301] changing to 2 indents --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0d07009c..dc067ef8 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -49,7 +49,7 @@ def dumps_json(js): """ Quick and dirty way to output formatted json. """ - print(json.dumps(js, indent=4)) + print(json.dumps(js, indent=2)) def init_repo(loc): ''' From f71d7783f91e3d9ff5528b1861ccb70149880aed Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 17:30:58 -0800 Subject: [PATCH 059/301] bug fix for opersist mn dir creation --- mnonboard/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 0bfd495a..2a0d5176 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -36,10 +36,10 @@ def start_logging(): # relative path from root of mnlite dir to nodes directory NODE_PATH_REL = 'instance/nodes/' -def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS): +def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS, nodedir=''): """ Get the absolute path of the nodes directory where new members will go. Currently the nodes directory lives at `../instance/nodes/` (relative to the mnonboard dir that this file is in). """ - return os.path.abspath(os.path.join(CUR_PATH_ABS, '../', NODE_PATH_REL)) + return os.path.abspath(os.path.join(curpath, '../', nodepath, nodedir)) From a7cba56023133cf61efea6610b85d1e5a2c1d9d8 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 17:33:33 -0800 Subject: [PATCH 060/301] correcting node path call and dumping json --- mnonboard/cli.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 11c659a1..ccf83344 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -23,14 +23,15 @@ def run(cfg): info_chx.input_test(fields) # now we're cooking # get the node path using the end of the path in the 'subject' field - loc = node_path(fields['node']['subject'].split('/')[-1]) + loc = node_path(nodedir=fields['node']['subject'].split('/')[-1]) # initialize a repository there - json.dumps(fields, indent=4) - print(loc) + utils.dumps_json(fields) utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): name = info_chx.orcid_name(fields[f], f) utils.new_subject(loc, name, fields[f]) + name = info_chx.orcid_name(fields['node']['contact_subject'], ['contact_subject']) + utils.new_subject(loc, name, fields['node']['contact_subject']) def main(): From b2fcec3f5de4c334ff4f8c8dcbed3894cbe47b74 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 17:34:27 -0800 Subject: [PATCH 061/301] moving two fields into correct sublevel --- mnonboard/defs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index ba305804..9e178e50 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -62,9 +62,9 @@ 'name': ['Repository name: ', None], 'description': ['Repository description: ', None], 'base_url': ['Base URL of repository: ', None], + 'contact_subject_name': ['Repository technical contact name: ', None], + 'contact_subject': ["Technical contact's ORCiD number: ", None], }, - 'contact_subject_name': ['Repository technical contact name: ', None], - 'contact_subject': ["Technical contact's ORCiD number: ", None], 'default_submitter_name': ['Repository submitter name: ', None], 'default_submitter': ["Submitter's ORCiD number: ", None], 'default_owner_name': ['Repository owner name: ', None], From c04382e9240098ae0046a02728d24c9670baa572 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 17:35:04 -0800 Subject: [PATCH 062/301] bug fix --- mnonboard/info_chx.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index aa9954d6..b7dccb03 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -102,9 +102,9 @@ def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. """ - L.info('Asking for name of ORCiD user %s (%s)' % (orcid, f)) - name = input('Please enter the name of ORCiD user %s (%s): ' % (orcid, f)) - L.info('User has entered %s' % name) + L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) + name = input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) + L.info('User has entered "%s"' % name) return name def enter_orcid(prompt): @@ -128,10 +128,15 @@ def user_input(): """ L.info('Collecting user input (mnonboard.mnutils.user_input()).') for f in FIELDS: + # the lowest level of the dict/json structure if f in 'node': for nf in FIELDS[f]: - FIELDS[f][nf][1] = input(FIELDS[f][0]) - elif f in ('contact_subject', 'default_submitter', 'default_owner'): + # the second level beneath 'node' + if nf in ['contact_subject']: + FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) + else: + FIELDS[f][nf][1] = input(FIELDS[f][nf][0]) + elif f in ('default_submitter', 'default_owner'): FIELDS[f][1] = enter_orcid(FIELDS[f][0]) elif f in 'num_sitemap_urls': FIELDS[f][1] = enter_int(FIELDS[f][0]) From a18c7a0c1acfae16dad1aa40a404c2222a95d7ec Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 17:35:40 -0800 Subject: [PATCH 063/301] using subprocess.run() --- mnonboard/utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index dc067ef8..1fbbc0e8 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -56,15 +56,15 @@ def init_repo(loc): Initialize a new instance using opersist. ''' try: - assert subprocess.call('opersist -f %s init' % (loc)) == 0 - except AssertionError as e: + subprocess.run(['opersist', '-f', loc, 'init'], check=True) + except Exception as e: L.error('opersist init command failed (node folder: %s): %s' % (loc, e)) exit(1) def new_subject(loc, name, orcid): try: - assert subprocess.call('opersist -f %s sub -n "%s" -s %s' % (loc, name, orcid)) == 0 - except AssertionError as e: + subprocess.run(['opersist', '-f', loc, 'sub', '-n', '"%s"' % name, '-s', orcid], check=True) + except Exception as e: L.error('opersist subject creation command failed for %s (%s): %s' % (name, orcid, e)) exit(1) From c79db0bd9d78c8534e080de4f975ba6ee5e39939 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 18:41:52 -0800 Subject: [PATCH 064/301] adding functions to utils --- mnonboard/__init__.py | 14 +++++--------- mnonboard/utils.py | 30 ++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 2a0d5176..b55c8fca 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -6,10 +6,14 @@ __version__ = 'v0.0.1' +FN_DATE = datetime.now().strftime('%Y-%m-%d') +YM_DATE = datetime.now().strftime('%Y-%m') LOG_DIR = '/var/log/mnlite/' -LOG_NAME = 'mnonboard-%s.log' % datetime.now().strftime('%Y-%m-%d') +LOG_NAME = 'mnonboard-%s.log' % FN_DATE LOG_LOC = os.path.join(LOG_DIR, LOG_NAME) +HARVEST_LOG_NAME = '-crawl-%s.log' % YM_DATE + def start_logging(): logging.basicConfig( level=LOG_LEVELS.get("INFO", logging.INFO), @@ -35,11 +39,3 @@ def start_logging(): # relative path from root of mnlite dir to nodes directory NODE_PATH_REL = 'instance/nodes/' - -def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS, nodedir=''): - """ - Get the absolute path of the nodes directory where new members will go. - Currently the nodes directory lives at `../instance/nodes/` (relative to - the mnonboard dir that this file is in). - """ - return os.path.abspath(os.path.join(curpath, '../', nodepath, nodedir)) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 1fbbc0e8..a340225e 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -1,8 +1,9 @@ +import os import json import subprocess from defs import DEFAULT_JSON -from mnonboard import L +from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME def default_json(): """ @@ -51,6 +52,14 @@ def dumps_json(js): """ print(json.dumps(js, indent=2)) +def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS, nodedir=''): + """ + Get the absolute path of the nodes directory where new members will go. + Currently the nodes directory lives at `../instance/nodes/` (relative to + the mnonboard dir that this file is in). + """ + return os.path.abspath(os.path.join(curpath, '../', nodepath, nodedir)) + def init_repo(loc): ''' Initialize a new instance using opersist. @@ -61,10 +70,23 @@ def init_repo(loc): L.error('opersist init command failed (node folder: %s): %s' % (loc, e)) exit(1) -def new_subject(loc, name, orcid): +def new_subject(loc, name, value): try: - subprocess.run(['opersist', '-f', loc, 'sub', '-n', '"%s"' % name, '-s', orcid], check=True) + subprocess.run(['opersist', '-f', loc, 'sub', '-n', '"%s"' % name, '-s', value], check=True) except Exception as e: - L.error('opersist subject creation command failed for %s (%s): %s' % (name, orcid, e)) + L.error('opersist subject creation command failed for %s (%s): %s' % (name, value, e)) exit(1) +def restart_mnlite(): + """ + Subprocess call to restart the mnlite system service. Requires sudo. + """ + subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) + +def harvest_data(loc, mn_name): + """ + + """ + log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) + subprocess.run(['scrapy', 'crawl', 'JsonldSpider', '-s', + 'STORE_PATH=%s' % loc, '>', log_loc, '2>&1']) From 3db220488bd063af4d8b24c32a4af0b08dd8c459 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 18:42:56 -0800 Subject: [PATCH 065/301] refactoring so names are in their own variable --- mnonboard/info_chx.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index b7dccb03..ba209f16 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -126,6 +126,7 @@ def user_input(): """ We need a few pieces of information to fill the json fields. """ + names = {} L.info('Collecting user input (mnonboard.mnutils.user_input()).') for f in FIELDS: # the lowest level of the dict/json structure @@ -134,12 +135,16 @@ def user_input(): # the second level beneath 'node' if nf in ['contact_subject']: FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) + elif '_name' in nf: + names[nf] = input(FIELDS[f][nf][0]) else: FIELDS[f][nf][1] = input(FIELDS[f][nf][0]) elif f in ('default_submitter', 'default_owner'): FIELDS[f][1] = enter_orcid(FIELDS[f][0]) elif f in 'num_sitemap_urls': FIELDS[f][1] = enter_int(FIELDS[f][0]) + elif '_name' in f: + names[f] = input(FIELDS[f][0]) else: FIELDS[f][1] = input(FIELDS[f][0]) # add the sitemap URLs field now that we're done with the loops @@ -148,7 +153,7 @@ def user_input(): # fx will ask the user to enter the URL(s) and return them as a dict # we then store it as the second list item in the 'sitemap_urls' field FIELDS['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) - return FIELDS + return FIELDS, names def transfer_info(ufields): """ From adfec7484a7a12dc1e855f0b788975ef4b23f9fb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 18:43:40 -0800 Subject: [PATCH 066/301] adding structure to primary function --- mnonboard/cli.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index ccf83344..6d4e8033 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -5,7 +5,6 @@ import info_chx from defs import CFG, HELP_TEXT from mnonboard import L -from mnonboard import node_path def run(cfg): """ @@ -13,25 +12,43 @@ def run(cfg): member node to DataONE. """ fields = utils.default_json() + names = {} if cfg['mode'] == 'user': # do the full user-driven info gathering process - ufields, dbinfo = info_chx.user_input() + ufields, names = info_chx.user_input() fields = info_chx.transfer_info(ufields) else: # grab the info from a json fields = utils.load_json(cfg['json_file']) info_chx.input_test(fields) + # still need to ask the user for some names + for f in ('default_owner', 'default_submitter'): + names[f] = info_chx.orcid_name(fields[f], f) + f = 'contact_subject' + names[f] = info_chx.orcid_name(fields['node'][f], f) # now we're cooking - # get the node path using the end of the path in the 'subject' field - loc = node_path(nodedir=fields['node']['subject'].split('/')[-1]) - # initialize a repository there + # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) + end_node_subj = fields['node']['subject'].split('/')[-1] + loc = utils.node_path(nodedir=end_node_subj) utils.dumps_json(fields) + print(names) + # initialize a repository there (step 5) utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): - name = info_chx.orcid_name(fields[f], f) - utils.new_subject(loc, name, fields[f]) - name = info_chx.orcid_name(fields['node']['contact_subject'], ['contact_subject']) - utils.new_subject(loc, name, fields['node']['contact_subject']) + # add a subject for owner and submitter (may not be necessary) + utils.new_subject(loc=loc, name=names[f], value=fields[f]) + f = 'contact_subject' + # add subject for technical contact (step 6) + utils.new_subject(loc=loc, name=names[f], value=fields['node'][f]) + # add node as a subject (step 7) + utils.new_subject(loc=loc, name=end_node_subj, value=fields['node']['node_id']) + # okay, now overwrite the default node.json with our new one (step 8) + utils.save_json(loc=os.path.join(loc, 'node.json'), jf=fields) + # restart the mnlite process to pick up the new node.json (step 9) + utils.restart_mnlite() + # run scrapy to harvest metadata (step 10) + utils.harvest_data(loc, end_node_subj) + # now run tests def main(): From 3908815041d47df07b40f17a0a88ce073826ea94 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 18:59:25 -0800 Subject: [PATCH 067/301] adding function to check metadata (placeholder for now) --- mnonboard/data_chx.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index e961466a..824af6a3 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -1,3 +1,7 @@ import pyshacl - +def test_mdata(): + """ + Using pyshacl to test harvested metadata. + """ + pass From b0e07ff14c7748d4e4539fdd771b6dcc569542a8 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 18:59:56 -0800 Subject: [PATCH 068/301] adding logging checkpoints --- mnonboard/utils.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index a340225e..bb818fa6 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -65,6 +65,7 @@ def init_repo(loc): Initialize a new instance using opersist. ''' try: + L.info('Using opersist to init new member node folder: %s' % loc) subprocess.run(['opersist', '-f', loc, 'init'], check=True) except Exception as e: L.error('opersist init command failed (node folder: %s): %s' % (loc, e)) @@ -72,6 +73,7 @@ def init_repo(loc): def new_subject(loc, name, value): try: + L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) subprocess.run(['opersist', '-f', loc, 'sub', '-n', '"%s"' % name, '-s', value], check=True) except Exception as e: L.error('opersist subject creation command failed for %s (%s): %s' % (name, value, e)) @@ -81,12 +83,18 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ + L.info('Restarting mnlite systemctl service...') subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) + L.info('Done.') def harvest_data(loc, mn_name): """ """ log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) + L.info('Starting scrapy crawl, saving to %s' % (loc)) + L.info('scrapy log location is %s' % (log_loc)) subprocess.run(['scrapy', 'crawl', 'JsonldSpider', '-s', - 'STORE_PATH=%s' % loc, '>', log_loc, '2>&1']) + 'STORE_PATH=%s' % loc, '>', log_loc, '2>&1'], + check=True) + L.info('scrapy crawl complete.') From 206ff05b59aefb428b153543d6e4346c04e4a6a9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 19:02:35 -0800 Subject: [PATCH 069/301] logging in placeholder --- mnonboard/data_chx.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 824af6a3..fe492a52 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -1,7 +1,9 @@ import pyshacl +from mnonboard import L + def test_mdata(): """ Using pyshacl to test harvested metadata. """ - pass + L.info('Starting metadata checks.') From 5959dbbc7c346d1f417f51fd17d4d77e437ecce2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 19 Dec 2022 19:02:50 -0800 Subject: [PATCH 070/301] adding checks placeholder --- mnonboard/cli.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 6d4e8033..87bc2d75 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -3,6 +3,7 @@ import utils import info_chx +import data_chx from defs import CFG, HELP_TEXT from mnonboard import L @@ -49,6 +50,7 @@ def run(cfg): # run scrapy to harvest metadata (step 10) utils.harvest_data(loc, end_node_subj) # now run tests + data_chx.test_mdata() def main(): From 24471fec839113bd5cf6d91141efa8e5de1e7c04 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 20 Dec 2022 08:39:10 -0800 Subject: [PATCH 071/301] adding base url validator --- mnonboard/info_chx.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index ba209f16..69958366 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -46,6 +46,17 @@ def valid_orcid(orcid): #print('not 19 chars') return False +def base_url(descrip): + """ + Validate the base URL of the member node. Should include trailing slash. + """ + while True: + url = input(descrip) + if url[-1] in '/': + return url + else: + L.warning('Base URL must contain a trailing slash. Please try again.') + def valid_url_prefix(url, prefix, f): """ Validate a URL prefix (such as for an ORCiD number). @@ -137,6 +148,11 @@ def user_input(): FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) elif '_name' in nf: names[nf] = input(FIELDS[f][nf][0]) + elif f in 'base_url': + baseurl = base_url(FIELDS[f][0]) + FIELDS[f][nf][1] = baseurl + # set the subject field as the base_url without trailing slash + FIELDS['node']['subject'] = baseurl[:-1] else: FIELDS[f][nf][1] = input(FIELDS[f][nf][0]) elif f in ('default_submitter', 'default_owner'): From 1ce64121df3464504ba0a8e3a8a83f4f8304216d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 20 Dec 2022 10:16:06 -0800 Subject: [PATCH 072/301] adding required input function and fixing bugs --- mnonboard/info_chx.py | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 69958366..20a52378 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -5,6 +5,17 @@ # user info checks +def req_input(desc): + while True: + i = input(desc) + L.info('User entry for %s"%s"' % (desc, i)) + if i != '': + return i + else: + desc_nocolon = desc.split(':')[0] + L.warning('Empty string entered.') + print('Please enter a value for %s.' % desc_nocolon) + def valid_orcid(orcid): """ Checks the validity of an ORCiD number. @@ -51,8 +62,9 @@ def base_url(descrip): Validate the base URL of the member node. Should include trailing slash. """ while True: - url = input(descrip) + url = req_input(descrip) if url[-1] in '/': + L.info('Base URL is %s' % url) return url else: L.warning('Base URL must contain a trailing slash. Please try again.') @@ -81,7 +93,7 @@ def sitemap_urls(num_urls): while i < num_urls: # add URLs one at a time (should only be a few at most) # if we start getting MNs with 10+ sitemap URLs, maybe we change to accept lists - SITEMAP_URLS[i] = input("Sitemap URL #%s: " % (i+1)) + SITEMAP_URLS[i] = req_input("Sitemap URL #%s: " % (i+1)) L.info('Sitemap URL #%s: %s' % (i+1, SITEMAP_URLS[i])) i += 1 return SITEMAP_URLS @@ -114,7 +126,7 @@ def orcid_name(orcid, f): Ask the user for the name of an orcid number. """ L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) - name = input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) + name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) L.info('User has entered "%s"' % name) return name @@ -124,8 +136,7 @@ def enter_orcid(prompt): """ while True: # ask the user for an ORCiD number - o = input(prompt) - L.info('User has entered ORCiD number %s' % o) + o = req_input(prompt) # make sure user has entered a valid ORCiD number if valid_orcid(o): return ORCID_PREFIX + o @@ -147,22 +158,22 @@ def user_input(): if nf in ['contact_subject']: FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) elif '_name' in nf: - names[nf] = input(FIELDS[f][nf][0]) + names[nf] = req_input(FIELDS[f][nf][0]) elif f in 'base_url': baseurl = base_url(FIELDS[f][0]) FIELDS[f][nf][1] = baseurl # set the subject field as the base_url without trailing slash FIELDS['node']['subject'] = baseurl[:-1] else: - FIELDS[f][nf][1] = input(FIELDS[f][nf][0]) + FIELDS[f][nf][1] = req_input(FIELDS[f][nf][0]) elif f in ('default_submitter', 'default_owner'): FIELDS[f][1] = enter_orcid(FIELDS[f][0]) elif f in 'num_sitemap_urls': FIELDS[f][1] = enter_int(FIELDS[f][0]) elif '_name' in f: - names[f] = input(FIELDS[f][0]) + names[f] = req_input(FIELDS[f][0]) else: - FIELDS[f][1] = input(FIELDS[f][0]) + FIELDS[f][1] = req_input(FIELDS[f][0]) # add the sitemap URLs field now that we're done with the loops FIELDS['sitemap_urls'] = ['Sitemap URLs: ', {}] # pass the number of mn sitemap URLs to sitemap_urls() @@ -177,11 +188,15 @@ def transfer_info(ufields): """ fields = json.loads(DEFAULT_JSON) L.info('Adding user fields to default fields.') + print(ufields) for f in ufields: - if f in 'node': + # take fields we want, ignore fields we don't want + if f in ['node', 'spider']: for nf in ufields[f]: - fields[f][nf] = ufields[f][nf] - fields[f] = ufields[f] + if '_name' not in nf: + fields[f][nf] = ufields[f][nf][1] + elif ('_name' not in f) and ('num_' not in f): + fields[f] = ufields[f][1] L.info('Successfully merged. Returning json object.') return fields From f4a5a0e81286c5f94d504852b5beea7e8b5c280c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 20 Dec 2022 11:25:53 -0800 Subject: [PATCH 073/301] changing to be compatible with default json --- mnonboard/defs.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 9e178e50..6b1e7f7d 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -62,6 +62,7 @@ 'name': ['Repository name: ', None], 'description': ['Repository description: ', None], 'base_url': ['Base URL of repository: ', None], + 'subject': ['Path of repository: ', None], 'contact_subject_name': ['Repository technical contact name: ', None], 'contact_subject': ["Technical contact's ORCiD number: ", None], }, @@ -83,6 +84,4 @@ 'sitemap_urls' ] -SITEMAP_URLS = { - 0: '', -} +SITEMAP_URLS = [] From 1ddc02b397c6a4246c7878f73ac59b753b366b60 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 20 Dec 2022 11:26:10 -0800 Subject: [PATCH 074/301] bug fixes --- mnonboard/cli.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 87bc2d75..00f0f7c6 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -23,24 +23,22 @@ def run(cfg): fields = utils.load_json(cfg['json_file']) info_chx.input_test(fields) # still need to ask the user for some names - for f in ('default_owner', 'default_submitter'): - names[f] = info_chx.orcid_name(fields[f], f) f = 'contact_subject' - names[f] = info_chx.orcid_name(fields['node'][f], f) + names[f+'_name'] = info_chx.orcid_name(fields['node'][f], f) + for f in ('default_owner', 'default_submitter'): + names[f+'_name'] = info_chx.orcid_name(fields[f], f) # now we're cooking # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) end_node_subj = fields['node']['subject'].split('/')[-1] loc = utils.node_path(nodedir=end_node_subj) - utils.dumps_json(fields) - print(names) # initialize a repository there (step 5) utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): # add a subject for owner and submitter (may not be necessary) - utils.new_subject(loc=loc, name=names[f], value=fields[f]) + utils.new_subject(loc=loc, name=names[f+'_name'], value=fields[f]) f = 'contact_subject' # add subject for technical contact (step 6) - utils.new_subject(loc=loc, name=names[f], value=fields['node'][f]) + utils.new_subject(loc=loc, name=names[f+'_name'], value=fields['node'][f]) # add node as a subject (step 7) utils.new_subject(loc=loc, name=end_node_subj, value=fields['node']['node_id']) # okay, now overwrite the default node.json with our new one (step 8) From ce233ffea026182f562bf47b111416d25b1682a4 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 20 Dec 2022 11:26:22 -0800 Subject: [PATCH 075/301] bug fixes --- mnonboard/info_chx.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 20a52378..7d804aac 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -2,14 +2,20 @@ from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX, DEFAULT_JSON from mnonboard import L +from opersist.utils import JSON_TIME_FORMAT, dtnow # user info checks +def not_empty(f): + """ + Test whether a string is empty. + """ + return f != '' def req_input(desc): while True: i = input(desc) L.info('User entry for %s"%s"' % (desc, i)) - if i != '': + if not_empty(i): return i else: desc_nocolon = desc.split(':')[0] @@ -92,8 +98,8 @@ def sitemap_urls(num_urls): i = 0 while i < num_urls: # add URLs one at a time (should only be a few at most) - # if we start getting MNs with 10+ sitemap URLs, maybe we change to accept lists - SITEMAP_URLS[i] = req_input("Sitemap URL #%s: " % (i+1)) + # if we start getting MNs with 10+ sitemap URLs, maybe we change to accept formatted lists from the user + SITEMAP_URLS.append(req_input("Sitemap URL #%s: " % (i+1))) L.info('Sitemap URL #%s: %s' % (i+1, SITEMAP_URLS[i])) i += 1 return SITEMAP_URLS @@ -149,6 +155,7 @@ def user_input(): We need a few pieces of information to fill the json fields. """ names = {} + baseurl = '' L.info('Collecting user input (mnonboard.mnutils.user_input()).') for f in FIELDS: # the lowest level of the dict/json structure @@ -158,12 +165,15 @@ def user_input(): if nf in ['contact_subject']: FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) elif '_name' in nf: + # put the contact subject name in a different dict names[nf] = req_input(FIELDS[f][nf][0]) - elif f in 'base_url': - baseurl = base_url(FIELDS[f][0]) + elif nf in 'base_url': + # get the base url + baseurl = base_url(FIELDS[f][nf][0]) FIELDS[f][nf][1] = baseurl + elif nf in 'subject': # set the subject field as the base_url without trailing slash - FIELDS['node']['subject'] = baseurl[:-1] + FIELDS[f][nf][1] = baseurl[:-1] else: FIELDS[f][nf][1] = req_input(FIELDS[f][nf][0]) elif f in ('default_submitter', 'default_owner'): @@ -175,11 +185,12 @@ def user_input(): else: FIELDS[f][1] = req_input(FIELDS[f][0]) # add the sitemap URLs field now that we're done with the loops - FIELDS['sitemap_urls'] = ['Sitemap URLs: ', {}] + FIELDS['spider'] = {} + FIELDS['spider']['sitemap_urls'] = ['Sitemap URLs: ', []] # pass the number of mn sitemap URLs to sitemap_urls() # fx will ask the user to enter the URL(s) and return them as a dict # we then store it as the second list item in the 'sitemap_urls' field - FIELDS['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) + FIELDS['spider']['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) return FIELDS, names def transfer_info(ufields): @@ -188,7 +199,6 @@ def transfer_info(ufields): """ fields = json.loads(DEFAULT_JSON) L.info('Adding user fields to default fields.') - print(ufields) for f in ufields: # take fields we want, ignore fields we don't want if f in ['node', 'spider']: @@ -197,6 +207,7 @@ def transfer_info(ufields): fields[f][nf] = ufields[f][nf][1] elif ('_name' not in f) and ('num_' not in f): fields[f] = ufields[f][1] + fields['created'] = dtnow().strftime(JSON_TIME_FORMAT) L.info('Successfully merged. Returning json object.') return fields @@ -204,15 +215,14 @@ def input_test(fields): """ Testing the manually filled json file. """ - # first, test that there are the fields we need L.info('Running mnonboard.mnutils.input_test() on imported json.') + # first, test that there are the fields we need f = '' try: # test orcid records - for f in FILL_FIELDS: - if f in ['default_submitter', 'default_owner']: - assert valid_url_prefix(fields[f], ORCID_PREFIX, f) - assert valid_orcid(fields[f].split('/')[-1]) + for f in ['default_submitter', 'default_owner']: + assert valid_url_prefix(fields[f], ORCID_PREFIX, f) + assert valid_orcid(fields[f].split('/')[-1]) f = "'node' -> 'contact_subject'" assert valid_url_prefix(fields['node']['contact_subject'], ORCID_PREFIX, f) assert valid_orcid(fields['node']['contact_subject'].split('/')[-1]) From ce44ba3da11560acebd23562102c62d6337adffe Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 21 Dec 2022 07:30:53 -0800 Subject: [PATCH 076/301] adding checks for loaded json --- mnonboard/info_chx.py | 69 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 7d804aac..fdda2cd9 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -1,4 +1,5 @@ import json +import d1_python from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX, DEFAULT_JSON from mnonboard import L @@ -81,12 +82,12 @@ def valid_url_prefix(url, prefix, f): """ # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: - L.error('ORCiD number in %s field does not have the correct URL prefix. (URL: %s)' % (f, url)) - print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field %s' % (ORCID_PREFIX,f)) + L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) + print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field "%s"' % (ORCID_PREFIX, f)) exit(1) if url[-1] in '/': - L.error('ORCiD number in %s field has a trailing slash.') - print('Please remove the trailing slash (/) from the end of the ORCiD number in field %s' % f) + L.error('ORCiD number in "%s" field has a trailing slash.') + print('Please remove the trailing slash (/) from the end of the ORCiD number in field "%s"' % f) exit(1) return True @@ -217,22 +218,62 @@ def input_test(fields): """ L.info('Running mnonboard.mnutils.input_test() on imported json.') # first, test that there are the fields we need + test_fields = json.loads(DEFAULT_JSON) + # test at nest level 1 f = '' try: - # test orcid records - for f in ['default_submitter', 'default_owner']: - assert valid_url_prefix(fields[f], ORCID_PREFIX, f) - assert valid_orcid(fields[f].split('/')[-1]) - f = "'node' -> 'contact_subject'" - assert valid_url_prefix(fields['node']['contact_subject'], ORCID_PREFIX, f) - assert valid_orcid(fields['node']['contact_subject'].split('/')[-1]) - except ValueError as e: + for f in test_fields: + if fields[f] == '': + raise ValueError('Value in field "%s" is an empty string.' % (f)) + if f in ['default_owner', 'default_submitter']: + # test orcid records while we're here + assert valid_url_prefix(fields[f], ORCID_PREFIX, f) + assert valid_orcid(fields[f].split('/')[-1]) + except KeyError as e: L.error('No "%s" field found in json.' % f) - print('Please add the "%s" field to the json and re-run the script.' % f) + print('Please add the "%s" field to the json you loaded and re-run the script.') exit(1) except AssertionError as e: L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) - print('Please correct the ORCiD number in field "%s"' % f) + print('Please correct the ORCiD number in field "%s"' % (f)) + exit(1) + except ValueError as e: + L.error(e) + print('Please add a value in field "%s" and re-run the script.' % (f)) + # nest level 2 + nf = '' + try: + for f in ['node', 'spider']: + for nf in test_fields[f]: + if fields[f][nf] == '': + raise ValueError('Value in field "%s > %s" is an empty string.' % (f, nf)) + if 'contact_subject' in nf: + # test orcid record + assert valid_url_prefix(fields[f][nf], ORCID_PREFIX, nf) + assert valid_orcid(fields[f][nf].split('/')[-1]) + except KeyError as e: + L.error('No "%s > %s" field found in json.' % (f, nf)) + print('Please add the "%s > %s" field to the json you loaded and re-run the script.' % (f, nf)) + exit(1) + except AssertionError as e: + L.error('Invalid ORCiD number %s in field "%s > %s"' % (fields[f][nf], f, nf)) + print('Please correct the ORCiD number in field "%s > %s"' % (f, nf)) exit(1) + except ValueError as e: + L.error(e) + print('Please add a value in field "%s > %s" and re-run the script.' % (f, nf)) + # nest level 3 (node > schedule fields) + nnf = '' + try: + for nnf in test_fields['node']['schedule']: + if fields['node']['schedule'][nnf] == '': + raise ValueError('Value in field "node > schedule > %s" is an empty string.' % (nnf)) + except KeyError as e: + L.error('No "node > schedule > %s" field found in json.' % (nnf)) + print('Please add the "node > schedule > %s" field to the json you loaded and re-run the script.' % (nnf)) + exit(1) + except ValueError as e: + L.error(e) + print('Please add a value in field "node > schedule > %s" and re-run the script.' % (nnf)) L.info('Loaded json info has passed checks.') return True From d99886dd14bead949b75548127848574b1a15a81 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 22 Dec 2022 16:59:21 -0800 Subject: [PATCH 077/301] adding orcid lookup function --- mnonboard/info_chx.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index fdda2cd9..3212b57d 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -1,10 +1,14 @@ import json -import d1_python +from d1_client.cnclient import CoordinatingNodeClient +from d1_common.types import exceptions +from os import environ from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX, DEFAULT_JSON from mnonboard import L from opersist.utils import JSON_TIME_FORMAT, dtnow +D1_AUTH_TOKEN = environ.get('D1_AUTH_TOKEN') + # user info checks def not_empty(f): """ @@ -128,6 +132,35 @@ def enter_int(prompt): L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) print('Please enter 1 or greater.') +def orcid_lookup(orcid): + """ + Use the DataONE API to look up whether a given ORCiD number already exists in the system. + """ + # this code was adapted from + options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} + # Create the Member Node Client + CN_URL = 'https://cn.dataone.org/cn' + client = CoordinatingNodeClient(CN_URL, **options) + # Set your ORCID + try: + # Get records + L.info('Starting ORCiD record lookup from %s' % (CN_URL)) + subject = client.getSubjectInfo(orcid) + r = subject.content()[0].content() + name = '%s %s' % (r[1], r[2]) + L.info('Name associated with ORCiD record %s found in %s: %s.' % (orcid, CN_URL, name)) + return True + except exceptions.NotFound as e: + L.info('Caught NotFound error from %s during ORCiD lookup: %s' % (CN_URL, e)) + L.info('ORCiD %s does not exist in this database. Will create a record.' % (orcid)) + return False + except exceptions.NotAuthorized as e: + L.error('Caught NotAuthorized error from %s. Is your auth token up to date?' % (CN_URL)) + exit(1) + except exceptions.DataONEException as e: + L.error('Unspecified error from %s:\n%s' % (CN_URL, e)) + exit(1) + def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. From 5653d88afe396595103b8fd356e84d26d85402fb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 22 Dec 2022 17:37:50 -0800 Subject: [PATCH 078/301] change meaning of mode to indicate production/staging; add production flag --- mnonboard/cli.py | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 00f0f7c6..e2040261 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -14,7 +14,7 @@ def run(cfg): """ fields = utils.default_json() names = {} - if cfg['mode'] == 'user': + if cfg['info'] == 'user': # do the full user-driven info gathering process ufields, names = info_chx.user_input() fields = info_chx.transfer_info(ufields) @@ -35,12 +35,21 @@ def run(cfg): utils.init_repo(loc) for f in ('default_owner', 'default_submitter'): # add a subject for owner and submitter (may not be necessary) - utils.new_subject(loc=loc, name=names[f+'_name'], value=fields[f]) + utils.get_or_create_subj(loc=loc, + name=names[f+'_name'], + value=fields[f], + cn_url=cfg['cn_url']) f = 'contact_subject' # add subject for technical contact (step 6) - utils.new_subject(loc=loc, name=names[f+'_name'], value=fields['node'][f]) + utils.get_or_create_subj(loc=loc, + name=names[f+'_name'], + value=fields['node'][f], + cn_url=cfg['cn_url']) # add node as a subject (step 7) - utils.new_subject(loc=loc, name=end_node_subj, value=fields['node']['node_id']) + utils.get_or_create_subj(loc=loc, + name=end_node_subj, + value=fields['node']['node_id'], + cn_url=cfg['cn_url']) # okay, now overwrite the default node.json with our new one (step 8) utils.save_json(loc=os.path.join(loc, 'node.json'), jf=fields) # restart the mnlite process to pick up the new node.json (step 9) @@ -57,8 +66,8 @@ def main(): """ # get arguments try: - opts = getopt.getopt(sys.argv[1:], 'hid:l:', - ['help', 'init', 'dump=', 'load='] + opts = getopt.getopt(sys.argv[1:], 'hiPd:l:', + ['help', 'init', 'production', 'dump=', 'load='] )[0] except Exception as e: L.error('Error: %s' % e) @@ -66,20 +75,27 @@ def main(): exit(1) for o, a in opts: if o in ('-h', '--help'): + # help print(HELP_TEXT) exit(0) if o in ('-i', '--init'): # do data gathering - CFG['mode'] = 'user' - run(CFG) + CFG['info'] = 'user' + if o in ('-P', '--production'): + # production case + CFG['cn_url'] = 'https://cn.dataone.org/cn' if o in ('-d', '--dump'): # dump default json to file utils.save_json(a, utils.default_json()) + exit(0) if o in ('-l', '--load'): # load from json file - CFG['mode'] = 'json' + CFG['info'] = 'json' CFG['json_file'] = a - run(CFG) + L.info('running mnonboard in %s mode. data gathering from: %s. cn_url: %s' % (CFG['mode'], + CFG['info'], + CFG['cn_url'])) + run(CFG) if __name__ == '__main__': From 53ccefbec98e664df7f2a990585ec6587d6bae80 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 22 Dec 2022 17:39:17 -0800 Subject: [PATCH 079/301] changing cn_url to func variable --- mnonboard/info_chx.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 3212b57d..e300596f 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -132,33 +132,32 @@ def enter_int(prompt): L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) print('Please enter 1 or greater.') -def orcid_lookup(orcid): +def record_lookup(search, cn_url='https://cn.dataone.org/cn'): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ # this code was adapted from options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} # Create the Member Node Client - CN_URL = 'https://cn.dataone.org/cn' - client = CoordinatingNodeClient(CN_URL, **options) + client = CoordinatingNodeClient(cn_url, **options) # Set your ORCID try: # Get records - L.info('Starting ORCiD record lookup from %s' % (CN_URL)) - subject = client.getSubjectInfo(orcid) + L.info('Starting record lookup for %s from %s' % (search, cn_url)) + subject = client.getSubjectInfo(search) r = subject.content()[0].content() name = '%s %s' % (r[1], r[2]) - L.info('Name associated with ORCiD record %s found in %s: %s.' % (orcid, CN_URL, name)) + L.info('Name associated with record %s found in %s: %s.' % (search, cn_url, name)) return True except exceptions.NotFound as e: - L.info('Caught NotFound error from %s during ORCiD lookup: %s' % (CN_URL, e)) - L.info('ORCiD %s does not exist in this database. Will create a record.' % (orcid)) + L.info('Caught NotFound error from %s during lookup: %s' % (cn_url, e)) + L.info('%s does not exist in this database. Will create a record.' % (search)) return False except exceptions.NotAuthorized as e: - L.error('Caught NotAuthorized error from %s. Is your auth token up to date?' % (CN_URL)) + L.error('Caught NotAuthorized error from %s. Is your auth token up to date?' % (cn_url)) exit(1) except exceptions.DataONEException as e: - L.error('Unspecified error from %s:\n%s' % (CN_URL, e)) + L.error('Unspecified error from %s:\n%s' % (cn_url, e)) exit(1) def orcid_name(orcid, f): From ae2c080976bd03e258c4e2473efe3a170421f512 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 22 Dec 2022 17:40:21 -0800 Subject: [PATCH 080/301] changing mode to indicate production/staging --- mnonboard/defs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 6b1e7f7d..b7995efd 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -3,8 +3,10 @@ ORCID_PREFIX = 'https://orcid.org/' CFG = { - 'mode': 'user', + 'info': 'user', 'json_file': 'node.json', + 'cn_url': 'https://cn-stage.test.dataone.org/cn', + 'mode': 'staging', } HELP_TEXT = """DataONE member node onboard script From d2593b3b65f863d1bed59ada581b2e24e3bb31df Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 22 Dec 2022 17:40:52 -0800 Subject: [PATCH 081/301] adding get_or_create, adding docstring --- mnonboard/utils.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index bb818fa6..5ae6b491 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -4,6 +4,7 @@ from defs import DEFAULT_JSON from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME +from mnonboard.info_chx import record_lookup def default_json(): """ @@ -72,6 +73,9 @@ def init_repo(loc): exit(1) def new_subject(loc, name, value): + """ + Create new subject in the database using opersist. + """ try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) subprocess.run(['opersist', '-f', loc, 'sub', '-n', '"%s"' % name, '-s', value], check=True) @@ -79,6 +83,13 @@ def new_subject(loc, name, value): L.error('opersist subject creation command failed for %s (%s): %s' % (name, value, e)) exit(1) +def get_or_create_subj(loc, name, value, cn_url): + """ + Get an existing subject using their ORCiD or create a new one with the specified values. + """ + if not record_lookup(value, cn_url): + new_subject(loc, name, value) + def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. From 00a185feea037367fb57f65b786cda207be0187a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 23 Dec 2022 06:08:05 -0800 Subject: [PATCH 082/301] adding reference to examples code --- mnonboard/info_chx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index e300596f..64ad16e6 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -136,11 +136,11 @@ def record_lookup(search, cn_url='https://cn.dataone.org/cn'): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ - # this code was adapted from + # this authentication method was adapted from: + # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} # Create the Member Node Client client = CoordinatingNodeClient(cn_url, **options) - # Set your ORCID try: # Get records L.info('Starting record lookup for %s from %s' % (search, cn_url)) From 9d0a7242901b505e406f1120a75e9f6dc7e69680 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 23 Dec 2022 12:24:48 -0800 Subject: [PATCH 083/301] adding schedule choice function --- mnonboard/info_chx.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 64ad16e6..67aa9ae0 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -109,6 +109,28 @@ def sitemap_urls(num_urls): i += 1 return SITEMAP_URLS +def enter_schedule(): + """ + Give the user a choice between three basic scheduling options. + """ + p = 'Select a starting frequency with which to scrape data from this member node.\n' \ + '1: Monthly\n' \ + '2: Daily\n' \ + '3: Every 3 minutes\n' \ + 'Enter 1/2/3: ' + while True: + i = input(p) + try: + if i in [1, 2, 3]: + L.info('User has entered frequency option %s.' % i) + return i + else: + L.warning('User entry "%s" is a number but not 1, 2, or 3.' % (i)) + print('Please enter a choice of frequency option 1, 2, or 3.') + except ValueError as e: + L.warning('User entry "%s" is not an number.' % (i)) + print('Please enter a choice of frequency option 1, 2, or 3.') + def enter_int(prompt): """ Make sure the user enters an integer value of 1 or greater. From a0583c1b5ca9890ae51d45ccff4e1f4c2bf92d65 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 23 Dec 2022 12:48:19 -0800 Subject: [PATCH 084/301] adding schedules dict --- mnonboard/cli.py | 1 + mnonboard/defs.py | 33 +++++++++++++++++++++++++++++++++ mnonboard/info_chx.py | 11 ++++++----- mnonboard/utils.py | 11 +++++++++-- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index e2040261..228cc405 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -30,6 +30,7 @@ def run(cfg): # now we're cooking # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) end_node_subj = fields['node']['subject'].split('/')[-1] + fields['node']['schedule'] = utils.set_schedule() loc = utils.node_path(nodedir=end_node_subj) # initialize a repository there (step 5) utils.init_repo(loc) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index b7995efd..19556b9a 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -87,3 +87,36 @@ ] SITEMAP_URLS = [] + +SCHEDULES = { + # monthly on the 1st at 00:30 + 1: { + "hour": "0", + "day": "1", + "min": "30", + "mon": "*", + "sec": "0", + "wday": "?", + "year": "*" + }, + # daily at 00:10 + 2: { + "hour": "0", + "day": "*", + "min": "10", + "mon": "*", + "sec": "0", + "wday": "?", + "year": "*" + }, + # every three minutes + 3: { + "hour": "*", + "day": "*", + "min": "*/3", + "mon": "*", + "sec": "0", + "wday": "?", + "year": "*" + } +} \ No newline at end of file diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 67aa9ae0..75df17af 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -3,7 +3,7 @@ from d1_common.types import exceptions from os import environ -from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX, DEFAULT_JSON +from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX, DEFAULT_JSON, SCHEDULES from mnonboard import L from opersist.utils import JSON_TIME_FORMAT, dtnow @@ -120,16 +120,17 @@ def enter_schedule(): 'Enter 1/2/3: ' while True: i = input(p) + et = 'Please enter a choice of the frequency options above.' try: - if i in [1, 2, 3]: + if i in SCHEDULES: L.info('User has entered frequency option %s.' % i) return i else: - L.warning('User entry "%s" is a number but not 1, 2, or 3.' % (i)) - print('Please enter a choice of frequency option 1, 2, or 3.') + L.warning('User entry "%s" is a number but it is not an available option.' % (i)) + print(et) except ValueError as e: L.warning('User entry "%s" is not an number.' % (i)) - print('Please enter a choice of frequency option 1, 2, or 3.') + print(et) def enter_int(prompt): """ diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 5ae6b491..fb0c7c0d 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -2,9 +2,9 @@ import json import subprocess -from defs import DEFAULT_JSON +from defs import DEFAULT_JSON, SCHEDULES from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME -from mnonboard.info_chx import record_lookup +from mnonboard.info_chx import record_lookup, enter_schedule def default_json(): """ @@ -90,6 +90,13 @@ def get_or_create_subj(loc, name, value, cn_url): if not record_lookup(value, cn_url): new_subject(loc, name, value) +def set_schedule(): + """ + + """ + s = enter_schedule() + return SCHEDULES[s] + def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. From fca3ca42105766ac85faef2eee090e031d7848d6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 23 Dec 2022 13:46:32 -0800 Subject: [PATCH 085/301] changing scheduling order --- mnonboard/cli.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 228cc405..31c3b624 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -30,7 +30,6 @@ def run(cfg): # now we're cooking # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) end_node_subj = fields['node']['subject'].split('/')[-1] - fields['node']['schedule'] = utils.set_schedule() loc = utils.node_path(nodedir=end_node_subj) # initialize a repository there (step 5) utils.init_repo(loc) @@ -51,6 +50,8 @@ def run(cfg): name=end_node_subj, value=fields['node']['node_id'], cn_url=cfg['cn_url']) + # set the update schedule + fields['node']['schedule'] = utils.set_schedule() # okay, now overwrite the default node.json with our new one (step 8) utils.save_json(loc=os.path.join(loc, 'node.json'), jf=fields) # restart the mnlite process to pick up the new node.json (step 9) From 38edba8ab26693078bcd280f7ff66b8562004c7f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 27 Dec 2022 18:28:56 -0800 Subject: [PATCH 086/301] adding data check --- mnonboard/cli.py | 2 +- mnonboard/data_chx.py | 45 ++++++++++++++++++++++++++++++++++++++++--- mnonboard/defs.py | 1 + 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 31c3b624..36912cb9 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -59,7 +59,7 @@ def run(cfg): # run scrapy to harvest metadata (step 10) utils.harvest_data(loc, end_node_subj) # now run tests - data_chx.test_mdata() + data_chx.test_mdata(loc) def main(): diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index fe492a52..c1b95436 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -1,9 +1,48 @@ -import pyshacl +import os +import glob +import random +from pyshacl import validate from mnonboard import L +from mnonboard.defs import SHACL_URL -def test_mdata(): +def test_mdata(loc, shp_graph=SHACL_URL, format='nquads', num_tests=3): """ Using pyshacl to test harvested metadata. """ - L.info('Starting metadata checks.') + L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) + L.info('Checking %s files.' % num_tests) + dirlist0, dirlist1, dirlist2 = [], [], [] + file_list = [] + i = 0 + while i < num_tests: + try: + for d in os.listdir(loc): + if os.path.isdir(os.path.join(loc, d)): + dirlist0.append(d) + d0 = random.choice(dirlist0) + for d in os.listdir(d0): + if os.path.isdir(os.path.join(d0, d)): + dirlist1.append(d) + d1 = random.choice(dirlist1) + for d in os.listdir(d1): + if os.path.isdir(os.path.join(d1, d)): + dirlist2.append(d) + d2 = random.choice(dirlist2) + L.info('File %s: %s' % (str(i).zfill(3), )) + f = random.choice(glob.glob(os.path.join(d2, '*.bin'))) + file_list.append(f) + i += 1 + except Exception as e: + print("\nError: %s" % e) + return + for f in file_list: + try: + L.info('Checking file %s/%s: %s' % (i, num_tests, f)) + validate(data_graph=f, + shacl_graph=shp_graph, + data_graph_format=format, + shacl_graph_format='json-ld', + ) + except Exception as e: + L.error('Error running pyshacl: %s' % e) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 19556b9a..feb16774 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,6 +1,7 @@ from mnonboard import __version__ ORCID_PREFIX = 'https://orcid.org/' +SHACL_URL = 'https://raw.githubusercontent.com/ESIPFed/science-on-schema.org/master/validation/shapegraphs/soso_common_v1.2.3.ttl' CFG = { 'info': 'user', From 573de82a20c9c4f242dddf8e82b8588b9f82df7c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 27 Dec 2022 18:35:48 -0800 Subject: [PATCH 087/301] using default node configuration dictionary directly from mnlite --- mnonboard/defs.py | 35 ++--------------------------------- mnonboard/info_chx.py | 4 ++-- mnonboard/utils.py | 2 +- 3 files changed, 5 insertions(+), 36 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index feb16774..eb675628 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,5 +1,7 @@ from mnonboard import __version__ +from mnlite.mnode import DEFAULT_NODE_CONFIG +DEFAULT_JSON = DEFAULT_NODE_CONFIG ORCID_PREFIX = 'https://orcid.org/' SHACL_URL = 'https://raw.githubusercontent.com/ESIPFed/science-on-schema.org/master/validation/shapegraphs/soso_common_v1.2.3.ttl' @@ -26,39 +28,6 @@ } """ % __version__ -DEFAULT_JSON = r'''{ - "node": { - "node_id": "", - "state": "up", - "name": "", - "description": "", - "base_url": "", - "schedule": { - "hour": "*", - "day": "*", - "min": "0,10,20,30,40,50", - "mon": "*", - "sec": "0", - "wday": "?", - "year": "*" - }, - "subject": "", - "contact_subject": "" - }, - "data_folder": "data", - "content_database": "sqlite:///content.db", - "log_database": "sqlite:///eventlog.db", - "created": "", - "default_submitter": "", - "default_owner": "", - "spider": { - "sitemap_urls":[ - "" - ] - } -} -''' - FIELDS = { 'node': { 'node_id': ['Member node identifier (must be unique): ', None], diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 75df17af..5e738862 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -253,7 +253,7 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. """ - fields = json.loads(DEFAULT_JSON) + fields = DEFAULT_JSON L.info('Adding user fields to default fields.') for f in ufields: # take fields we want, ignore fields we don't want @@ -273,7 +273,7 @@ def input_test(fields): """ L.info('Running mnonboard.mnutils.input_test() on imported json.') # first, test that there are the fields we need - test_fields = json.loads(DEFAULT_JSON) + test_fields = DEFAULT_JSON # test at nest level 1 f = '' try: diff --git a/mnonboard/utils.py b/mnonboard/utils.py index fb0c7c0d..8c0d9837 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -11,7 +11,7 @@ def default_json(): A function that spits out a json file to be used in onboarding. """ L.info('Loading default json template.') - return json.loads(DEFAULT_JSON) + return DEFAULT_JSON def load_json(loc): """ From ce9f97f95162ff90f802e2c485d363abb7194803 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 27 Dec 2022 18:43:28 -0800 Subject: [PATCH 088/301] changing calls for default config to go through utils.default_json() --- mnonboard/cli.py | 2 +- mnonboard/info_chx.py | 7 ++++--- mnonboard/utils.py | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 36912cb9..1a434302 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -12,7 +12,7 @@ def run(cfg): Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ - fields = utils.default_json() + fields = utils.default_json(fx='mnonboard.cli.run()') names = {} if cfg['info'] == 'user': # do the full user-driven info gathering process diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 5e738862..c852f36a 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -3,7 +3,8 @@ from d1_common.types import exceptions from os import environ -from defs import FIELDS, FILL_FIELDS, SITEMAP_URLS, ORCID_PREFIX, DEFAULT_JSON, SCHEDULES +from utils import default_json +from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES from mnonboard import L from opersist.utils import JSON_TIME_FORMAT, dtnow @@ -253,7 +254,7 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. """ - fields = DEFAULT_JSON + fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') for f in ufields: # take fields we want, ignore fields we don't want @@ -273,7 +274,7 @@ def input_test(fields): """ L.info('Running mnonboard.mnutils.input_test() on imported json.') # first, test that there are the fields we need - test_fields = DEFAULT_JSON + test_fields = default_json(fx='mnonboard.info_chx.input_test()') # test at nest level 1 f = '' try: diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 8c0d9837..4e70cbef 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -6,11 +6,11 @@ from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME from mnonboard.info_chx import record_lookup, enter_schedule -def default_json(): +def default_json(fx='Unspecified'): """ A function that spits out a json file to be used in onboarding. """ - L.info('Loading default json template.') + L.info('%s function loading default json template.' % (fx)) return DEFAULT_JSON def load_json(loc): From 63e23695c4817df7a9315ffa41d33a932aa941eb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 29 Dec 2022 09:40:22 -0800 Subject: [PATCH 089/301] new structure for metadata tests. basic working structure is done --- mnonboard/data_chx.py | 66 +++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index c1b95436..6f0ac418 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -1,48 +1,52 @@ -import os -import glob import random from pyshacl import validate from mnonboard import L from mnonboard.defs import SHACL_URL +from opersist.cli import getOpersistInstance +from opersist.models.thing import Thing -def test_mdata(loc, shp_graph=SHACL_URL, format='nquads', num_tests=3): + +def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): """ - Using pyshacl to test harvested metadata. + Use pyshacl to test harvested metadata. """ L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) L.info('Checking %s files.' % num_tests) - dirlist0, dirlist1, dirlist2 = [], [], [] - file_list = [] + op = getOpersistInstance(loc) + num_things = op.countThings() + q = op.getSession().query(Thing) # this might be too inefficient for large sets; may need to change i = 0 while i < num_tests: + record = '' + # get a random thing and decode its path + L.info('Record check %s/%s...' % (i+1, num_tests)) + rand = random.randint(0, num_things) + t = q[rand] + L.info('Selected record number %s of %s in set: %s' % (rand, num_things, t.content)) + pth = op.contentAbsPath(t.content) + # read to object + L.info('Reading binary from %s' % (pth)) try: - for d in os.listdir(loc): - if os.path.isdir(os.path.join(loc, d)): - dirlist0.append(d) - d0 = random.choice(dirlist0) - for d in os.listdir(d0): - if os.path.isdir(os.path.join(d0, d)): - dirlist1.append(d) - d1 = random.choice(dirlist1) - for d in os.listdir(d1): - if os.path.isdir(os.path.join(d1, d)): - dirlist2.append(d) - d2 = random.choice(dirlist2) - L.info('File %s: %s' % (str(i).zfill(3), )) - f = random.choice(glob.glob(os.path.join(d2, '*.bin'))) - file_list.append(f) - i += 1 + with open(pth, 'rb') as f: + record = f.read().decode('utf-8') + L.info('Success; record follows:\n%s' % (record)) except Exception as e: - print("\nError: %s" % e) - return - for f in file_list: + L.error("\nError: %s" % e) + L.error('Error loading record %s\nSkipping to next record...' % (pth)) + continue try: - L.info('Checking file %s/%s: %s' % (i, num_tests, f)) - validate(data_graph=f, - shacl_graph=shp_graph, - data_graph_format=format, - shacl_graph_format='json-ld', - ) + conforms, res_graph, res_text = validate(data_graph=record, + data_graph_format=format, + shacl_graph=shp_graph, + shacl_graph_format='turtle',) + if not conforms: + num_violations = res_text.split('\n')[2].split('(')[1].split(')')[0] + L.error('pyshacl found %s violation(s):\n%s' % (num_violations, res_text)) + else: + L.info('No violations found in %s' % (pth)) except Exception as e: + # add pyshacl exceptions; perhaps consolidate try/excepts here? L.error('Error running pyshacl: %s' % e) + + i += 1 From cef1d38070e36676651b4de066f4b85e116671e5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 29 Dec 2022 13:11:32 -0800 Subject: [PATCH 090/301] consolidating try/except --- mnonboard/data_chx.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 6f0ac418..96675d53 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -1,6 +1,7 @@ import random from pyshacl import validate - +from pyshacl.errors import ShapeLoadError, ConstraintLoadError, \ + ReportableRuntimeError from mnonboard import L from mnonboard.defs import SHACL_URL from opersist.cli import getOpersistInstance @@ -31,11 +32,6 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): with open(pth, 'rb') as f: record = f.read().decode('utf-8') L.info('Success; record follows:\n%s' % (record)) - except Exception as e: - L.error("\nError: %s" % e) - L.error('Error loading record %s\nSkipping to next record...' % (pth)) - continue - try: conforms, res_graph, res_text = validate(data_graph=record, data_graph_format=format, shacl_graph=shp_graph, @@ -45,8 +41,18 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): L.error('pyshacl found %s violation(s):\n%s' % (num_violations, res_text)) else: L.info('No violations found in %s' % (pth)) + except ShapeLoadError as e: + L.error('pyshacl threw ShapeLoadError: %s' % e) + L.error('Skipping to next record...') + except ConstraintLoadError as e: + L.error('pyshacl threw ConstraintLoadError: %s' % e) + L.error('Skipping to next record...') + except ReportableRuntimeError as e: + L.error('pyshacl threw ReportableRuntimeError: %s' % e) + L.error('Skipping to next record...') except Exception as e: - # add pyshacl exceptions; perhaps consolidate try/excepts here? - L.error('Error running pyshacl: %s' % e) + L.error("\nError: %s" % e) + L.error('Error validating record %s\nSkipping to next record...' % (pth)) + continue i += 1 From 5a0a49dcff538137e61d7ca815abecb7148ba1f3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 29 Dec 2022 13:40:10 -0800 Subject: [PATCH 091/301] changing default_json location to avoid circular import --- mnonboard/__init__.py | 10 ++++++++++ mnonboard/cli.py | 5 +++-- mnonboard/defs.py | 2 -- mnonboard/info_chx.py | 2 +- mnonboard/utils.py | 9 +-------- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index b55c8fca..eae3bae5 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -3,6 +3,9 @@ from datetime import datetime from opersist.cli import LOG_LEVELS, LOG_DATE_FORMAT, LOG_FORMAT +from mnlite.mnode import DEFAULT_NODE_CONFIG + +DEFAULT_JSON = DEFAULT_NODE_CONFIG __version__ = 'v0.0.1' @@ -39,3 +42,10 @@ def start_logging(): # relative path from root of mnlite dir to nodes directory NODE_PATH_REL = 'instance/nodes/' + +def default_json(fx='Unspecified'): + """ + A function that spits out a json file to be used in onboarding. + """ + L.info('%s function loading default json template.' % (fx)) + return DEFAULT_JSON diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 1a434302..8d0daebf 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -6,13 +6,14 @@ import data_chx from defs import CFG, HELP_TEXT from mnonboard import L +from mnonboard import default_json def run(cfg): """ Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ - fields = utils.default_json(fx='mnonboard.cli.run()') + fields = default_json(fx='mnonboard.cli.run()') names = {} if cfg['info'] == 'user': # do the full user-driven info gathering process @@ -88,7 +89,7 @@ def main(): CFG['cn_url'] = 'https://cn.dataone.org/cn' if o in ('-d', '--dump'): # dump default json to file - utils.save_json(a, utils.default_json()) + utils.save_json(a, default_json()) exit(0) if o in ('-l', '--load'): # load from json file diff --git a/mnonboard/defs.py b/mnonboard/defs.py index eb675628..ce9ef560 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,7 +1,5 @@ from mnonboard import __version__ -from mnlite.mnode import DEFAULT_NODE_CONFIG -DEFAULT_JSON = DEFAULT_NODE_CONFIG ORCID_PREFIX = 'https://orcid.org/' SHACL_URL = 'https://raw.githubusercontent.com/ESIPFed/science-on-schema.org/master/validation/shapegraphs/soso_common_v1.2.3.ttl' diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index c852f36a..138c327b 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -3,9 +3,9 @@ from d1_common.types import exceptions from os import environ -from utils import default_json from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES from mnonboard import L +from mnonboard import default_json from opersist.utils import JSON_TIME_FORMAT, dtnow D1_AUTH_TOKEN = environ.get('D1_AUTH_TOKEN') diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 4e70cbef..95b3f6ee 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -2,17 +2,10 @@ import json import subprocess -from defs import DEFAULT_JSON, SCHEDULES +from defs import SCHEDULES from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME from mnonboard.info_chx import record_lookup, enter_schedule -def default_json(fx='Unspecified'): - """ - A function that spits out a json file to be used in onboarding. - """ - L.info('%s function loading default json template.' % (fx)) - return DEFAULT_JSON - def load_json(loc): """ Load json from file. From 43bfc70cae2bbde06722236bff69e3e033aed0b0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 29 Dec 2022 13:50:43 -0800 Subject: [PATCH 092/301] adding state definition --- mnonboard/cli.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 8d0daebf..d54207e2 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -51,8 +51,9 @@ def run(cfg): name=end_node_subj, value=fields['node']['node_id'], cn_url=cfg['cn_url']) - # set the update schedule + # set the update schedule and set the state to up fields['node']['schedule'] = utils.set_schedule() + fields['node']['state'] = 'up' # okay, now overwrite the default node.json with our new one (step 8) utils.save_json(loc=os.path.join(loc, 'node.json'), jf=fields) # restart the mnlite process to pick up the new node.json (step 9) From be01665bfb8bd70495ba7982756b719f79143ab5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 29 Dec 2022 14:07:46 -0800 Subject: [PATCH 093/301] bug fixes --- mnonboard/defs.py | 2 +- mnonboard/info_chx.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index ce9ef560..40565b88 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,6 +1,6 @@ from mnonboard import __version__ -ORCID_PREFIX = 'https://orcid.org/' +ORCID_PREFIX = 'http://orcid.org/' SHACL_URL = 'https://raw.githubusercontent.com/ESIPFed/science-on-schema.org/master/validation/shapegraphs/soso_common_v1.2.3.ttl' CFG = { diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 138c327b..34bb998c 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -123,9 +123,9 @@ def enter_schedule(): i = input(p) et = 'Please enter a choice of the frequency options above.' try: - if i in SCHEDULES: + if int(i) in SCHEDULES: L.info('User has entered frequency option %s.' % i) - return i + return int(i) else: L.warning('User entry "%s" is a number but it is not an available option.' % (i)) print(et) From a3d019d89895d41efca11c337f57306bfa1487a0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 29 Dec 2022 14:34:47 -0800 Subject: [PATCH 094/301] adding exception handling for when mnlite is not installed and restart fails --- mnonboard/utils.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 95b3f6ee..032eab99 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -95,8 +95,23 @@ def restart_mnlite(): Subprocess call to restart the mnlite system service. Requires sudo. """ L.info('Restarting mnlite systemctl service...') - subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) - L.info('Done.') + try: + subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) + L.info('Done.') + except subprocess.CalledProcessError as e: + L.error('Error restarting mnlite system service. Is it installed on your system? Error text:\n%s' % (e)) + while True: + print('mnlite was not restarted.') + i = input('Do you wish to continue? (Y/n) ') + if i.lower() == 'n': + L.info('User has chosen to abort setup after mnlite restart failed.') + exit(1) + elif i.lower() in ['y', '']: + L.info('User has chosen to continue after mnlite restart failed.') + break + else: + L.error('Invalid input at mnlite failure continue prompt: %s' % (i)) + print('You have selected an invalid option.') def harvest_data(loc, mn_name): """ From e3fe42db65b8e600a1b144f29e9d1011e35cabca Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 3 Jan 2023 16:01:18 -0800 Subject: [PATCH 095/301] return name instead of boolean --- mnonboard/info_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 34bb998c..895958ec 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -172,7 +172,7 @@ def record_lookup(search, cn_url='https://cn.dataone.org/cn'): r = subject.content()[0].content() name = '%s %s' % (r[1], r[2]) L.info('Name associated with record %s found in %s: %s.' % (search, cn_url, name)) - return True + return name except exceptions.NotFound as e: L.info('Caught NotFound error from %s during lookup: %s' % (cn_url, e)) L.info('%s does not exist in this database. Will create a record.' % (search)) From edab4b92a5d9ce8a583b91aa641ca88d6b3861c0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 3 Jan 2023 20:06:30 -0800 Subject: [PATCH 096/301] bug fix (subprocess doesn't like spaces) --- mnonboard/utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 032eab99..cf906cc2 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -120,7 +120,8 @@ def harvest_data(loc, mn_name): log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) L.info('scrapy log location is %s' % (log_loc)) - subprocess.run(['scrapy', 'crawl', 'JsonldSpider', '-s', - 'STORE_PATH=%s' % loc, '>', log_loc, '2>&1'], + subprocess.run(['scrapy', 'crawl', 'JsonldSpider', + '--set=STORE_PATH=%s' % loc, + '--logfile=%s' % log_loc], check=True) L.info('scrapy crawl complete.') From 2b83e08a0b77d9a2d4a3a5984567eb5ea996c001 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 3 Jan 2023 20:09:51 -0800 Subject: [PATCH 097/301] subprocess scrapy call is finally working --- mnonboard/utils.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index cf906cc2..1421a8c6 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -120,8 +120,11 @@ def harvest_data(loc, mn_name): log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) L.info('scrapy log location is %s' % (log_loc)) - subprocess.run(['scrapy', 'crawl', 'JsonldSpider', - '--set=STORE_PATH=%s' % loc, - '--logfile=%s' % log_loc], - check=True) - L.info('scrapy crawl complete.') + try: + subprocess.run(['scrapy', 'crawl', 'JsonldSpider', + '--set=STORE_PATH=%s' % loc, + '--logfile=%s' % log_loc], + check=True) + L.info('scrapy crawl complete.') + except Exception as e: + L.error('Error running scrapy: %s' % e) From 84f062417c199eb3f3c6662e0dc746487db20c74 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 15:25:45 -0800 Subject: [PATCH 098/301] adding test conditions & handling more error types --- mnonboard/data_chx.py | 68 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 96675d53..0441274b 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -6,7 +6,7 @@ from mnonboard.defs import SHACL_URL from opersist.cli import getOpersistInstance from opersist.models.thing import Thing - +from json.decoder import JSONDecodeError def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): """ @@ -17,9 +17,11 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): op = getOpersistInstance(loc) num_things = op.countThings() q = op.getSession().query(Thing) # this might be too inefficient for large sets; may need to change - i = 0 + i, valid_files, load_errs = 0, 0, 0 + viol_dict = {} while i < num_tests: record = '' + violati1, violati2 = 0, 0 # get a random thing and decode its path L.info('Record check %s/%s...' % (i+1, num_tests)) rand = random.randint(0, num_things) @@ -37,22 +39,64 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): shacl_graph=shp_graph, shacl_graph_format='turtle',) if not conforms: - num_violations = res_text.split('\n')[2].split('(')[1].split(')')[0] - L.error('pyshacl found %s violation(s):\n%s' % (num_violations, res_text)) + violati1 = int(res_text.split('\n')[2].split('(')[1].split(')')[0]) + constraint_viol = ' including Constraint Violation(s)' if 'Constraint Violation' in res_text else '' + L.error('pyshacl found %s violation(s):\n%s' % (violati1, res_text)) + if (violati1 == 1) and (' not ' in res_text): + # do a quick replace and test again + L.info('Found https vs http namespace violation...replacing and testing again...') + record = record.replace('https://schema.org/', 'http://schema.org/') + conforms2, res_graph2, res_text2 = validate(data_graph=record, + data_graph_format=format, + shacl_graph=shp_graph, + shacl_graph_format='turtle',) + if not conforms2: + violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) + L.error('pyshacl found %s additional violation(s):\n%s' \ + % (violati2, res_text)) + tot_violations = violati1 + violati2 + L.info('Total shacl violations in file: %s' % (tot_violations)) + viol_dict[t.content] = 'shacl violations%s (%s)' % (tot_violations, constraint_viol) else: L.info('No violations found in %s' % (pth)) + viol_dict[t.content] = None + valid_files += 1 except ShapeLoadError as e: + # could be an error with either data or shacl file L.error('pyshacl threw ShapeLoadError: %s' % e) - L.error('Skipping to next record...') + viol_dict[t.content] = 'ShapeLoadError' + load_errs += 1 except ConstraintLoadError as e: + # I think this is only possible when loading the shacl graph (i.e. w/ constraints) L.error('pyshacl threw ConstraintLoadError: %s' % e) - L.error('Skipping to next record...') + viol_dict[t.content] = 'ConstraintLoadError' + load_errs += 1 except ReportableRuntimeError as e: + # not exactly sure what this is L.error('pyshacl threw ReportableRuntimeError: %s' % e) - L.error('Skipping to next record...') + viol_dict[t.content] = 'ReportableRuntimeError' + load_errs += 1 + except JSONDecodeError as e: + # malformed json in the json-ld record, this is definitely related to the data graph + L.error('JSON is malformed, this record cannot be validated. Details:\n%s' % e) + viol_dict[t.content] = 'JSONDecodeError' + load_errs += 1 + except FileNotFoundError as e: + # somehow the file we got from the database does not exist + L.error('Could not find a file at %s' % (pth)) except Exception as e: - L.error("\nError: %s" % e) - L.error('Error validating record %s\nSkipping to next record...' % (pth)) - continue - - i += 1 + # this might have something to do with code in this function + # if it's a TypeError, it could have to do with the creation of violati1/violati2 + L.error('Error validating record %s' % (pth)) + L.error("Uncaught exception (%s): %s" % (repr(e), e)) + viol_dict[t.content] = repr(e) + load_errs += 1 + finally: + L.info('Continuing to next record...') + i += 1 + L.info('Found %s valid records out of %s checked.' % (valid_files, i)) + L.info('Could not check %s records due to load and/or decode errors.' % (load_errs)) + rep_str = 'Validation report (sha256 - violations or error):\n' + for v in viol_dict: + rep_str = rep_str + '%s - %s\n' % (v, viol_dict[v]) + L.info(rep_str) From 9352f808b44d2721d73164e591070e264cc49ebe Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 15:38:48 -0800 Subject: [PATCH 099/301] more helpful error reporting --- mnonboard/data_chx.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 0441274b..107f2700 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -43,7 +43,9 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): constraint_viol = ' including Constraint Violation(s)' if 'Constraint Violation' in res_text else '' L.error('pyshacl found %s violation(s):\n%s' % (violati1, res_text)) if (violati1 == 1) and (' not ' in res_text): - # do a quick replace and test again + # under this condition there is one constraint violation where the record uses https + constraint_viol = ' including https vs http namespace violation' + # do a quick replace and test again for lower level violations L.info('Found https vs http namespace violation...replacing and testing again...') record = record.replace('https://schema.org/', 'http://schema.org/') conforms2, res_graph2, res_text2 = validate(data_graph=record, @@ -56,7 +58,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): % (violati2, res_text)) tot_violations = violati1 + violati2 L.info('Total shacl violations in file: %s' % (tot_violations)) - viol_dict[t.content] = 'shacl violations%s (%s)' % (tot_violations, constraint_viol) + viol_dict[t.content] = 'shacl violations%s (%s total)' % (constraint_viol, tot_violations, ) else: L.info('No violations found in %s' % (pth)) viol_dict[t.content] = None From a2b2e37bcc31594f8fcf0d6e041035b1a68d3e6f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 15:44:07 -0800 Subject: [PATCH 100/301] adding condition to logging --- mnonboard/data_chx.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 107f2700..56f42e2d 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -40,7 +40,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): shacl_graph_format='turtle',) if not conforms: violati1 = int(res_text.split('\n')[2].split('(')[1].split(')')[0]) - constraint_viol = ' including Constraint Violation(s)' if 'Constraint Violation' in res_text else '' + constraint_viol = ' including Constraint Violations' if 'Constraint Violation' in res_text else '' L.error('pyshacl found %s violation(s):\n%s' % (violati1, res_text)) if (violati1 == 1) and (' not ' in res_text): # under this condition there is one constraint violation where the record uses https @@ -56,6 +56,8 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) L.error('pyshacl found %s additional violation(s):\n%s' \ % (violati2, res_text)) + else: + L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 L.info('Total shacl violations in file: %s' % (tot_violations)) viol_dict[t.content] = 'shacl violations%s (%s total)' % (constraint_viol, tot_violations, ) @@ -90,7 +92,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): # this might have something to do with code in this function # if it's a TypeError, it could have to do with the creation of violati1/violati2 L.error('Error validating record %s' % (pth)) - L.error("Uncaught exception (%s): %s" % (repr(e), e)) + L.error('Uncaught exception (%s): %s' % (repr(e), e)) viol_dict[t.content] = repr(e) load_errs += 1 finally: From af2a797dd7bebe48a5583dee469996d3fbbde13e Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 15:48:23 -0800 Subject: [PATCH 101/301] adding conditions to logging --- mnonboard/data_chx.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 56f42e2d..7d46d69d 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -100,7 +100,10 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): i += 1 L.info('Found %s valid records out of %s checked.' % (valid_files, i)) L.info('Could not check %s records due to load and/or decode errors.' % (load_errs)) - rep_str = 'Validation report (sha256 - violations or error):\n' - for v in viol_dict: - rep_str = rep_str + '%s - %s\n' % (v, viol_dict[v]) - L.info(rep_str) + if len(viol_dict) > 0: + rep_str = 'Validation report (sha256 - violations or error):\n' + for v in viol_dict: + rep_str = rep_str + '%s - %s\n' % (v, viol_dict[v]) + L.info(rep_str) + else: + L.info('All checks passed.') From dcfdbe558341c58d8f9761e5da5a8d7800164335 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 17:54:35 -0800 Subject: [PATCH 102/301] allowing either full orcid url or just number --- mnonboard/info_chx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 895958ec..576fdb10 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -200,6 +200,7 @@ def enter_orcid(prompt): while True: # ask the user for an ORCiD number o = req_input(prompt) + o = o.split('orcid.org/')[-1] # returns only number string even if this is not in string # make sure user has entered a valid ORCiD number if valid_orcid(o): return ORCID_PREFIX + o From 954d8958df3f1af92badb99972a434b748a77885 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 18:28:03 -0800 Subject: [PATCH 103/301] add debugging option for record lookup --- mnonboard/info_chx.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 576fdb10..f6554a4d 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -156,7 +156,7 @@ def enter_int(prompt): L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) print('Please enter 1 or greater.') -def record_lookup(search, cn_url='https://cn.dataone.org/cn'): +def record_lookup(search, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ @@ -172,7 +172,8 @@ def record_lookup(search, cn_url='https://cn.dataone.org/cn'): r = subject.content()[0].content() name = '%s %s' % (r[1], r[2]) L.info('Name associated with record %s found in %s: %s.' % (search, cn_url, name)) - return name + rt = name if not debug else r + return rt except exceptions.NotFound as e: L.info('Caught NotFound error from %s during lookup: %s' % (cn_url, e)) L.info('%s does not exist in this database. Will create a record.' % (search)) @@ -224,7 +225,9 @@ def user_input(): FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) elif '_name' in nf: # put the contact subject name in a different dict - names[nf] = req_input(FIELDS[f][nf][0]) + #names[nf] = req_input(FIELDS[f][nf][0]) + # postponing this step for later + pass elif nf in 'base_url': # get the base url baseurl = base_url(FIELDS[f][nf][0]) @@ -239,7 +242,9 @@ def user_input(): elif f in 'num_sitemap_urls': FIELDS[f][1] = enter_int(FIELDS[f][0]) elif '_name' in f: - names[f] = req_input(FIELDS[f][0]) + #names[f] = req_input(FIELDS[f][0]) + # postponing this step for later + pass else: FIELDS[f][1] = req_input(FIELDS[f][0]) # add the sitemap URLs field now that we're done with the loops @@ -249,7 +254,7 @@ def user_input(): # fx will ask the user to enter the URL(s) and return them as a dict # we then store it as the second list item in the 'sitemap_urls' field FIELDS['spider']['sitemap_urls'][1] = sitemap_urls(FIELDS['num_sitemap_urls'][1]) - return FIELDS, names + return FIELDS def transfer_info(ufields): """ From 09c8d5706ca9e0dbb5790960bdbceb8b4f8f01ab Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 18:45:34 -0800 Subject: [PATCH 104/301] more concise notfound error --- mnonboard/info_chx.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index f6554a4d..cf7b1284 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -175,8 +175,9 @@ def record_lookup(search, cn_url='https://cn.dataone.org/cn', debug=False): rt = name if not debug else r return rt except exceptions.NotFound as e: - L.info('Caught NotFound error from %s during lookup: %s' % (cn_url, e)) - L.info('%s does not exist in this database. Will create a record.' % (search)) + estrip = str(e).split('')[1].split('')[0] + e = e if debug else estrip + L.info('Caught NotFound error from %s during lookup. Details: %s' % (cn_url, e)) return False except exceptions.NotAuthorized as e: L.error('Caught NotAuthorized error from %s. Is your auth token up to date?' % (cn_url)) From 1933152ab71ce73d840a2f593d4c500ca843d0aa Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Jan 2023 20:05:07 -0800 Subject: [PATCH 105/301] get_or_create_subj will handle asking for names --- mnonboard/cli.py | 32 ++++++++++---------------------- mnonboard/utils.py | 25 +++++++++++++++++++++---- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index d54207e2..5a6e696e 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -17,40 +17,28 @@ def run(cfg): names = {} if cfg['info'] == 'user': # do the full user-driven info gathering process - ufields, names = info_chx.user_input() + ufields = info_chx.user_input() fields = info_chx.transfer_info(ufields) else: # grab the info from a json fields = utils.load_json(cfg['json_file']) info_chx.input_test(fields) # still need to ask the user for some names - f = 'contact_subject' - names[f+'_name'] = info_chx.orcid_name(fields['node'][f], f) - for f in ('default_owner', 'default_submitter'): - names[f+'_name'] = info_chx.orcid_name(fields[f], f) # now we're cooking # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) end_node_subj = fields['node']['subject'].split('/')[-1] loc = utils.node_path(nodedir=end_node_subj) # initialize a repository there (step 5) utils.init_repo(loc) - for f in ('default_owner', 'default_submitter'): - # add a subject for owner and submitter (may not be necessary) - utils.get_or_create_subj(loc=loc, - name=names[f+'_name'], - value=fields[f], - cn_url=cfg['cn_url']) - f = 'contact_subject' - # add subject for technical contact (step 6) - utils.get_or_create_subj(loc=loc, - name=names[f+'_name'], - value=fields['node'][f], - cn_url=cfg['cn_url']) - # add node as a subject (step 7) - utils.get_or_create_subj(loc=loc, - name=end_node_subj, - value=fields['node']['node_id'], - cn_url=cfg['cn_url']) + for f in ('default_owner', 'default_submitter', 'contact_subject'): + # add a subject for owner and submitter (may not be necessary if they exist already) + # add subject for technical contact (step 6) + val = fields[f] if f not in 'contact_subject' else fields['node'][f] + utils.get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) + # add node as a subject (step 7) + utils.get_or_create_subj(loc=loc, value=fields['node']['node_id'], + cn_url=cfg['cn_url'], + name=end_node_subj) # set the update schedule and set the state to up fields['node']['schedule'] = utils.set_schedule() fields['node']['state'] = 'up' diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 1421a8c6..6320c58d 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -4,7 +4,7 @@ from defs import SCHEDULES from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME -from mnonboard.info_chx import record_lookup, enter_schedule +from mnonboard.info_chx import record_lookup, enter_schedule, orcid_name def load_json(loc): """ @@ -76,11 +76,28 @@ def new_subject(loc, name, value): L.error('opersist subject creation command failed for %s (%s): %s' % (name, value, e)) exit(1) -def get_or_create_subj(loc, name, value, cn_url): +def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=False): """ Get an existing subject using their ORCiD or create a new one with the specified values. - """ - if not record_lookup(value, cn_url): + + This one I will definitely have to explain in the docstring. + """ + create = False + if name: + # we are probably creating a node record + L.info('Creating a node subject.') + create = True + else: + # name was not given. look up the orcid record in the database + name = record_lookup(value, cn_url) + if not name: + # if the name is not in the database, we will create it; else it's already there and we ignore it + L.info('%s does not exist in this database. Will create a record. Need a name first...' % (value)) + # ask the user for a name with the associated position and ORCiD record + name = orcid_name(value, title) + create = True + if create: + # finally, use opersist to create the subject new_subject(loc, name, value) def set_schedule(): From 740ff126b4e286059000a79872543367581e806f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 08:20:53 -0800 Subject: [PATCH 106/301] ensure node_id has the appropriate prefix --- mnonboard/defs.py | 1 + mnonboard/info_chx.py | 48 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 40565b88..45955ab9 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -2,6 +2,7 @@ ORCID_PREFIX = 'http://orcid.org/' SHACL_URL = 'https://raw.githubusercontent.com/ESIPFed/science-on-schema.org/master/validation/shapegraphs/soso_common_v1.2.3.ttl' +NODE_ID_PREFIX = 'urn:node:' CFG = { 'info': 'user', diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index cf7b1284..1d177a25 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -3,7 +3,7 @@ from d1_common.types import exceptions from os import environ -from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES +from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX from mnonboard import L from mnonboard import default_json from opersist.utils import JSON_TIME_FORMAT, dtnow @@ -210,6 +210,47 @@ def enter_orcid(prompt): L.warning("Invalid ORCiD number entered: %s" % o) print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') +def valid_nodeid(node_id): + """ + Make sure the node_id contains the correct prefix. + """ + if NODE_ID_PREFIX in node_id: + # if valid, return + return node_id + else: + # if invalid, ask user if they meant to do that + L.warning('Entered node_id does not contain the "%s" prefix. Entry: "%s"' % (NODE_ID_PREFIX, node_id)) + while True: + # prompt loop + c = input('node_id usually contains the prefix "%s" but the entered one (%s) does not.\n\ + This could have *serious* downstream consequences!\n\ + Do you wish to modify the node_id entry to fit the standard?\n\ + Ensure as well that the node_id is unique from that of all other member nodes.\n\ + Please answer "yes" or "no" (yes is default): ' % (NODE_ID_PREFIX, node_id)) + if c.lower() == 'no': + L.warning('User has chosen to continue with node_id entry of %s' % (node_id)) + return node_id + elif (c.lower() == 'yes') or (c.lower() == ''): + L.info('User has chosen to re-enter node_id. Entry: "%s"' % (c)) + return False + else: + L.info('User has entered something other than "yes", "", or "no" and will be prompted again. Entry: "%s"' % (c)) + pass + +def enter_nodeid(prompt='Unique node_id: ', id=False): + """ + Have the user enter a node_id and make sure it contains the correct id prefix. + """ + while True: + # ask the user for a node id + if not id: + id = req_input(prompt) + # validate and return + if valid_nodeid(id): + return id + else: + id = False + def user_input(): """ We need a few pieces of information to fill the json fields. @@ -222,6 +263,8 @@ def user_input(): if f in 'node': for nf in FIELDS[f]: # the second level beneath 'node' + if nf in 'node_id': + FIELDS[f][nf][1] = enter_nodeid(prompt=FIELDS[f][nf][0]) if nf in ['contact_subject']: FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) elif '_name' in nf: @@ -314,6 +357,9 @@ def input_test(fields): # test orcid record assert valid_url_prefix(fields[f][nf], ORCID_PREFIX, nf) assert valid_orcid(fields[f][nf].split('/')[-1]) + if 'node_id' in nf: + # check that the node_id is valid and prompt user to change if it's not + fields[f][nf] = enter_nodeid(id=fields[f][nf]) except KeyError as e: L.error('No "%s > %s" field found in json.' % (f, nf)) print('Please add the "%s > %s" field to the json you loaded and re-run the script.' % (f, nf)) From e122563b5d37659388b3c368fafd4ed713a4be4d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 08:24:16 -0800 Subject: [PATCH 107/301] changing uniqueness prompts --- mnonboard/defs.py | 2 +- mnonboard/info_chx.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 45955ab9..2de252c2 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -29,7 +29,7 @@ FIELDS = { 'node': { - 'node_id': ['Member node identifier (must be unique): ', None], + 'node_id': ['Member node_id (must be unique): ', None], 'name': ['Repository name: ', None], 'description': ['Repository description: ', None], 'base_url': ['Base URL of repository: ', None], diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 1d177a25..0bcfe389 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -225,7 +225,6 @@ def valid_nodeid(node_id): c = input('node_id usually contains the prefix "%s" but the entered one (%s) does not.\n\ This could have *serious* downstream consequences!\n\ Do you wish to modify the node_id entry to fit the standard?\n\ - Ensure as well that the node_id is unique from that of all other member nodes.\n\ Please answer "yes" or "no" (yes is default): ' % (NODE_ID_PREFIX, node_id)) if c.lower() == 'no': L.warning('User has chosen to continue with node_id entry of %s' % (node_id)) @@ -244,6 +243,7 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): while True: # ask the user for a node id if not id: + print('Please ensure that the node_id is unique from that of all other member nodes!') id = req_input(prompt) # validate and return if valid_nodeid(id): From 556fc1c6bae47821490041a31bc2dcd3ec50d565 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 09:14:32 -0800 Subject: [PATCH 108/301] adding option to check specified number of metadata files --- mnonboard/cli.py | 31 +++++++++++++++++++++++-------- mnonboard/defs.py | 11 ++++++++--- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 5a6e696e..be272389 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -49,7 +49,7 @@ def run(cfg): # run scrapy to harvest metadata (step 10) utils.harvest_data(loc, end_node_subj) # now run tests - data_chx.test_mdata(loc) + data_chx.test_mdata(loc, cfg['check_files']) def main(): @@ -58,8 +58,8 @@ def main(): """ # get arguments try: - opts = getopt.getopt(sys.argv[1:], 'hiPd:l:', - ['help', 'init', 'production', 'dump=', 'load='] + opts = getopt.getopt(sys.argv[1:], 'hiPd:l:c:', + ['help', 'init', 'production', 'dump=', 'load=', 'check='] )[0] except Exception as e: L.error('Error: %s' % e) @@ -84,11 +84,26 @@ def main(): # load from json file CFG['info'] = 'json' CFG['json_file'] = a - L.info('running mnonboard in %s mode. data gathering from: %s. cn_url: %s' % (CFG['mode'], - CFG['info'], - CFG['cn_url'])) - run(CFG) - + if o in ('-c', '--check'): + try: + CFG['check_files'] = int(a) + except ValueError: + L.error('Option -c (--check) requires an integer number of files to check.') + print(HELP_TEXT) + exit(1) + L.info('running mnonboard in %s mode.\n\ +data gathering from: %s\n\ +cn_url: %s\n\ +number of metadata files to check: %s' % (CFG['mode'], + CFG['info'], + CFG['cn_url'], + CFG['check_files'])) + try: + run(CFG) + except KeyboardInterrupt: + print() + L.error('Caught KeyboardInterrupt, quitting...') + exit(1) if __name__ == '__main__': main() diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 2de252c2..e4b5c1ec 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -9,6 +9,7 @@ 'json_file': 'node.json', 'cn_url': 'https://cn-stage.test.dataone.org/cn', 'mode': 'staging', + 'check_files': 5, } HELP_TEXT = """DataONE member node onboard script @@ -16,14 +17,18 @@ Usage: cli [ OPTIONS ] where OPTIONS := { + -c | --check=[ NUMBER ] + number of random metadata files to check for schema.org compliance + -d | --dump=[ FILE ] + dump default member node json file to configure manually -h | --help display this help message -i | --init initialize a new member node from scratch - -l | --load + -l | --load=[ FILE ] initialize a new member node from a json file - -d | --dump - dump default member node json file to configure manually + -P | --production + run this script in production mode (uses the D1 cn API in searches) } """ % __version__ From 10b644685197275a411e1b72b6315e4fb288340f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 09:28:05 -0800 Subject: [PATCH 109/301] adding option to check all records if necessary --- mnonboard/cli.py | 17 ++++++++++------- mnonboard/data_chx.py | 12 ++++++++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index be272389..da5fe67d 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -88,16 +88,19 @@ def main(): try: CFG['check_files'] = int(a) except ValueError: - L.error('Option -c (--check) requires an integer number of files to check.') - print(HELP_TEXT) - exit(1) + if a == 'all': # this should probably not be used unless necessary! + CFG['check_files'] = a + else: + L.error('Option -c (--check) requires an integer number of files to check.') + print(HELP_TEXT) + exit(1) L.info('running mnonboard in %s mode.\n\ data gathering from: %s\n\ cn_url: %s\n\ -number of metadata files to check: %s' % (CFG['mode'], - CFG['info'], - CFG['cn_url'], - CFG['check_files'])) +metadata files to check: %s' % (CFG['mode'], + CFG['info'], + CFG['cn_url'], + CFG['check_files'])) try: run(CFG) except KeyboardInterrupt: diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 7d46d69d..c4224380 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -16,17 +16,21 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): L.info('Checking %s files.' % num_tests) op = getOpersistInstance(loc) num_things = op.countThings() + num_tests = num_things if num_tests == 'all' else num_tests # might have to test all the things? let's hope not q = op.getSession().query(Thing) # this might be too inefficient for large sets; may need to change i, valid_files, load_errs = 0, 0, 0 viol_dict = {} while i < num_tests: record = '' violati1, violati2 = 0, 0 - # get a random thing and decode its path + # get a thing and decode its path L.info('Record check %s/%s...' % (i+1, num_tests)) - rand = random.randint(0, num_things) - t = q[rand] - L.info('Selected record number %s of %s in set: %s' % (rand, num_things, t.content)) + if num_tests != num_things: + thing_no = random.randint(0, num_things) + else: + thing_no = i + t = q[thing_no] + L.info('Selected record number %s of %s in set: %s' % (thing_no, num_things, t.content)) pth = op.contentAbsPath(t.content) # read to object L.info('Reading binary from %s' % (pth)) From 5a73cb910c817efa132c2603e116ed73f45038e1 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 10:02:25 -0800 Subject: [PATCH 110/301] bug fix --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index c4224380..25827ffc 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -59,7 +59,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): if not conforms2: violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) L.error('pyshacl found %s additional violation(s):\n%s' \ - % (violati2, res_text)) + % (violati2, res_text2)) else: L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 From 15ee77337750b54dd5c85ec49f286f2c31698589 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 10:14:16 -0800 Subject: [PATCH 111/301] bug fix --- mnonboard/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index da5fe67d..ed64dd0d 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -49,7 +49,7 @@ def run(cfg): # run scrapy to harvest metadata (step 10) utils.harvest_data(loc, end_node_subj) # now run tests - data_chx.test_mdata(loc, cfg['check_files']) + data_chx.test_mdata(loc, num_tests=cfg['check_files']) def main(): From 2b57ba3e99b40fe3bc9bf75e51094bce3185a5d7 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 10:25:07 -0800 Subject: [PATCH 112/301] log message clarity --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 25827ffc..67d03393 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -103,7 +103,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): L.info('Continuing to next record...') i += 1 L.info('Found %s valid records out of %s checked.' % (valid_files, i)) - L.info('Could not check %s records due to load and/or decode errors.' % (load_errs)) + L.info('%s failures due to load and/or decode errors.' % (load_errs)) if len(viol_dict) > 0: rep_str = 'Validation report (sha256 - violations or error):\n' for v in viol_dict: From a8aed214dabcd38f0e18adfa32770516492e94fd Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 15:08:17 -0800 Subject: [PATCH 113/301] closing opersist instance and moving continue log msg --- mnonboard/data_chx.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 67d03393..335330d0 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -21,6 +21,8 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): i, valid_files, load_errs = 0, 0, 0 viol_dict = {} while i < num_tests: + if i > 0: + L.info('Continuing to next record...') record = '' violati1, violati2 = 0, 0 # get a thing and decode its path @@ -100,7 +102,6 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): viol_dict[t.content] = repr(e) load_errs += 1 finally: - L.info('Continuing to next record...') i += 1 L.info('Found %s valid records out of %s checked.' % (valid_files, i)) L.info('%s failures due to load and/or decode errors.' % (load_errs)) @@ -111,3 +112,5 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): L.info(rep_str) else: L.info('All checks passed.') + # close the opersist instance + op.close() \ No newline at end of file From 28908883e5a50d19bdf96c34d48aa42463c2d742 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 16:00:27 -0800 Subject: [PATCH 114/301] adding local subject lookup and renaming cn lookup --- mnonboard/info_chx.py | 25 +++++++++++++++++++++---- mnonboard/utils.py | 23 ++++++++++++++++------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 0bcfe389..f3766ab6 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -7,6 +7,7 @@ from mnonboard import L from mnonboard import default_json from opersist.utils import JSON_TIME_FORMAT, dtnow +from opersist.cli import getOpersistInstance D1_AUTH_TOKEN = environ.get('D1_AUTH_TOKEN') @@ -156,7 +157,7 @@ def enter_int(prompt): L.warning("Number of database sitemap URLs can't be less than 1. (%s entered)" % i) print('Please enter 1 or greater.') -def record_lookup(search, cn_url='https://cn.dataone.org/cn', debug=False): +def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ @@ -167,11 +168,11 @@ def record_lookup(search, cn_url='https://cn.dataone.org/cn', debug=False): client = CoordinatingNodeClient(cn_url, **options) try: # Get records - L.info('Starting record lookup for %s from %s' % (search, cn_url)) - subject = client.getSubjectInfo(search) + L.info('Starting record lookup for %s from %s' % (subj, cn_url)) + subject = client.getSubjectInfo(subj) r = subject.content()[0].content() name = '%s %s' % (r[1], r[2]) - L.info('Name associated with record %s found in %s: %s.' % (search, cn_url, name)) + L.info('Name associated with record %s found in %s: %s.' % (subj, cn_url, name)) rt = name if not debug else r return rt except exceptions.NotFound as e: @@ -186,6 +187,22 @@ def record_lookup(search, cn_url='https://cn.dataone.org/cn', debug=False): L.error('Unspecified error from %s:\n%s' % (cn_url, e)) exit(1) +def local_subj_lookup(subj, loc): + """ + Use the local opersist instance to look up a subject. + """ + L.info('Looking up %s in sqlite database at %s' % (subj, loc)) + op = getOpersistInstance(loc) + rec = op.getSubject(subj=subj) + op.close() + if rec: + rec = rec.asJsonDict() + L.info('Found record: %s' % (rec)) + return rec['name'] + else: + L.info('No subject found.') + return False + def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 6320c58d..2f370bc8 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -4,7 +4,7 @@ from defs import SCHEDULES from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME -from mnonboard.info_chx import record_lookup, enter_schedule, orcid_name +from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name def load_json(loc): """ @@ -60,7 +60,9 @@ def init_repo(loc): ''' try: L.info('Using opersist to init new member node folder: %s' % loc) - subprocess.run(['opersist', '-f', loc, 'init'], check=True) + subprocess.run(['opersist', + '--folder=%s' % (loc), + 'init'], check=True) except Exception as e: L.error('opersist init command failed (node folder: %s): %s' % (loc, e)) exit(1) @@ -71,7 +73,12 @@ def new_subject(loc, name, value): """ try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) - subprocess.run(['opersist', '-f', loc, 'sub', '-n', '"%s"' % name, '-s', value], check=True) + subprocess.run(['opersist', + '--folder=%s' % (loc), + 'sub', + '--operation=create', + '--name=%s' % name, + '--subj=%s' % value], check=True) except Exception as e: L.error('opersist subject creation command failed for %s (%s): %s' % (name, value, e)) exit(1) @@ -89,15 +96,17 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal create = True else: # name was not given. look up the orcid record in the database - name = record_lookup(value, cn_url) + name = cn_subj_lookup(subj=value, cn_url=cn_url) if not name: - # if the name is not in the database, we will create it; else it's already there and we ignore it - L.info('%s does not exist in this database. Will create a record. Need a name first...' % (value)) + name = local_subj_lookup(subj=value, loc=loc) + if not name: + # if the name is not in either database, we will create it; else it's already there and we ignore it + L.info('%s does not exist either locally or at %s. Will create a record. Need a name first...' % (value)) # ask the user for a name with the associated position and ORCiD record name = orcid_name(value, title) create = True if create: - # finally, use opersist to create the subject + # finally, use opersist to create the subject (sloppy, could create it directly, but this does the same thing) new_subject(loc, name, value) def set_schedule(): From b2a515c70ff3fff5a9c691544350e76a1893af59 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 17:06:42 -0800 Subject: [PATCH 115/301] adding a way to turn off long debug strings --- mnonboard/data_chx.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 335330d0..423ddb0a 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -8,7 +8,7 @@ from opersist.models.thing import Thing from json.decoder import JSONDecodeError -def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): +def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=True): """ Use pyshacl to test harvested metadata. """ @@ -39,7 +39,9 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): try: with open(pth, 'rb') as f: record = f.read().decode('utf-8') - L.info('Success; record follows:\n%s' % (record)) + L.info('Success.') + if debug: + ('Record follows:\n%s' % (record)) conforms, res_graph, res_text = validate(data_graph=record, data_graph_format=format, shacl_graph=shp_graph, @@ -47,7 +49,9 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): if not conforms: violati1 = int(res_text.split('\n')[2].split('(')[1].split(')')[0]) constraint_viol = ' including Constraint Violations' if 'Constraint Violation' in res_text else '' - L.error('pyshacl found %s violation(s):\n%s' % (violati1, res_text)) + L.error('pyshacl found %s violations.' % (violati1)) + if debug: + L.error('Details:\n%s' % (res_text)) if (violati1 == 1) and (' not ' in res_text): # under this condition there is one constraint violation where the record uses https constraint_viol = ' including https vs http namespace violation' @@ -60,8 +64,9 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): shacl_graph_format='turtle',) if not conforms2: violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) - L.error('pyshacl found %s additional violation(s):\n%s' \ - % (violati2, res_text2)) + L.error('pyshacl found %s additional violations.' % (violati2)) + if debug: + L.error('Details:\n%s' % (res_text2)) else: L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 From 976758ad6c5a9284e64f847c30f4e8e576c12184 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 17:08:27 -0800 Subject: [PATCH 116/301] bug fix --- mnonboard/data_chx.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 423ddb0a..e71dde54 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -41,7 +41,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr record = f.read().decode('utf-8') L.info('Success.') if debug: - ('Record follows:\n%s' % (record)) + L.info('Record follows:\n%s' % (record)) conforms, res_graph, res_text = validate(data_graph=record, data_graph_format=format, shacl_graph=shp_graph, @@ -51,7 +51,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr constraint_viol = ' including Constraint Violations' if 'Constraint Violation' in res_text else '' L.error('pyshacl found %s violations.' % (violati1)) if debug: - L.error('Details:\n%s' % (res_text)) + L.info('Details:\n%s' % (res_text)) if (violati1 == 1) and (' not ' in res_text): # under this condition there is one constraint violation where the record uses https constraint_viol = ' including https vs http namespace violation' @@ -66,7 +66,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) L.error('pyshacl found %s additional violations.' % (violati2)) if debug: - L.error('Details:\n%s' % (res_text2)) + L.info('Details:\n%s' % (res_text2)) else: L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 From 93aafbf877f8dfcd3629df770c2ce628b16bece5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 18:17:51 -0800 Subject: [PATCH 117/301] making logging more informative --- mnonboard/__init__.py | 6 +++--- mnonboard/cli.py | 8 ++++---- mnonboard/data_chx.py | 6 +++++- mnonboard/info_chx.py | 42 +++++++++++++++++++++++++++++++++++++----- mnonboard/utils.py | 21 ++++++++++++++++++--- 5 files changed, 67 insertions(+), 16 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index eae3bae5..424b8510 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -23,7 +23,7 @@ def start_logging(): format=LOG_FORMAT, datefmt=LOG_DATE_FORMAT, ) - l = logging.getLogger("main") + l = logging.getLogger("init") formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) # this initializes logging to file f = logging.FileHandler(LOG_LOC) @@ -32,9 +32,9 @@ def start_logging(): # warnings also go to file # initialize logging l.addHandler(f) - return l + return l, f -L = start_logging() +L, F = start_logging() L.info('----- mnonboard %s start -----' % __version__) # absolute path of current file diff --git a/mnonboard/cli.py b/mnonboard/cli.py index ed64dd0d..2f0bdb48 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -1,20 +1,18 @@ import os, sys import getopt +import logging import utils import info_chx import data_chx from defs import CFG, HELP_TEXT -from mnonboard import L -from mnonboard import default_json +from mnonboard import default_json, F def run(cfg): """ Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. """ - fields = default_json(fx='mnonboard.cli.run()') - names = {} if cfg['info'] == 'user': # do the full user-driven info gathering process ufields = info_chx.user_input() @@ -56,6 +54,8 @@ def main(): """ Uses getopt to set config values in order to call run(). """ + L = logging.getLogger('main') + L.addHandler(F) # get arguments try: opts = getopt.getopt(sys.argv[1:], 'hiPd:l:c:', diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index e71dde54..ad515b10 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -2,7 +2,9 @@ from pyshacl import validate from pyshacl.errors import ShapeLoadError, ConstraintLoadError, \ ReportableRuntimeError -from mnonboard import L +import logging + +from mnonboard import F from mnonboard.defs import SHACL_URL from opersist.cli import getOpersistInstance from opersist.models.thing import Thing @@ -12,6 +14,8 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr """ Use pyshacl to test harvested metadata. """ + L = logging.getLogger('test_mdata') + L.addHandler(F) L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) L.info('Checking %s files.' % num_tests) op = getOpersistInstance(loc) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index f3766ab6..575623b6 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -1,11 +1,10 @@ -import json from d1_client.cnclient import CoordinatingNodeClient from d1_common.types import exceptions from os import environ +import logging from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX -from mnonboard import L -from mnonboard import default_json +from mnonboard import default_json, F from opersist.utils import JSON_TIME_FORMAT, dtnow from opersist.cli import getOpersistInstance @@ -19,6 +18,8 @@ def not_empty(f): return f != '' def req_input(desc): + L = logging.getLogger('req_input') + L.addHandler(F) while True: i = input(desc) L.info('User entry for %s"%s"' % (desc, i)) @@ -40,6 +41,8 @@ def valid_orcid(orcid): This seems like overkill but is probably good to have since it will be used to store contacts for database upkeep/maintenance. """ + L = logging.getLogger('valid_orcid') + L.addHandler(F) if (len(orcid) == 19): # it's 19 characters long. start test loop for i in range(0,19): @@ -74,6 +77,8 @@ def base_url(descrip): """ Validate the base URL of the member node. Should include trailing slash. """ + L = logging.getLogger('base_url') + L.addHandler(F) while True: url = req_input(descrip) if url[-1] in '/': @@ -86,6 +91,8 @@ def valid_url_prefix(url, prefix, f): """ Validate a URL prefix (such as for an ORCiD number). """ + L = logging.getLogger('valid_url_prefix') + L.addHandler(F) # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) @@ -102,6 +109,8 @@ def sitemap_urls(num_urls): Collect the sitemap URLs. Usually there will be just one of these but we will prepare for more. """ + L = logging.getLogger('sitemap_urls') + L.addHandler(F) i = 0 while i < num_urls: # add URLs one at a time (should only be a few at most) @@ -115,6 +124,8 @@ def enter_schedule(): """ Give the user a choice between three basic scheduling options. """ + L = logging.getLogger('enter_schedule') + L.addHandler(F) p = 'Select a starting frequency with which to scrape data from this member node.\n' \ '1: Monthly\n' \ '2: Daily\n' \ @@ -138,6 +149,8 @@ def enter_int(prompt): """ Make sure the user enters an integer value of 1 or greater. """ + L = logging.getLogger('enter_int') + L.addHandler(F) i = None while True: # make sure user enters an int @@ -161,6 +174,8 @@ def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ + L = logging.getLogger('cn_subj_lookup') + L.addHandler(F) # this authentication method was adapted from: # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} @@ -191,6 +206,8 @@ def local_subj_lookup(subj, loc): """ Use the local opersist instance to look up a subject. """ + L = logging.getLogger('local_subj_lookup') + L.addHandler(F) L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) rec = op.getSubject(subj=subj) @@ -207,6 +224,8 @@ def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. """ + L = logging.getLogger('orcid_name') + L.addHandler(F) L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) L.info('User has entered "%s"' % name) @@ -216,6 +235,8 @@ def enter_orcid(prompt): """ Make sure the user enters an integer value of 1 or greater. """ + L = logging.getLogger('enter_orcid') + L.addHandler(F) while True: # ask the user for an ORCiD number o = req_input(prompt) @@ -231,6 +252,8 @@ def valid_nodeid(node_id): """ Make sure the node_id contains the correct prefix. """ + L = logging.getLogger('valid_nodeid') + L.addHandler(F) if NODE_ID_PREFIX in node_id: # if valid, return return node_id @@ -257,7 +280,10 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): """ Have the user enter a node_id and make sure it contains the correct id prefix. """ + L = logging.getLogger('enter_nodeid') + L.addHandler(F) while True: + L.info('In loop, vars are prompt="%s", id="%s"' % (prompt, id)) # ask the user for a node id if not id: print('Please ensure that the node_id is unique from that of all other member nodes!') @@ -272,9 +298,11 @@ def user_input(): """ We need a few pieces of information to fill the json fields. """ + L = logging.getLogger('user_input') + L.addHandler(F) names = {} baseurl = '' - L.info('Collecting user input (mnonboard.mnutils.user_input()).') + L.info('Collecting user input.') for f in FIELDS: # the lowest level of the dict/json structure if f in 'node': @@ -321,6 +349,8 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. """ + L = logging.getLogger('transfer_info') + L.addHandler(F) fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') for f in ufields: @@ -339,7 +369,9 @@ def input_test(fields): """ Testing the manually filled json file. """ - L.info('Running mnonboard.mnutils.input_test() on imported json.') + L = logging.getLogger('input_test') + L.addHandler(F) + L.info('Running tests on imported json.') # first, test that there are the fields we need test_fields = default_json(fx='mnonboard.info_chx.input_test()') # test at nest level 1 diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 2f370bc8..3c445b60 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -1,15 +1,18 @@ import os import json import subprocess +import logging from defs import SCHEDULES -from mnonboard import L, NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME +from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, F from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name def load_json(loc): """ Load json from file. """ + L = logging.getLogger('load_json') + L.addHandler(F) L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: @@ -27,6 +30,8 @@ def save_json(loc, jf): """ Output json to file. """ + L = logging.getLogger('save_json') + L.addHandler(F) L.info('Writing member node json to %s' % loc) try: with open(loc, 'w') as f: @@ -58,6 +63,8 @@ def init_repo(loc): ''' Initialize a new instance using opersist. ''' + L = logging.getLogger('init_repo') + L.addHandler(F) try: L.info('Using opersist to init new member node folder: %s' % loc) subprocess.run(['opersist', @@ -67,10 +74,12 @@ def init_repo(loc): L.error('opersist init command failed (node folder: %s): %s' % (loc, e)) exit(1) -def new_subject(loc, name, value): +def new_subj(loc, name, value): """ Create new subject in the database using opersist. """ + L = logging.getLogger('new_subj') + L.addHandler(F) try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) subprocess.run(['opersist', @@ -89,6 +98,8 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal This one I will definitely have to explain in the docstring. """ + L = logging.getLogger('get_or_create_subj') + L.addHandler(F) create = False if name: # we are probably creating a node record @@ -107,7 +118,7 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal create = True if create: # finally, use opersist to create the subject (sloppy, could create it directly, but this does the same thing) - new_subject(loc, name, value) + new_subj(loc, name, value) def set_schedule(): """ @@ -120,6 +131,8 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ + L = logging.getLogger('restart_mnlite') + L.addHandler(F) L.info('Restarting mnlite systemctl service...') try: subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) @@ -143,6 +156,8 @@ def harvest_data(loc, mn_name): """ """ + L = logging.getLogger('harvest_data') + L.addHandler(F) log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) L.info('scrapy log location is %s' % (log_loc)) From 3c426beed3ecf4d2f6f94aed53a5730a125e5fcd Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Jan 2023 18:18:49 -0800 Subject: [PATCH 118/301] bug fix --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 3c445b60..ce9994e9 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -112,7 +112,7 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal name = local_subj_lookup(subj=value, loc=loc) if not name: # if the name is not in either database, we will create it; else it's already there and we ignore it - L.info('%s does not exist either locally or at %s. Will create a record. Need a name first...' % (value)) + L.info('%s does not exist either locally or at %s. Will create a record. Need a name first...' % (value, cn_url)) # ask the user for a name with the associated position and ORCiD record name = orcid_name(value, title) create = True From 8e0927807617cc3e12e7004dac5996cf0bcff0a5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 6 Jan 2023 08:15:07 -0800 Subject: [PATCH 119/301] categorization of shacl violations --- mnonboard/defs.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index e4b5c1ec..323c764f 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -93,4 +93,26 @@ "wday": "?", "year": "*" } -} \ No newline at end of file +} + +SHACL_ERRORS = { + 'essential': { + 'MalformedJSON': 'Metadata files must be properly formatted json-ld', + 'soso:DatasetNS1Shape': 'Expecting SO namespace of not ', + 'soso:DatasetNS2Shape': 'Expecting SO namespace of not ', + 'soso:DatasetNS3Shape': 'Expecting SO namespace of not ', + 'soso:IDShape': 'Dataset must have an ID', + 'SO:Dataset-description': 'Dataset must have a description', + 'SO:Dataset-identifier': 'Dataset identifiers must be a URL, Text or PropertyValue', + 'SO:Dataset-keywords': 'A Dataset should include descriptive keywords as literals or DefinedTerm', + 'SO:Dataset-name': 'Name is required for a Dataset', + 'SO:Dataset-url': 'Dataset requires a URL for the location of a page describing the dataset', + 'SO:Dataset-version': 'Dataset must have a version as Literal or Number', + }, + 'optional': { + 'SO:Dataset-isAccessibleForFree': 'It is recommended that a Dataset indicates accessibility for free or otherwise', + 'SO:Dataset-sameAs': 'It is recommended that a Dataset includes a sameAs URL', + 'schema:GeoCoordinates-longitude': 'It is recommended that a Dataset has a longitude coordinate in WGS-84 format', + 'schema:GeoCoordinates-latitude': 'It is recommended that a Dataset has a latitude coordinate in WGS-84 format', + } +} From 74fe4616ac3292c4e028832c70c890d82ef210ba Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 6 Jan 2023 08:18:12 -0800 Subject: [PATCH 120/301] new violations categorization function --- mnonboard/data_chx.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index ad515b10..6a341851 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -10,6 +10,12 @@ from opersist.models.thing import Thing from json.decoder import JSONDecodeError +def violation_cat(viol): + """ + A function that determines the severity of a passed shacl violation. + """ + pass + def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=True): """ Use pyshacl to test harvested metadata. From 6b0a852f64dbad05dbdbba93efc81a046f8435a0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 6 Jan 2023 09:19:58 -0800 Subject: [PATCH 121/301] trailing newline --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 6a341851..85c9e4b4 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -128,4 +128,4 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr else: L.info('All checks passed.') # close the opersist instance - op.close() \ No newline at end of file + op.close() From 4e088154434ea4eb5260052aba28f8fb66f739af Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 11 Jan 2023 14:00:33 -0800 Subject: [PATCH 122/301] adding prompt to limit number of tested metadata objects --- mnonboard/data_chx.py | 9 +++++++-- mnonboard/utils.py | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 85c9e4b4..259d5111 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -6,6 +6,7 @@ from mnonboard import F from mnonboard.defs import SHACL_URL +from mnonboard.utils import limit_tests from opersist.cli import getOpersistInstance from opersist.models.thing import Thing from json.decoder import JSONDecodeError @@ -23,10 +24,14 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr L = logging.getLogger('test_mdata') L.addHandler(F) L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) - L.info('Checking %s files.' % num_tests) op = getOpersistInstance(loc) num_things = op.countThings() - num_tests = num_things if num_tests == 'all' else num_tests # might have to test all the things? let's hope not + if (num_tests == 'all') and (num_things >= 500): + L.warning('User has chosen to shacl test all %s files in the set. Asking to limit...' % num_things) + # 500 will take about a minute and use a bunch of resources. let's suggest keeping it shorter than that + num_tests = limit_tests(num_things) + num_tests = num_things if num_tests == 'all' else num_tests # still might have to test all the things + L.info('Checking %s files.' % num_tests) q = op.getSession().query(Thing) # this might be too inefficient for large sets; may need to change i, valid_files, load_errs = 0, 0, 0 viol_dict = {} diff --git a/mnonboard/utils.py b/mnonboard/utils.py index ce9994e9..8fed9077 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -169,3 +169,29 @@ def harvest_data(loc, mn_name): L.info('scrapy crawl complete.') except Exception as e: L.error('Error running scrapy: %s' % e) + +def limit_tests(num_things): + """ + Ask the user to limit the number of tests to run on a given set of metadata. + """ + L = logging.getLogger('limit_tests') + while True: + i = input('Testing more than 500 objects is not recommended due to performance concerns.\n\ +This may take several minutes and use critical server resources. (est: %s min)\n\ +Are you sure you want to test all %s metadata objects in this set? (y/N): ' % (round(num_things/500), num_things)) + if (i.lower() in 'n') or (i.lower() in ''): + L.info('User has chosen enter a new number of objects to test.') + while True: + n = input('Please enter a new number of metadata objects to test: ') + try: + num_things = int(n) + break + except ValueError as e: + L.error('User has not entered a number ("%s")' % n) + if num_things <= 500: + L.info('User has chosen to test %s metadata objects.' % num_things) + break + else: + L.info('User has chosen to continue testing %s objects.' % (num_things)) + break + return num_things From 7734493b6ab2603c202d7614fdd8dd94ce139d8e Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 11 Jan 2023 15:17:04 -0800 Subject: [PATCH 123/301] adding docstring --- mnonboard/data_chx.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 259d5111..2d9fb74c 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -20,6 +20,12 @@ def violation_cat(viol): def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=True): """ Use pyshacl to test harvested metadata. + + Args: + loc: The base MN folder path in which opersist keeps its data and databases + shp_graph: Shape graph to be used for testing (defaults to soso v1.2.3) + num_tests: Number of metadata files to test (randomly selected; default=3) + debug: If True, will print a lot of debug information including metadata file contents """ L = logging.getLogger('test_mdata') L.addHandler(F) From e409aa629286e6eb105a05516e6c49e49d2ec01a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 12 Jan 2023 08:27:52 -0800 Subject: [PATCH 124/301] comment clarity --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 2d9fb74c..74322c53 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -36,7 +36,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr L.warning('User has chosen to shacl test all %s files in the set. Asking to limit...' % num_things) # 500 will take about a minute and use a bunch of resources. let's suggest keeping it shorter than that num_tests = limit_tests(num_things) - num_tests = num_things if num_tests == 'all' else num_tests # still might have to test all the things + num_tests = num_things if num_tests == 'all' else num_tests # still might have to test all things if (num_things < 500) L.info('Checking %s files.' % num_tests) q = op.getSession().query(Thing) # this might be too inefficient for large sets; may need to change i, valid_files, load_errs = 0, 0, 0 From 4a4634376abd2b6d0f17443f420de70ece8cffac Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 17 Jan 2023 11:00:16 -0800 Subject: [PATCH 125/301] fixing a linting error --- mnonboard/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 424b8510..56be8704 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -12,7 +12,7 @@ FN_DATE = datetime.now().strftime('%Y-%m-%d') YM_DATE = datetime.now().strftime('%Y-%m') LOG_DIR = '/var/log/mnlite/' -LOG_NAME = 'mnonboard-%s.log' % FN_DATE +LOG_NAME = 'mnonboard-%s.log' % (FN_DATE) LOG_LOC = os.path.join(LOG_DIR, LOG_NAME) HARVEST_LOG_NAME = '-crawl-%s.log' % YM_DATE From d87c90a8141e63fd9af3a37f8ef2addcc7aba331 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 17 Jan 2023 11:01:17 -0800 Subject: [PATCH 126/301] improving handling for violation dictionary --- mnonboard/data_chx.py | 68 +++++++++++++++++++++++++++++++++---------- mnonboard/defs.py | 14 ++++++++- 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 74322c53..2d9b5cc1 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -5,17 +5,55 @@ import logging from mnonboard import F -from mnonboard.defs import SHACL_URL +from mnonboard.defs import SHACL_URL, SHACL_ERRORS from mnonboard.utils import limit_tests from opersist.cli import getOpersistInstance from opersist.models.thing import Thing from json.decoder import JSONDecodeError +def violation_extract(viol): + """ + A function that extracts the name of the violation from a dictionary entry. + """ + pass + def violation_cat(viol): """ A function that determines the severity of a passed shacl violation. """ - pass + L = logging.getLogger('violation_cat') + L.addHandler(F) + cat = '%s - %s: %s' + if viol in SHACL_ERRORS['essential']: + cat = cat % ('ESSENTIAL', viol, SHACL_ERRORS['essential'][viol]) + elif viol in SHACL_ERRORS['optional']: + cat = cat % ('Optional', viol, SHACL_ERRORS['essential'][viol]) + elif viol in SHACL_ERRORS['internal']: + cat = cat % ('Internal', viol, SHACL_ERRORS['essential'][viol]) + else: + cat = cat % ('Not found', viol, 'Not found in SHACL_ERRORS dictionary! Consult NCEAS node manager for information.') + L.info('Violation categorization for %s: %s' % (viol, cat)) + return cat + +def violation_report(viol_dict): + """ + A function that outputs a report containing information on the violations found while shacl testing. + """ + L = logging.getLogger('violation_report') + L.addHandler(F) + L.info('Creating report.') + if len(viol_dict) > 0: + rep_str = 'Validation report (sha256 - violations or error):\n' + for v in viol_dict: + i = 0 + while i > len(v): + viol = violation_extract(v[i]) + rep_str = rep_str + violation_cat(viol) + i += 1 + L.info(rep_str) + else: + L.info('All checks passed.') + def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=True): """ @@ -67,6 +105,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr data_graph_format=format, shacl_graph=shp_graph, shacl_graph_format='turtle',) + viol_dict[t.content] = {0: [conforms, res_graph, res_text]} if not conforms: violati1 = int(res_text.split('\n')[2].split('(')[1].split(')')[0]) constraint_viol = ' including Constraint Violations' if 'Constraint Violation' in res_text else '' @@ -83,6 +122,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr data_graph_format=format, shacl_graph=shp_graph, shacl_graph_format='turtle',) + viol_dict[t.content][1] = [conforms2, res_graph2, res_text2] if not conforms2: violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) L.error('pyshacl found %s additional violations.' % (violati2)) @@ -92,51 +132,47 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 L.info('Total shacl violations in file: %s' % (tot_violations)) - viol_dict[t.content] = 'shacl violations%s (%s total)' % (constraint_viol, tot_violations, ) + viol_dict[t.content] = {0: [False, None, 'shacl violations%s (%s total)' % (constraint_viol, tot_violations)]} else: L.info('No violations found in %s' % (pth)) - viol_dict[t.content] = None + viol_dict[t.content] = {0: [True, None, 'No violations.']} valid_files += 1 except ShapeLoadError as e: # could be an error with either data or shacl file L.error('pyshacl threw ShapeLoadError: %s' % e) - viol_dict[t.content] = 'ShapeLoadError' + viol_dict[t.content] = {0: [False, None, 'ShapeLoadError: %s' % e]} load_errs += 1 except ConstraintLoadError as e: # I think this is only possible when loading the shacl graph (i.e. w/ constraints) L.error('pyshacl threw ConstraintLoadError: %s' % e) - viol_dict[t.content] = 'ConstraintLoadError' + viol_dict[t.content] = {0: [False, None, 'ConstraintLoadError']} load_errs += 1 except ReportableRuntimeError as e: # not exactly sure what this is L.error('pyshacl threw ReportableRuntimeError: %s' % e) - viol_dict[t.content] = 'ReportableRuntimeError' + viol_dict[t.content] = {0: [False, None, 'ReportableRuntimeError']} load_errs += 1 except JSONDecodeError as e: # malformed json in the json-ld record, this is definitely related to the data graph L.error('JSON is malformed, this record cannot be validated. Details:\n%s' % e) - viol_dict[t.content] = 'JSONDecodeError' + viol_dict[t.content] = {0: [False, None, 'JSONDecodeError']} load_errs += 1 except FileNotFoundError as e: # somehow the file we got from the database does not exist L.error('Could not find a file at %s' % (pth)) + viol_dict[t.content] = {0: [False, None, 'FileNotFoundError']} + load_errs += 1 except Exception as e: # this might have something to do with code in this function # if it's a TypeError, it could have to do with the creation of violati1/violati2 L.error('Error validating record %s' % (pth)) L.error('Uncaught exception (%s): %s' % (repr(e), e)) - viol_dict[t.content] = repr(e) + viol_dict[t.content] = {0: [False, None, repr(e)]} load_errs += 1 finally: i += 1 L.info('Found %s valid records out of %s checked.' % (valid_files, i)) L.info('%s failures due to load and/or decode errors.' % (load_errs)) - if len(viol_dict) > 0: - rep_str = 'Validation report (sha256 - violations or error):\n' - for v in viol_dict: - rep_str = rep_str + '%s - %s\n' % (v, viol_dict[v]) - L.info(rep_str) - else: - L.info('All checks passed.') + violation_report(viol_dict) # close the opersist instance op.close() diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 323c764f..077c56bd 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -97,11 +97,15 @@ SHACL_ERRORS = { 'essential': { - 'MalformedJSON': 'Metadata files must be properly formatted json-ld', + # load errors + 'ShapeLoadError': 'Shape graph must load correctly', + 'JSONDecodeError': 'Metadata files must be properly formatted json-ld', + # science-on-schema.org violations 'soso:DatasetNS1Shape': 'Expecting SO namespace of not ', 'soso:DatasetNS2Shape': 'Expecting SO namespace of not ', 'soso:DatasetNS3Shape': 'Expecting SO namespace of not ', 'soso:IDShape': 'Dataset must have an ID', + # schema.org violations 'SO:Dataset-description': 'Dataset must have a description', 'SO:Dataset-identifier': 'Dataset identifiers must be a URL, Text or PropertyValue', 'SO:Dataset-keywords': 'A Dataset should include descriptive keywords as literals or DefinedTerm', @@ -110,9 +114,17 @@ 'SO:Dataset-version': 'Dataset must have a version as Literal or Number', }, 'optional': { + # schema.org violations 'SO:Dataset-isAccessibleForFree': 'It is recommended that a Dataset indicates accessibility for free or otherwise', 'SO:Dataset-sameAs': 'It is recommended that a Dataset includes a sameAs URL', + # SO coordinates 'schema:GeoCoordinates-longitude': 'It is recommended that a Dataset has a longitude coordinate in WGS-84 format', 'schema:GeoCoordinates-latitude': 'It is recommended that a Dataset has a latitude coordinate in WGS-84 format', + }, + 'internal': { + # errors we at NCEAS had testing data + 'ConstraintLoadError': 'Constraints must load correctly', + 'ReportableRuntimeError': 'No errors can occur at runtime', + 'FileNotFoundError': 'Files must exist in the location specified', } } From 44610ad8bb8b452f55b307fdc833ffd459c2c409 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 17 Jan 2023 11:25:34 -0800 Subject: [PATCH 127/301] adding to violation extractor --- mnonboard/data_chx.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 2d9b5cc1..27405ecd 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -15,7 +15,10 @@ def violation_extract(viol): """ A function that extracts the name of the violation from a dictionary entry. """ - pass + lines = ['Validation Result in', 'Constraint Violation in'] + # + viol_text = viol + return viol_text def violation_cat(viol): """ From d504146ee07b7bf1ba0e2fde99907ff9697e6644 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 08:09:33 -0800 Subject: [PATCH 128/301] filling out violation extractor --- mnonboard/data_chx.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 27405ecd..cddf74f3 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -15,10 +15,20 @@ def violation_extract(viol): """ A function that extracts the name of the violation from a dictionary entry. """ - lines = ['Validation Result in', 'Constraint Violation in'] - # - viol_text = viol - return viol_text + L = logging.getLogger('violation_extract') + L.addHandler(F) + lines = ['Validation Result in ', 'Constraint Violation in '] + end = ' (http://' + vx = None + for line in lines: + if line in viol: + vx = viol.split(line)[1].split(end)[0] + if vx: + L.info('Found violation name: %s' % (vx)) + return vx + else: + L.warning('Violation name was not extracted. Text block follows:\n%s' % (viol)) + return vx def violation_cat(viol): """ From 806452914c15afcdb39f8e94fba7d79909811985 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 15:09:25 -0800 Subject: [PATCH 129/301] adding to metadata testing/reporting ops --- mnonboard/__init__.py | 1 + mnonboard/data_chx.py | 44 +++++++++++++++++++++++++------------------ mnonboard/utils.py | 14 +++++++++++++- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 56be8704..9ac3b0a9 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -10,6 +10,7 @@ __version__ = 'v0.0.1' FN_DATE = datetime.now().strftime('%Y-%m-%d') +HM_DATE = datetime.now().strftime('%Y-%m-%d-%H%M') YM_DATE = datetime.now().strftime('%Y-%m') LOG_DIR = '/var/log/mnlite/' LOG_NAME = 'mnonboard-%s.log' % (FN_DATE) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index cddf74f3..e9beeb06 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -6,7 +6,7 @@ from mnonboard import F from mnonboard.defs import SHACL_URL, SHACL_ERRORS -from mnonboard.utils import limit_tests +from mnonboard.utils import limit_tests, save_report from opersist.cli import getOpersistInstance from opersist.models.thing import Thing from json.decoder import JSONDecodeError @@ -30,43 +30,51 @@ def violation_extract(viol): L.warning('Violation name was not extracted. Text block follows:\n%s' % (viol)) return vx -def violation_cat(viol): +def violation_cat(hash, viol): """ - A function that determines the severity of a passed shacl violation. + A function that returns a string that contains the severity of a passed shacl violation and a comment. """ L = logging.getLogger('violation_cat') L.addHandler(F) - cat = '%s - %s: %s' + csvl = '%s,%s,%s,%s\n' + cat, comment = '', '' if viol in SHACL_ERRORS['essential']: - cat = cat % ('ESSENTIAL', viol, SHACL_ERRORS['essential'][viol]) + cat = 'ESSENTIAL' + comment = SHACL_ERRORS['essential'][viol] elif viol in SHACL_ERRORS['optional']: - cat = cat % ('Optional', viol, SHACL_ERRORS['essential'][viol]) + cat = 'Optional' + comment = SHACL_ERRORS['optional'][viol] elif viol in SHACL_ERRORS['internal']: - cat = cat % ('Internal', viol, SHACL_ERRORS['essential'][viol]) + cat = 'Internal' + comment = SHACL_ERRORS['internal'][viol] else: - cat = cat % ('Not found', viol, 'Not found in SHACL_ERRORS dictionary! Consult NCEAS node manager for information.') + cat = 'Not found' + comment = 'Violation name %s not found in SHACL_ERRORS dictionary! Consult NCEAS node manager for information.' % viol + L.warning(comment) + csvl = csvl % (hash, cat, viol, comment) L.info('Violation categorization for %s: %s' % (viol, cat)) - return cat + return csvl -def violation_report(viol_dict): +def violation_report(viol_dict, loc): """ A function that outputs a report containing information on the violations found while shacl testing. """ L = logging.getLogger('violation_report') L.addHandler(F) L.info('Creating report.') + rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: - rep_str = 'Validation report (sha256 - violations or error):\n' - for v in viol_dict: + for hash in viol_dict: i = 0 - while i > len(v): - viol = violation_extract(v[i]) - rep_str = rep_str + violation_cat(viol) + while i > len(viol_dict[hash]): + viol = violation_extract(viol_dict[hash][i][2]) + rep_str = rep_str + violation_cat(hash, viol) i += 1 L.info(rep_str) else: - L.info('All checks passed.') - + rep_str = rep_str + ',,,No violations found.\n' + L.info('No violations.') + save_report(rep_str=rep_str, loc=loc) def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=True): """ @@ -186,6 +194,6 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr i += 1 L.info('Found %s valid records out of %s checked.' % (valid_files, i)) L.info('%s failures due to load and/or decode errors.' % (load_errs)) - violation_report(viol_dict) + violation_report(viol_dict, loc) # close the opersist instance op.close() diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 8fed9077..cc968eba 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -4,7 +4,7 @@ import logging from defs import SCHEDULES -from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, F +from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, F, HM_DATE from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name def load_json(loc): @@ -45,6 +45,18 @@ def save_json(loc, jf): L.error('Error: %s' % e) exit(1) +def save_report(rep_str, loc, format='.csv'): + """ + Output a validation report for a set of metadata. + """ + L = logging.getLogger('save_report') + L.addHandler(F) + fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) + L.info('Writing report to %s' % (fn)) + with open(fn, 'w') as f: + f.write(rep_str) + L.info('Done.') + def dumps_json(js): """ Quick and dirty way to output formatted json. From 1c7bec48ab70ec0f4f514cbc2efc106918d085a3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 15:55:21 -0800 Subject: [PATCH 130/301] adding debug verbosity level for file contents & violations --- mnonboard/__init__.py | 2 +- mnonboard/cli.py | 4 +++- mnonboard/data_chx.py | 9 +++++---- mnonboard/defs.py | 1 + 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 9ac3b0a9..5392cff9 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -28,7 +28,7 @@ def start_logging(): formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) # this initializes logging to file f = logging.FileHandler(LOG_LOC) - f.setLevel('INFO') + f.setLevel('DEBUG') f.setFormatter(formatter) # warnings also go to file # initialize logging diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 2f0bdb48..147299e7 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -47,7 +47,7 @@ def run(cfg): # run scrapy to harvest metadata (step 10) utils.harvest_data(loc, end_node_subj) # now run tests - data_chx.test_mdata(loc, num_tests=cfg['check_files']) + data_chx.test_mdata(loc, num_tests=cfg['check_files'], debug=cfg['verbosity']) def main(): @@ -94,6 +94,8 @@ def main(): L.error('Option -c (--check) requires an integer number of files to check.') print(HELP_TEXT) exit(1) + if o in ('-v', '--verbose'): + CFG['verbosity'] = 'debug' L.info('running mnonboard in %s mode.\n\ data gathering from: %s\n\ cn_url: %s\n\ diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index e9beeb06..4ccce9f5 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -76,7 +76,7 @@ def violation_report(viol_dict, loc): L.info('No violations.') save_report(rep_str=rep_str, loc=loc) -def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=True): +def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=False): """ Use pyshacl to test harvested metadata. @@ -86,6 +86,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr num_tests: Number of metadata files to test (randomly selected; default=3) debug: If True, will print a lot of debug information including metadata file contents """ + debug = True if (debug == 'debug') or (debug == True) else False L = logging.getLogger('test_mdata') L.addHandler(F) L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) @@ -121,7 +122,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr record = f.read().decode('utf-8') L.info('Success.') if debug: - L.info('Record follows:\n%s' % (record)) + L.debug('Record follows:\n%s' % (record)) conforms, res_graph, res_text = validate(data_graph=record, data_graph_format=format, shacl_graph=shp_graph, @@ -132,7 +133,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr constraint_viol = ' including Constraint Violations' if 'Constraint Violation' in res_text else '' L.error('pyshacl found %s violations.' % (violati1)) if debug: - L.info('Details:\n%s' % (res_text)) + L.debug('Details:\n%s' % (res_text)) if (violati1 == 1) and (' not ' in res_text): # under this condition there is one constraint violation where the record uses https constraint_viol = ' including https vs http namespace violation' @@ -148,7 +149,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Tr violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) L.error('pyshacl found %s additional violations.' % (violati2)) if debug: - L.info('Details:\n%s' % (res_text2)) + L.debug('Details:\n%s' % (res_text2)) else: L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 077c56bd..32387d12 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -10,6 +10,7 @@ 'cn_url': 'https://cn-stage.test.dataone.org/cn', 'mode': 'staging', 'check_files': 5, + 'verbosity': 'info', } HELP_TEXT = """DataONE member node onboard script From d31f731d572683c5247e70fbe3eed23bdb13008b Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:00:56 -0800 Subject: [PATCH 131/301] adding local (no-scrape) mode --- mnonboard/cli.py | 7 ++++++- mnonboard/defs.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 147299e7..782dcdce 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -45,7 +45,8 @@ def run(cfg): # restart the mnlite process to pick up the new node.json (step 9) utils.restart_mnlite() # run scrapy to harvest metadata (step 10) - utils.harvest_data(loc, end_node_subj) + if not cfg['local']: + utils.harvest_data(loc, end_node_subj) # now run tests data_chx.test_mdata(loc, num_tests=cfg['check_files'], debug=cfg['verbosity']) @@ -96,6 +97,10 @@ def main(): exit(1) if o in ('-v', '--verbose'): CFG['verbosity'] = 'debug' + L.info('Running in debug/verbose mode.') + if o in ('-L', '--local'): + CFG['local'] = True + L.info('Local mode (-L) will not scrape the remote site and will only test local files.') L.info('running mnonboard in %s mode.\n\ data gathering from: %s\n\ cn_url: %s\n\ diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 32387d12..9ff77360 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -11,6 +11,7 @@ 'mode': 'staging', 'check_files': 5, 'verbosity': 'info', + 'local': False, } HELP_TEXT = """DataONE member node onboard script From 37e222170fb3ceeb816fdb14fac2bad8414b2bfb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:04:34 -0800 Subject: [PATCH 132/301] adding local and verbose modes to help text --- mnonboard/defs.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 9ff77360..32ebb24a 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -31,6 +31,10 @@ initialize a new member node from a json file -P | --production run this script in production mode (uses the D1 cn API in searches) + -v | --verbose + output some extra text describing violations and metadata file contents + -L | --local + run this script in local mode (will not scrape the remote site for new metadata) } """ % __version__ From 9292733ef6f5975b6eb34b70e2fefa19b27a9432 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:06:24 -0800 Subject: [PATCH 133/301] adding modes to getopt arguments --- mnonboard/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 782dcdce..e44e6860 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -59,8 +59,8 @@ def main(): L.addHandler(F) # get arguments try: - opts = getopt.getopt(sys.argv[1:], 'hiPd:l:c:', - ['help', 'init', 'production', 'dump=', 'load=', 'check='] + opts = getopt.getopt(sys.argv[1:], 'hiPvLd:l:c:', + ['help', 'init', 'production', 'verbose', 'local' 'dump=', 'load=', 'check='] )[0] except Exception as e: L.error('Error: %s' % e) From f826760c73b22a6af12c04f031f78533b7056eeb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:11:01 -0800 Subject: [PATCH 134/301] debugging --- mnonboard/data_chx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 4ccce9f5..4fa48ced 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -67,6 +67,7 @@ def violation_report(viol_dict, loc): for hash in viol_dict: i = 0 while i > len(viol_dict[hash]): + print('%s - %s' % (hash,viol_dict[hash])) viol = violation_extract(viol_dict[hash][i][2]) rep_str = rep_str + violation_cat(hash, viol) i += 1 From 2020290affb874792d953a863a425fd52bb5e11a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:12:26 -0800 Subject: [PATCH 135/301] debugging --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 4fa48ced..e2c94bb5 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -65,9 +65,9 @@ def violation_report(viol_dict, loc): rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: for hash in viol_dict: + print('%s - %s' % (hash,viol_dict[hash])) i = 0 while i > len(viol_dict[hash]): - print('%s - %s' % (hash,viol_dict[hash])) viol = violation_extract(viol_dict[hash][i][2]) rep_str = rep_str + violation_cat(hash, viol) i += 1 From baaf135927d7d1619de2de4ed3323e8b506e1127 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:16:36 -0800 Subject: [PATCH 136/301] debugging --- mnonboard/data_chx.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index e2c94bb5..a858acc7 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -155,7 +155,6 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Fa L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 L.info('Total shacl violations in file: %s' % (tot_violations)) - viol_dict[t.content] = {0: [False, None, 'shacl violations%s (%s total)' % (constraint_viol, tot_violations)]} else: L.info('No violations found in %s' % (pth)) viol_dict[t.content] = {0: [True, None, 'No violations.']} From cf2f7256399b57bfa6e1f07ea43ee62b920fb136 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:27:15 -0800 Subject: [PATCH 137/301] reworking extractor to handle multiple-violation string --- mnonboard/data_chx.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index a858acc7..c9015d7c 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -19,12 +19,15 @@ def violation_extract(viol): L.addHandler(F) lines = ['Validation Result in ', 'Constraint Violation in '] end = ' (http://' - vx = None + vx = [] for line in lines: if line in viol: - vx = viol.split(line)[1].split(end)[0] - if vx: - L.info('Found violation name: %s' % (vx)) + for seg in viol.split(line)[1:]: + s = seg.split(end)[0] + L.info('Found violation name: %s' % (s)) + vx.append(s) + if len(vx) > 0: + L.info('Found violations: %s' % (vx)) return vx else: L.warning('Violation name was not extracted. Text block follows:\n%s' % (viol)) @@ -65,11 +68,11 @@ def violation_report(viol_dict, loc): rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: for hash in viol_dict: - print('%s - %s' % (hash,viol_dict[hash])) i = 0 while i > len(viol_dict[hash]): viol = violation_extract(viol_dict[hash][i][2]) - rep_str = rep_str + violation_cat(hash, viol) + for v in viol: + rep_str = rep_str + violation_cat(hash, viol) i += 1 L.info(rep_str) else: From d7c1a0ff423045a7f625ed31e96ba531082cc312 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:30:36 -0800 Subject: [PATCH 138/301] debugging --- mnonboard/data_chx.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index c9015d7c..afb0f0ce 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -17,7 +17,7 @@ def violation_extract(viol): """ L = logging.getLogger('violation_extract') L.addHandler(F) - lines = ['Validation Result in ', 'Constraint Violation in '] + lines = ['Constraint Violation in ', 'Validation Result in '] end = ' (http://' vx = [] for line in lines: @@ -65,6 +65,7 @@ def violation_report(viol_dict, loc): L = logging.getLogger('violation_report') L.addHandler(F) L.info('Creating report.') + L.debug(viol_dict) rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: for hash in viol_dict: @@ -74,7 +75,7 @@ def violation_report(viol_dict, loc): for v in viol: rep_str = rep_str + violation_cat(hash, viol) i += 1 - L.info(rep_str) + L.info('Report:\n%s' % (rep_str)) else: rep_str = rep_str + ',,,No violations found.\n' L.info('No violations.') From 898ae8acfc1c540e98fd7ef2e5eaa6e08c80e698 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:33:50 -0800 Subject: [PATCH 139/301] debugging --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index afb0f0ce..b994339e 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -65,7 +65,7 @@ def violation_report(viol_dict, loc): L = logging.getLogger('violation_report') L.addHandler(F) L.info('Creating report.') - L.debug(viol_dict) + L.info(viol_dict) rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: for hash in viol_dict: From 55c10164537207365446337227fd7b5237c12482 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:37:12 -0800 Subject: [PATCH 140/301] removing verbose mode (debug goes to log file anyway) --- mnonboard/cli.py | 5 +---- mnonboard/data_chx.py | 12 ++++-------- mnonboard/defs.py | 3 --- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index e44e6860..e2bebc8d 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -48,7 +48,7 @@ def run(cfg): if not cfg['local']: utils.harvest_data(loc, end_node_subj) # now run tests - data_chx.test_mdata(loc, num_tests=cfg['check_files'], debug=cfg['verbosity']) + data_chx.test_mdata(loc, num_tests=cfg['check_files']) def main(): @@ -95,9 +95,6 @@ def main(): L.error('Option -c (--check) requires an integer number of files to check.') print(HELP_TEXT) exit(1) - if o in ('-v', '--verbose'): - CFG['verbosity'] = 'debug' - L.info('Running in debug/verbose mode.') if o in ('-L', '--local'): CFG['local'] = True L.info('Local mode (-L) will not scrape the remote site and will only test local files.') diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index b994339e..7d0dad1e 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -81,7 +81,7 @@ def violation_report(viol_dict, loc): L.info('No violations.') save_report(rep_str=rep_str, loc=loc) -def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=False): +def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): """ Use pyshacl to test harvested metadata. @@ -91,7 +91,6 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Fa num_tests: Number of metadata files to test (randomly selected; default=3) debug: If True, will print a lot of debug information including metadata file contents """ - debug = True if (debug == 'debug') or (debug == True) else False L = logging.getLogger('test_mdata') L.addHandler(F) L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) @@ -126,8 +125,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Fa with open(pth, 'rb') as f: record = f.read().decode('utf-8') L.info('Success.') - if debug: - L.debug('Record follows:\n%s' % (record)) + L.debug('Record follows:\n%s' % (record)) conforms, res_graph, res_text = validate(data_graph=record, data_graph_format=format, shacl_graph=shp_graph, @@ -137,8 +135,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Fa violati1 = int(res_text.split('\n')[2].split('(')[1].split(')')[0]) constraint_viol = ' including Constraint Violations' if 'Constraint Violation' in res_text else '' L.error('pyshacl found %s violations.' % (violati1)) - if debug: - L.debug('Details:\n%s' % (res_text)) + L.debug('Details:\n%s' % (res_text)) if (violati1 == 1) and (' not ' in res_text): # under this condition there is one constraint violation where the record uses https constraint_viol = ' including https vs http namespace violation' @@ -153,8 +150,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3, debug=Fa if not conforms2: violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) L.error('pyshacl found %s additional violations.' % (violati2)) - if debug: - L.debug('Details:\n%s' % (res_text2)) + L.debug('Details:\n%s' % (res_text2)) else: L.info('Namespace https/http constraint violation is the only error found') tot_violations = violati1 + violati2 diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 32ebb24a..64ca29be 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -10,7 +10,6 @@ 'cn_url': 'https://cn-stage.test.dataone.org/cn', 'mode': 'staging', 'check_files': 5, - 'verbosity': 'info', 'local': False, } @@ -31,8 +30,6 @@ initialize a new member node from a json file -P | --production run this script in production mode (uses the D1 cn API in searches) - -v | --verbose - output some extra text describing violations and metadata file contents -L | --local run this script in local mode (will not scrape the remote site for new metadata) } From 8a0bf41faef18e95e88d4b1c6816f47084b83896 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:47:34 -0800 Subject: [PATCH 141/301] debugging --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 7d0dad1e..a39e73b8 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -73,7 +73,7 @@ def violation_report(viol_dict, loc): while i > len(viol_dict[hash]): viol = violation_extract(viol_dict[hash][i][2]) for v in viol: - rep_str = rep_str + violation_cat(hash, viol) + rep_str = rep_str + violation_cat(hash, v) i += 1 L.info('Report:\n%s' % (rep_str)) else: From 9f56d80dd993f454dd00645964e53cde6db99dde Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 16:50:56 -0800 Subject: [PATCH 142/301] debugging --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index a39e73b8..306161c5 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -65,7 +65,7 @@ def violation_report(viol_dict, loc): L = logging.getLogger('violation_report') L.addHandler(F) L.info('Creating report.') - L.info(viol_dict) + L.debug(viol_dict) rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: for hash in viol_dict: From a3beba0c6a321f9b9c8b440fa734231ca4bf0ce0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 17:22:41 -0800 Subject: [PATCH 143/301] debugging --- mnonboard/data_chx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 306161c5..b9bc8fb6 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -21,6 +21,7 @@ def violation_extract(viol): end = ' (http://' vx = [] for line in lines: + L.info('Checking %ss' % line.split(' in ')[0]) if line in viol: for seg in viol.split(line)[1:]: s = seg.split(end)[0] From 3bcb1ed97f161195db2466cea50a0f7d9b27c558 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 17:24:24 -0800 Subject: [PATCH 144/301] debugging --- mnonboard/data_chx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index b9bc8fb6..8a215589 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -67,6 +67,7 @@ def violation_report(viol_dict, loc): L.addHandler(F) L.info('Creating report.') L.debug(viol_dict) + L.info('Violation dictionary length: %s' % (len(viol_dict))) rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: for hash in viol_dict: From 02d4fe10c2b13b303b2c1116698a4423908dc40e Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 17:27:17 -0800 Subject: [PATCH 145/301] debugging --- mnonboard/data_chx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 8a215589..77fb0fa0 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -71,6 +71,7 @@ def violation_report(viol_dict, loc): rep_str = 'Hash,Violation level,Violation name,Comment\n' if len(viol_dict) > 0: for hash in viol_dict: + L.info('Working on hash %s' % (hash.split('/')[-1].split('.bin')[0])) i = 0 while i > len(viol_dict[hash]): viol = violation_extract(viol_dict[hash][i][2]) From 02a57ee9b57fba631fd63c9d30fa04e0f46acf80 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 17:29:39 -0800 Subject: [PATCH 146/301] debugging --- mnonboard/data_chx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 77fb0fa0..c64b3721 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -17,6 +17,7 @@ def violation_extract(viol): """ L = logging.getLogger('violation_extract') L.addHandler(F) + L.info('Extracting...') lines = ['Constraint Violation in ', 'Validation Result in '] end = ' (http://' vx = [] From 252b7a8dd493c6097337948e5b45b2b8abeaad48 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 17:30:18 -0800 Subject: [PATCH 147/301] bug fix --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index c64b3721..b9b62cdb 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -74,7 +74,7 @@ def violation_report(viol_dict, loc): for hash in viol_dict: L.info('Working on hash %s' % (hash.split('/')[-1].split('.bin')[0])) i = 0 - while i > len(viol_dict[hash]): + while i < len(viol_dict[hash]): viol = violation_extract(viol_dict[hash][i][2]) for v in viol: rep_str = rep_str + violation_cat(hash, v) From c1b67019ef0c01ceb8dda91f2119d64587c12414 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 18 Jan 2023 17:34:07 -0800 Subject: [PATCH 148/301] bug fix --- mnonboard/data_chx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index b9b62cdb..97afe2b7 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -18,8 +18,8 @@ def violation_extract(viol): L = logging.getLogger('violation_extract') L.addHandler(F) L.info('Extracting...') - lines = ['Constraint Violation in ', 'Validation Result in '] - end = ' (http://' + lines = ['Source Shape: '] + end = '\n' vx = [] for line in lines: L.info('Checking %ss' % line.split(' in ')[0]) From 198184b93952148b001f3b6db4f8cbf86f70cc07 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 06:05:24 -0800 Subject: [PATCH 149/301] simplifying hash --- mnonboard/data_chx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 97afe2b7..2724d473 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -56,6 +56,7 @@ def violation_cat(hash, viol): cat = 'Not found' comment = 'Violation name %s not found in SHACL_ERRORS dictionary! Consult NCEAS node manager for information.' % viol L.warning(comment) + hash = hash.split('/')[-1].split('.bin')[0] # split path and file extension from string csvl = csvl % (hash, cat, viol, comment) L.info('Violation categorization for %s: %s' % (viol, cat)) return csvl From 1e61d45cd8ae5ab8b63f2442c8d51635759bc546 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 06:25:00 -0800 Subject: [PATCH 150/301] lowering some messages to debug --- mnonboard/data_chx.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 2724d473..6bb153e3 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -17,16 +17,15 @@ def violation_extract(viol): """ L = logging.getLogger('violation_extract') L.addHandler(F) - L.info('Extracting...') lines = ['Source Shape: '] end = '\n' vx = [] for line in lines: - L.info('Checking %ss' % line.split(' in ')[0]) + L.info('Checking %ss' % line.split(':')[0]) if line in viol: for seg in viol.split(line)[1:]: s = seg.split(end)[0] - L.info('Found violation name: %s' % (s)) + L.debug('Found violation name: %s' % (s)) vx.append(s) if len(vx) > 0: L.info('Found violations: %s' % (vx)) @@ -58,7 +57,7 @@ def violation_cat(hash, viol): L.warning(comment) hash = hash.split('/')[-1].split('.bin')[0] # split path and file extension from string csvl = csvl % (hash, cat, viol, comment) - L.info('Violation categorization for %s: %s' % (viol, cat)) + L.debug('Violation categorization for %s: %s' % (viol, cat)) return csvl def violation_report(viol_dict, loc): @@ -139,13 +138,13 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): if not conforms: violati1 = int(res_text.split('\n')[2].split('(')[1].split(')')[0]) constraint_viol = ' including Constraint Violations' if 'Constraint Violation' in res_text else '' - L.error('pyshacl found %s violations.' % (violati1)) + L.warning('pyshacl found %s violations.' % (violati1)) L.debug('Details:\n%s' % (res_text)) if (violati1 == 1) and (' not ' in res_text): # under this condition there is one constraint violation where the record uses https constraint_viol = ' including https vs http namespace violation' # do a quick replace and test again for lower level violations - L.info('Found https vs http namespace violation...replacing and testing again...') + L.debug('Found https vs http namespace violation...replacing and testing again...') record = record.replace('https://schema.org/', 'http://schema.org/') conforms2, res_graph2, res_text2 = validate(data_graph=record, data_graph_format=format, @@ -154,7 +153,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): viol_dict[t.content][1] = [conforms2, res_graph2, res_text2] if not conforms2: violati2 = int(res_text2.split('\n')[2].split('(')[1].split(')')[0]) - L.error('pyshacl found %s additional violations.' % (violati2)) + L.warning('pyshacl found %s additional violations after correcting for https/http violation.' % (violati2)) L.debug('Details:\n%s' % (res_text2)) else: L.info('Namespace https/http constraint violation is the only error found') From 9c4038e522c76eb9cb2f97d38735385a1585f015 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 06:35:19 -0800 Subject: [PATCH 151/301] fixing logging levels --- mnonboard/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 5392cff9..2f2e908e 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -20,11 +20,12 @@ def start_logging(): logging.basicConfig( - level=LOG_LEVELS.get("INFO", logging.INFO), + level=LOG_LEVELS.get("DEBUG", logging.DEBUG), format=LOG_FORMAT, datefmt=LOG_DATE_FORMAT, ) l = logging.getLogger("init") + l.setLevel('INFO') formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) # this initializes logging to file f = logging.FileHandler(LOG_LOC) From 0870b32af1cbad886f0b20e077a80d411d79b4d3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 06:38:43 -0800 Subject: [PATCH 152/301] logging levels --- mnonboard/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 2f2e908e..bc9298e0 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -25,11 +25,11 @@ def start_logging(): datefmt=LOG_DATE_FORMAT, ) l = logging.getLogger("init") - l.setLevel('INFO') + l.setLevel(logging.INFO) formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) # this initializes logging to file f = logging.FileHandler(LOG_LOC) - f.setLevel('DEBUG') + f.setLevel(logging.DEBUG) f.setFormatter(formatter) # warnings also go to file # initialize logging From e18f7975a97c536487a5ef9a5583566af831de38 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:04:47 -0800 Subject: [PATCH 153/301] changing logging structure --- mnonboard/__init__.py | 26 ++++++++++++---------- mnonboard/cli.py | 5 ++--- mnonboard/data_chx.py | 15 +++++-------- mnonboard/info_chx.py | 50 +++++++++++++++---------------------------- mnonboard/utils.py | 29 +++++++++---------------- 5 files changed, 49 insertions(+), 76 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index bc9298e0..c3fb9032 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -18,25 +18,29 @@ HARVEST_LOG_NAME = '-crawl-%s.log' % YM_DATE -def start_logging(): - logging.basicConfig( - level=LOG_LEVELS.get("DEBUG", logging.DEBUG), - format=LOG_FORMAT, - datefmt=LOG_DATE_FORMAT, - ) - l = logging.getLogger("init") - l.setLevel(logging.INFO) +def start_logging(name='init'): + # logging.basicConfig( + # level=LOG_LEVELS.get("DEBUG", logging.DEBUG), + # format=LOG_FORMAT, + # datefmt=LOG_DATE_FORMAT, + # ) + logger = logging.getLogger(name) + logger.setLevel(logging.DEBUG) formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) + s = logging.StreamHandler() + s.setLevel(logging.INFO) + s.setFormatter(formatter) # this initializes logging to file f = logging.FileHandler(LOG_LOC) f.setLevel(logging.DEBUG) f.setFormatter(formatter) # warnings also go to file # initialize logging - l.addHandler(f) - return l, f + logger.addHandler(s) # stream + logger.addHandler(f) # file + return logger -L, F = start_logging() +L = start_logging() L.info('----- mnonboard %s start -----' % __version__) # absolute path of current file diff --git a/mnonboard/cli.py b/mnonboard/cli.py index e2bebc8d..01155f3f 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -6,7 +6,7 @@ import info_chx import data_chx from defs import CFG, HELP_TEXT -from mnonboard import default_json, F +from mnonboard import default_json, start_logging def run(cfg): """ @@ -55,8 +55,7 @@ def main(): """ Uses getopt to set config values in order to call run(). """ - L = logging.getLogger('main') - L.addHandler(F) + L = start_logging('main') # get arguments try: opts = getopt.getopt(sys.argv[1:], 'hiPvLd:l:c:', diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 6bb153e3..81ed06dd 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -2,9 +2,8 @@ from pyshacl import validate from pyshacl.errors import ShapeLoadError, ConstraintLoadError, \ ReportableRuntimeError -import logging -from mnonboard import F +from mnonboard import start_logging from mnonboard.defs import SHACL_URL, SHACL_ERRORS from mnonboard.utils import limit_tests, save_report from opersist.cli import getOpersistInstance @@ -15,8 +14,7 @@ def violation_extract(viol): """ A function that extracts the name of the violation from a dictionary entry. """ - L = logging.getLogger('violation_extract') - L.addHandler(F) + L = start_logging('violation_extract') lines = ['Source Shape: '] end = '\n' vx = [] @@ -38,8 +36,7 @@ def violation_cat(hash, viol): """ A function that returns a string that contains the severity of a passed shacl violation and a comment. """ - L = logging.getLogger('violation_cat') - L.addHandler(F) + L = start_logging('violation_cat') csvl = '%s,%s,%s,%s\n' cat, comment = '', '' if viol in SHACL_ERRORS['essential']: @@ -64,8 +61,7 @@ def violation_report(viol_dict, loc): """ A function that outputs a report containing information on the violations found while shacl testing. """ - L = logging.getLogger('violation_report') - L.addHandler(F) + L = start_logging('violation_report') L.info('Creating report.') L.debug(viol_dict) L.info('Violation dictionary length: %s' % (len(viol_dict))) @@ -95,8 +91,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): num_tests: Number of metadata files to test (randomly selected; default=3) debug: If True, will print a lot of debug information including metadata file contents """ - L = logging.getLogger('test_mdata') - L.addHandler(F) + L = start_logging('test_mdata') L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) op = getOpersistInstance(loc) num_things = op.countThings() diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 575623b6..063f4508 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -4,7 +4,7 @@ import logging from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX -from mnonboard import default_json, F +from mnonboard import default_json, start_logging from opersist.utils import JSON_TIME_FORMAT, dtnow from opersist.cli import getOpersistInstance @@ -18,8 +18,7 @@ def not_empty(f): return f != '' def req_input(desc): - L = logging.getLogger('req_input') - L.addHandler(F) + L = start_logging('req_input') while True: i = input(desc) L.info('User entry for %s"%s"' % (desc, i)) @@ -41,8 +40,7 @@ def valid_orcid(orcid): This seems like overkill but is probably good to have since it will be used to store contacts for database upkeep/maintenance. """ - L = logging.getLogger('valid_orcid') - L.addHandler(F) + L = start_logging('valid_orcid') if (len(orcid) == 19): # it's 19 characters long. start test loop for i in range(0,19): @@ -77,8 +75,7 @@ def base_url(descrip): """ Validate the base URL of the member node. Should include trailing slash. """ - L = logging.getLogger('base_url') - L.addHandler(F) + L = start_logging('base_url') while True: url = req_input(descrip) if url[-1] in '/': @@ -91,8 +88,7 @@ def valid_url_prefix(url, prefix, f): """ Validate a URL prefix (such as for an ORCiD number). """ - L = logging.getLogger('valid_url_prefix') - L.addHandler(F) + L = start_logging('valid_url_prefix') # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) @@ -109,8 +105,7 @@ def sitemap_urls(num_urls): Collect the sitemap URLs. Usually there will be just one of these but we will prepare for more. """ - L = logging.getLogger('sitemap_urls') - L.addHandler(F) + L = start_logging('sitemap_urls') i = 0 while i < num_urls: # add URLs one at a time (should only be a few at most) @@ -124,8 +119,7 @@ def enter_schedule(): """ Give the user a choice between three basic scheduling options. """ - L = logging.getLogger('enter_schedule') - L.addHandler(F) + L = start_logging('enter_schedule') p = 'Select a starting frequency with which to scrape data from this member node.\n' \ '1: Monthly\n' \ '2: Daily\n' \ @@ -149,8 +143,7 @@ def enter_int(prompt): """ Make sure the user enters an integer value of 1 or greater. """ - L = logging.getLogger('enter_int') - L.addHandler(F) + L = start_logging('enter_int') i = None while True: # make sure user enters an int @@ -174,8 +167,7 @@ def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ - L = logging.getLogger('cn_subj_lookup') - L.addHandler(F) + L = start_logging('cn_subj_lookup') # this authentication method was adapted from: # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} @@ -206,8 +198,7 @@ def local_subj_lookup(subj, loc): """ Use the local opersist instance to look up a subject. """ - L = logging.getLogger('local_subj_lookup') - L.addHandler(F) + L = start_logging('local_subj_lookup') L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) rec = op.getSubject(subj=subj) @@ -224,8 +215,7 @@ def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. """ - L = logging.getLogger('orcid_name') - L.addHandler(F) + L = start_logging('orcid_name') L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) L.info('User has entered "%s"' % name) @@ -235,8 +225,7 @@ def enter_orcid(prompt): """ Make sure the user enters an integer value of 1 or greater. """ - L = logging.getLogger('enter_orcid') - L.addHandler(F) + L = start_logging('enter_orcid') while True: # ask the user for an ORCiD number o = req_input(prompt) @@ -252,8 +241,7 @@ def valid_nodeid(node_id): """ Make sure the node_id contains the correct prefix. """ - L = logging.getLogger('valid_nodeid') - L.addHandler(F) + L = start_logging('valid_nodeid') if NODE_ID_PREFIX in node_id: # if valid, return return node_id @@ -280,8 +268,7 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): """ Have the user enter a node_id and make sure it contains the correct id prefix. """ - L = logging.getLogger('enter_nodeid') - L.addHandler(F) + L = start_logging('enter_nodeid') while True: L.info('In loop, vars are prompt="%s", id="%s"' % (prompt, id)) # ask the user for a node id @@ -298,8 +285,7 @@ def user_input(): """ We need a few pieces of information to fill the json fields. """ - L = logging.getLogger('user_input') - L.addHandler(F) + L = start_logging('user_input') names = {} baseurl = '' L.info('Collecting user input.') @@ -349,8 +335,7 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. """ - L = logging.getLogger('transfer_info') - L.addHandler(F) + L = start_logging('transfer_info') fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') for f in ufields: @@ -369,8 +354,7 @@ def input_test(fields): """ Testing the manually filled json file. """ - L = logging.getLogger('input_test') - L.addHandler(F) + L = start_logging('input_test') L.info('Running tests on imported json.') # first, test that there are the fields we need test_fields = default_json(fx='mnonboard.info_chx.input_test()') diff --git a/mnonboard/utils.py b/mnonboard/utils.py index cc968eba..e3f4e562 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -1,18 +1,16 @@ import os import json import subprocess -import logging from defs import SCHEDULES -from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, F, HM_DATE +from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, start_logging from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name def load_json(loc): """ Load json from file. """ - L = logging.getLogger('load_json') - L.addHandler(F) + L = start_logging('load_json') L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: @@ -30,8 +28,7 @@ def save_json(loc, jf): """ Output json to file. """ - L = logging.getLogger('save_json') - L.addHandler(F) + L = start_logging('save_json') L.info('Writing member node json to %s' % loc) try: with open(loc, 'w') as f: @@ -49,8 +46,7 @@ def save_report(rep_str, loc, format='.csv'): """ Output a validation report for a set of metadata. """ - L = logging.getLogger('save_report') - L.addHandler(F) + L = start_logging('save_report') fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) L.info('Writing report to %s' % (fn)) with open(fn, 'w') as f: @@ -75,8 +71,7 @@ def init_repo(loc): ''' Initialize a new instance using opersist. ''' - L = logging.getLogger('init_repo') - L.addHandler(F) + L = start_logging('init_repo') try: L.info('Using opersist to init new member node folder: %s' % loc) subprocess.run(['opersist', @@ -90,8 +85,7 @@ def new_subj(loc, name, value): """ Create new subject in the database using opersist. """ - L = logging.getLogger('new_subj') - L.addHandler(F) + L = start_logging('new_subj') try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) subprocess.run(['opersist', @@ -110,8 +104,7 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal This one I will definitely have to explain in the docstring. """ - L = logging.getLogger('get_or_create_subj') - L.addHandler(F) + L = start_logging('get_or_create_subj') create = False if name: # we are probably creating a node record @@ -143,8 +136,7 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ - L = logging.getLogger('restart_mnlite') - L.addHandler(F) + L = start_logging('restart_mnlite') L.info('Restarting mnlite systemctl service...') try: subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) @@ -168,8 +160,7 @@ def harvest_data(loc, mn_name): """ """ - L = logging.getLogger('harvest_data') - L.addHandler(F) + L = start_logging('harvest_data') log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) L.info('scrapy log location is %s' % (log_loc)) @@ -186,7 +177,7 @@ def limit_tests(num_things): """ Ask the user to limit the number of tests to run on a given set of metadata. """ - L = logging.getLogger('limit_tests') + L = start_logging('limit_tests') while True: i = input('Testing more than 500 objects is not recommended due to performance concerns.\n\ This may take several minutes and use critical server resources. (est: %s min)\n\ From 44e1c165e049e60d29e6dd735ba9922001f0b9fc Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:15:47 -0800 Subject: [PATCH 154/301] fixing logging --- mnonboard/__init__.py | 2 +- mnonboard/data_chx.py | 6 +----- mnonboard/info_chx.py | 18 +----------------- mnonboard/utils.py | 11 +---------- 4 files changed, 4 insertions(+), 33 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index c3fb9032..bd77e84b 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -18,7 +18,7 @@ HARVEST_LOG_NAME = '-crawl-%s.log' % YM_DATE -def start_logging(name='init'): +def start_logging(name=__name__): # logging.basicConfig( # level=LOG_LEVELS.get("DEBUG", logging.DEBUG), # format=LOG_FORMAT, diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 81ed06dd..5230af19 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -3,7 +3,7 @@ from pyshacl.errors import ShapeLoadError, ConstraintLoadError, \ ReportableRuntimeError -from mnonboard import start_logging +from mnonboard import L from mnonboard.defs import SHACL_URL, SHACL_ERRORS from mnonboard.utils import limit_tests, save_report from opersist.cli import getOpersistInstance @@ -14,7 +14,6 @@ def violation_extract(viol): """ A function that extracts the name of the violation from a dictionary entry. """ - L = start_logging('violation_extract') lines = ['Source Shape: '] end = '\n' vx = [] @@ -36,7 +35,6 @@ def violation_cat(hash, viol): """ A function that returns a string that contains the severity of a passed shacl violation and a comment. """ - L = start_logging('violation_cat') csvl = '%s,%s,%s,%s\n' cat, comment = '', '' if viol in SHACL_ERRORS['essential']: @@ -61,7 +59,6 @@ def violation_report(viol_dict, loc): """ A function that outputs a report containing information on the violations found while shacl testing. """ - L = start_logging('violation_report') L.info('Creating report.') L.debug(viol_dict) L.info('Violation dictionary length: %s' % (len(viol_dict))) @@ -91,7 +88,6 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): num_tests: Number of metadata files to test (randomly selected; default=3) debug: If True, will print a lot of debug information including metadata file contents """ - L = start_logging('test_mdata') L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) op = getOpersistInstance(loc) num_things = op.countThings() diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 063f4508..4fb59bc7 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -4,7 +4,7 @@ import logging from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX -from mnonboard import default_json, start_logging +from mnonboard import default_json, L from opersist.utils import JSON_TIME_FORMAT, dtnow from opersist.cli import getOpersistInstance @@ -18,7 +18,6 @@ def not_empty(f): return f != '' def req_input(desc): - L = start_logging('req_input') while True: i = input(desc) L.info('User entry for %s"%s"' % (desc, i)) @@ -40,7 +39,6 @@ def valid_orcid(orcid): This seems like overkill but is probably good to have since it will be used to store contacts for database upkeep/maintenance. """ - L = start_logging('valid_orcid') if (len(orcid) == 19): # it's 19 characters long. start test loop for i in range(0,19): @@ -75,7 +73,6 @@ def base_url(descrip): """ Validate the base URL of the member node. Should include trailing slash. """ - L = start_logging('base_url') while True: url = req_input(descrip) if url[-1] in '/': @@ -88,7 +85,6 @@ def valid_url_prefix(url, prefix, f): """ Validate a URL prefix (such as for an ORCiD number). """ - L = start_logging('valid_url_prefix') # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) @@ -105,7 +101,6 @@ def sitemap_urls(num_urls): Collect the sitemap URLs. Usually there will be just one of these but we will prepare for more. """ - L = start_logging('sitemap_urls') i = 0 while i < num_urls: # add URLs one at a time (should only be a few at most) @@ -119,7 +114,6 @@ def enter_schedule(): """ Give the user a choice between three basic scheduling options. """ - L = start_logging('enter_schedule') p = 'Select a starting frequency with which to scrape data from this member node.\n' \ '1: Monthly\n' \ '2: Daily\n' \ @@ -143,7 +137,6 @@ def enter_int(prompt): """ Make sure the user enters an integer value of 1 or greater. """ - L = start_logging('enter_int') i = None while True: # make sure user enters an int @@ -167,7 +160,6 @@ def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ - L = start_logging('cn_subj_lookup') # this authentication method was adapted from: # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} @@ -198,7 +190,6 @@ def local_subj_lookup(subj, loc): """ Use the local opersist instance to look up a subject. """ - L = start_logging('local_subj_lookup') L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) rec = op.getSubject(subj=subj) @@ -215,7 +206,6 @@ def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. """ - L = start_logging('orcid_name') L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) L.info('User has entered "%s"' % name) @@ -225,7 +215,6 @@ def enter_orcid(prompt): """ Make sure the user enters an integer value of 1 or greater. """ - L = start_logging('enter_orcid') while True: # ask the user for an ORCiD number o = req_input(prompt) @@ -241,7 +230,6 @@ def valid_nodeid(node_id): """ Make sure the node_id contains the correct prefix. """ - L = start_logging('valid_nodeid') if NODE_ID_PREFIX in node_id: # if valid, return return node_id @@ -268,7 +256,6 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): """ Have the user enter a node_id and make sure it contains the correct id prefix. """ - L = start_logging('enter_nodeid') while True: L.info('In loop, vars are prompt="%s", id="%s"' % (prompt, id)) # ask the user for a node id @@ -285,7 +272,6 @@ def user_input(): """ We need a few pieces of information to fill the json fields. """ - L = start_logging('user_input') names = {} baseurl = '' L.info('Collecting user input.') @@ -335,7 +321,6 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. """ - L = start_logging('transfer_info') fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') for f in ufields: @@ -354,7 +339,6 @@ def input_test(fields): """ Testing the manually filled json file. """ - L = start_logging('input_test') L.info('Running tests on imported json.') # first, test that there are the fields we need test_fields = default_json(fx='mnonboard.info_chx.input_test()') diff --git a/mnonboard/utils.py b/mnonboard/utils.py index e3f4e562..0674e5f6 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -3,14 +3,13 @@ import subprocess from defs import SCHEDULES -from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, start_logging +from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name def load_json(loc): """ Load json from file. """ - L = start_logging('load_json') L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: @@ -28,7 +27,6 @@ def save_json(loc, jf): """ Output json to file. """ - L = start_logging('save_json') L.info('Writing member node json to %s' % loc) try: with open(loc, 'w') as f: @@ -46,7 +44,6 @@ def save_report(rep_str, loc, format='.csv'): """ Output a validation report for a set of metadata. """ - L = start_logging('save_report') fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) L.info('Writing report to %s' % (fn)) with open(fn, 'w') as f: @@ -71,7 +68,6 @@ def init_repo(loc): ''' Initialize a new instance using opersist. ''' - L = start_logging('init_repo') try: L.info('Using opersist to init new member node folder: %s' % loc) subprocess.run(['opersist', @@ -85,7 +81,6 @@ def new_subj(loc, name, value): """ Create new subject in the database using opersist. """ - L = start_logging('new_subj') try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) subprocess.run(['opersist', @@ -104,7 +99,6 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal This one I will definitely have to explain in the docstring. """ - L = start_logging('get_or_create_subj') create = False if name: # we are probably creating a node record @@ -136,7 +130,6 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ - L = start_logging('restart_mnlite') L.info('Restarting mnlite systemctl service...') try: subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) @@ -160,7 +153,6 @@ def harvest_data(loc, mn_name): """ """ - L = start_logging('harvest_data') log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) L.info('scrapy log location is %s' % (log_loc)) @@ -177,7 +169,6 @@ def limit_tests(num_things): """ Ask the user to limit the number of tests to run on a given set of metadata. """ - L = start_logging('limit_tests') while True: i = input('Testing more than 500 objects is not recommended due to performance concerns.\n\ This may take several minutes and use critical server resources. (est: %s min)\n\ From b4a29db27b87ce1f2c3922470edfbee6d683fb75 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:21:46 -0800 Subject: [PATCH 155/301] fixing logging --- mnonboard/__init__.py | 8 +++----- mnonboard/cli.py | 4 ++-- mnonboard/data_chx.py | 4 ++++ mnonboard/info_chx.py | 20 +++++++++++++++++++- mnonboard/utils.py | 9 +++++++++ 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index bd77e84b..1f3193dc 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -19,11 +19,9 @@ HARVEST_LOG_NAME = '-crawl-%s.log' % YM_DATE def start_logging(name=__name__): - # logging.basicConfig( - # level=LOG_LEVELS.get("DEBUG", logging.DEBUG), - # format=LOG_FORMAT, - # datefmt=LOG_DATE_FORMAT, - # ) + """ + Initialize logger. + """ logger = logging.getLogger(name) logger.setLevel(logging.DEBUG) formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 01155f3f..01e5268e 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -6,7 +6,7 @@ import info_chx import data_chx from defs import CFG, HELP_TEXT -from mnonboard import default_json, start_logging +from mnonboard import default_json, L def run(cfg): """ @@ -55,7 +55,7 @@ def main(): """ Uses getopt to set config values in order to call run(). """ - L = start_logging('main') + L.name = __name__ # get arguments try: opts = getopt.getopt(sys.argv[1:], 'hiPvLd:l:c:', diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 5230af19..5c17d637 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -14,6 +14,7 @@ def violation_extract(viol): """ A function that extracts the name of the violation from a dictionary entry. """ + L.name = __name__ lines = ['Source Shape: '] end = '\n' vx = [] @@ -35,6 +36,7 @@ def violation_cat(hash, viol): """ A function that returns a string that contains the severity of a passed shacl violation and a comment. """ + L.name = __name__ csvl = '%s,%s,%s,%s\n' cat, comment = '', '' if viol in SHACL_ERRORS['essential']: @@ -59,6 +61,7 @@ def violation_report(viol_dict, loc): """ A function that outputs a report containing information on the violations found while shacl testing. """ + L.name = __name__ L.info('Creating report.') L.debug(viol_dict) L.info('Violation dictionary length: %s' % (len(viol_dict))) @@ -88,6 +91,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): num_tests: Number of metadata files to test (randomly selected; default=3) debug: If True, will print a lot of debug information including metadata file contents """ + L.name = __name__ L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) op = getOpersistInstance(loc) num_things = op.countThings() diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 4fb59bc7..d8815850 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -18,6 +18,10 @@ def not_empty(f): return f != '' def req_input(desc): + """ + Require user input for a given prompt. + """ + L.name = __name__ while True: i = input(desc) L.info('User entry for %s"%s"' % (desc, i)) @@ -39,6 +43,7 @@ def valid_orcid(orcid): This seems like overkill but is probably good to have since it will be used to store contacts for database upkeep/maintenance. """ + L.name = __name__ if (len(orcid) == 19): # it's 19 characters long. start test loop for i in range(0,19): @@ -73,6 +78,7 @@ def base_url(descrip): """ Validate the base URL of the member node. Should include trailing slash. """ + L.name = __name__ while True: url = req_input(descrip) if url[-1] in '/': @@ -86,6 +92,7 @@ def valid_url_prefix(url, prefix, f): Validate a URL prefix (such as for an ORCiD number). """ # orcid number will be preceded by a url prefix but no trailing slash + L.name = __name__ if prefix not in url: L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field "%s"' % (ORCID_PREFIX, f)) @@ -101,6 +108,7 @@ def sitemap_urls(num_urls): Collect the sitemap URLs. Usually there will be just one of these but we will prepare for more. """ + L.name = __name__ i = 0 while i < num_urls: # add URLs one at a time (should only be a few at most) @@ -114,6 +122,7 @@ def enter_schedule(): """ Give the user a choice between three basic scheduling options. """ + L.name = __name__ p = 'Select a starting frequency with which to scrape data from this member node.\n' \ '1: Monthly\n' \ '2: Daily\n' \ @@ -137,6 +146,7 @@ def enter_int(prompt): """ Make sure the user enters an integer value of 1 or greater. """ + L.name = __name__ i = None while True: # make sure user enters an int @@ -160,6 +170,7 @@ def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ + L.name = __name__ # this authentication method was adapted from: # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} @@ -190,6 +201,7 @@ def local_subj_lookup(subj, loc): """ Use the local opersist instance to look up a subject. """ + L.name = __name__ L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) rec = op.getSubject(subj=subj) @@ -206,6 +218,7 @@ def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. """ + L.name = __name__ L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) L.info('User has entered "%s"' % name) @@ -215,6 +228,7 @@ def enter_orcid(prompt): """ Make sure the user enters an integer value of 1 or greater. """ + L.name = __name__ while True: # ask the user for an ORCiD number o = req_input(prompt) @@ -230,6 +244,7 @@ def valid_nodeid(node_id): """ Make sure the node_id contains the correct prefix. """ + L.name = __name__ if NODE_ID_PREFIX in node_id: # if valid, return return node_id @@ -256,6 +271,7 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): """ Have the user enter a node_id and make sure it contains the correct id prefix. """ + L.name = __name__ while True: L.info('In loop, vars are prompt="%s", id="%s"' % (prompt, id)) # ask the user for a node id @@ -272,7 +288,7 @@ def user_input(): """ We need a few pieces of information to fill the json fields. """ - names = {} + L.name = __name__ baseurl = '' L.info('Collecting user input.') for f in FIELDS: @@ -321,6 +337,7 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. """ + L.name = __name__ fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') for f in ufields: @@ -339,6 +356,7 @@ def input_test(fields): """ Testing the manually filled json file. """ + L.name = __name__ L.info('Running tests on imported json.') # first, test that there are the fields we need test_fields = default_json(fx='mnonboard.info_chx.input_test()') diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0674e5f6..ef39d7be 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -10,6 +10,7 @@ def load_json(loc): """ Load json from file. """ + L.name = __name__ L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: @@ -27,6 +28,7 @@ def save_json(loc, jf): """ Output json to file. """ + L.name = __name__ L.info('Writing member node json to %s' % loc) try: with open(loc, 'w') as f: @@ -44,6 +46,7 @@ def save_report(rep_str, loc, format='.csv'): """ Output a validation report for a set of metadata. """ + L.name = __name__ fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) L.info('Writing report to %s' % (fn)) with open(fn, 'w') as f: @@ -68,6 +71,7 @@ def init_repo(loc): ''' Initialize a new instance using opersist. ''' + L.name = __name__ try: L.info('Using opersist to init new member node folder: %s' % loc) subprocess.run(['opersist', @@ -81,6 +85,7 @@ def new_subj(loc, name, value): """ Create new subject in the database using opersist. """ + L.name = __name__ try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) subprocess.run(['opersist', @@ -99,6 +104,7 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal This one I will definitely have to explain in the docstring. """ + L.name = __name__ create = False if name: # we are probably creating a node record @@ -130,6 +136,7 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ + L.name = __name__ L.info('Restarting mnlite systemctl service...') try: subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) @@ -153,6 +160,7 @@ def harvest_data(loc, mn_name): """ """ + L.name = __name__ log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) L.info('scrapy log location is %s' % (log_loc)) @@ -169,6 +177,7 @@ def limit_tests(num_things): """ Ask the user to limit the number of tests to run on a given set of metadata. """ + L.name = __name__ while True: i = input('Testing more than 500 objects is not recommended due to performance concerns.\n\ This may take several minutes and use critical server resources. (est: %s min)\n\ From 1734cfd211a115c694829249a85c7e5d1f56ef6f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:29:35 -0800 Subject: [PATCH 156/301] fixing namespace for logging --- mnonboard/cli.py | 36 ++++++++++++++++++------------------ mnonboard/info_chx.py | 1 - 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 01e5268e..e1f8fcb8 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -1,10 +1,10 @@ import os, sys import getopt -import logging -import utils -import info_chx -import data_chx +from utils import load_json, node_path, init_repo, get_or_create_subj, \ + save_json, restart_mnlite, harvest_data, set_schedule +from info_chx import user_input, transfer_info, input_test +from data_chx import test_mdata from defs import CFG, HELP_TEXT from mnonboard import default_json, L @@ -15,40 +15,40 @@ def run(cfg): """ if cfg['info'] == 'user': # do the full user-driven info gathering process - ufields = info_chx.user_input() - fields = info_chx.transfer_info(ufields) + ufields = user_input() + fields = transfer_info(ufields) else: # grab the info from a json - fields = utils.load_json(cfg['json_file']) - info_chx.input_test(fields) + fields = load_json(cfg['json_file']) + input_test(fields) # still need to ask the user for some names # now we're cooking # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) end_node_subj = fields['node']['subject'].split('/')[-1] - loc = utils.node_path(nodedir=end_node_subj) + loc = node_path(nodedir=end_node_subj) # initialize a repository there (step 5) - utils.init_repo(loc) + init_repo(loc) for f in ('default_owner', 'default_submitter', 'contact_subject'): # add a subject for owner and submitter (may not be necessary if they exist already) # add subject for technical contact (step 6) val = fields[f] if f not in 'contact_subject' else fields['node'][f] - utils.get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) + get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) # add node as a subject (step 7) - utils.get_or_create_subj(loc=loc, value=fields['node']['node_id'], + get_or_create_subj(loc=loc, value=fields['node']['node_id'], cn_url=cfg['cn_url'], name=end_node_subj) # set the update schedule and set the state to up - fields['node']['schedule'] = utils.set_schedule() + fields['node']['schedule'] = set_schedule() fields['node']['state'] = 'up' # okay, now overwrite the default node.json with our new one (step 8) - utils.save_json(loc=os.path.join(loc, 'node.json'), jf=fields) + save_json(loc=os.path.join(loc, 'node.json'), jf=fields) # restart the mnlite process to pick up the new node.json (step 9) - utils.restart_mnlite() + restart_mnlite() # run scrapy to harvest metadata (step 10) if not cfg['local']: - utils.harvest_data(loc, end_node_subj) + harvest_data(loc, end_node_subj) # now run tests - data_chx.test_mdata(loc, num_tests=cfg['check_files']) + test_mdata(loc, num_tests=cfg['check_files']) def main(): @@ -78,7 +78,7 @@ def main(): CFG['cn_url'] = 'https://cn.dataone.org/cn' if o in ('-d', '--dump'): # dump default json to file - utils.save_json(a, default_json()) + save_json(a, default_json()) exit(0) if o in ('-l', '--load'): # load from json file diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index d8815850..dceb0c8e 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -1,7 +1,6 @@ from d1_client.cnclient import CoordinatingNodeClient from d1_common.types import exceptions from os import environ -import logging from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX from mnonboard import default_json, L From b1387d7825a8ef55a92673aee0ce48f01ff9c1e2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:39:07 -0800 Subject: [PATCH 157/301] fixing logging --- mnonboard/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 1f3193dc..99baac8c 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -9,6 +9,8 @@ __version__ = 'v0.0.1' +LOG_FORMAT = "%(asctime)s %(funcName)s:%(levelname)s: %(message)s" # overrides import + FN_DATE = datetime.now().strftime('%Y-%m-%d') HM_DATE = datetime.now().strftime('%Y-%m-%d-%H%M') YM_DATE = datetime.now().strftime('%Y-%m') From 2b47a5c2e9783df123bfd24d39be8b5bd9412bd4 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:42:43 -0800 Subject: [PATCH 158/301] fixing logging (last time) --- mnonboard/__init__.py | 4 ++-- mnonboard/cli.py | 1 - mnonboard/data_chx.py | 4 ---- mnonboard/info_chx.py | 16 ---------------- mnonboard/utils.py | 9 --------- 5 files changed, 2 insertions(+), 32 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 99baac8c..1dce9da5 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -20,11 +20,11 @@ HARVEST_LOG_NAME = '-crawl-%s.log' % YM_DATE -def start_logging(name=__name__): +def start_logging(): """ Initialize logger. """ - logger = logging.getLogger(name) + logger = logging.getLogger('mnonboard') logger.setLevel(logging.DEBUG) formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) s = logging.StreamHandler() diff --git a/mnonboard/cli.py b/mnonboard/cli.py index e1f8fcb8..23c7bf93 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -55,7 +55,6 @@ def main(): """ Uses getopt to set config values in order to call run(). """ - L.name = __name__ # get arguments try: opts = getopt.getopt(sys.argv[1:], 'hiPvLd:l:c:', diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 5c17d637..5230af19 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -14,7 +14,6 @@ def violation_extract(viol): """ A function that extracts the name of the violation from a dictionary entry. """ - L.name = __name__ lines = ['Source Shape: '] end = '\n' vx = [] @@ -36,7 +35,6 @@ def violation_cat(hash, viol): """ A function that returns a string that contains the severity of a passed shacl violation and a comment. """ - L.name = __name__ csvl = '%s,%s,%s,%s\n' cat, comment = '', '' if viol in SHACL_ERRORS['essential']: @@ -61,7 +59,6 @@ def violation_report(viol_dict, loc): """ A function that outputs a report containing information on the violations found while shacl testing. """ - L.name = __name__ L.info('Creating report.') L.debug(viol_dict) L.info('Violation dictionary length: %s' % (len(viol_dict))) @@ -91,7 +88,6 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): num_tests: Number of metadata files to test (randomly selected; default=3) debug: If True, will print a lot of debug information including metadata file contents """ - L.name = __name__ L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) op = getOpersistInstance(loc) num_things = op.countThings() diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index dceb0c8e..20299c59 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -20,7 +20,6 @@ def req_input(desc): """ Require user input for a given prompt. """ - L.name = __name__ while True: i = input(desc) L.info('User entry for %s"%s"' % (desc, i)) @@ -42,7 +41,6 @@ def valid_orcid(orcid): This seems like overkill but is probably good to have since it will be used to store contacts for database upkeep/maintenance. """ - L.name = __name__ if (len(orcid) == 19): # it's 19 characters long. start test loop for i in range(0,19): @@ -77,7 +75,6 @@ def base_url(descrip): """ Validate the base URL of the member node. Should include trailing slash. """ - L.name = __name__ while True: url = req_input(descrip) if url[-1] in '/': @@ -91,7 +88,6 @@ def valid_url_prefix(url, prefix, f): Validate a URL prefix (such as for an ORCiD number). """ # orcid number will be preceded by a url prefix but no trailing slash - L.name = __name__ if prefix not in url: L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field "%s"' % (ORCID_PREFIX, f)) @@ -107,7 +103,6 @@ def sitemap_urls(num_urls): Collect the sitemap URLs. Usually there will be just one of these but we will prepare for more. """ - L.name = __name__ i = 0 while i < num_urls: # add URLs one at a time (should only be a few at most) @@ -121,7 +116,6 @@ def enter_schedule(): """ Give the user a choice between three basic scheduling options. """ - L.name = __name__ p = 'Select a starting frequency with which to scrape data from this member node.\n' \ '1: Monthly\n' \ '2: Daily\n' \ @@ -145,7 +139,6 @@ def enter_int(prompt): """ Make sure the user enters an integer value of 1 or greater. """ - L.name = __name__ i = None while True: # make sure user enters an int @@ -169,7 +162,6 @@ def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. """ - L.name = __name__ # this authentication method was adapted from: # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb options = {"headers": {"Authorization": "Bearer %s" % (D1_AUTH_TOKEN)}} @@ -200,7 +192,6 @@ def local_subj_lookup(subj, loc): """ Use the local opersist instance to look up a subject. """ - L.name = __name__ L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) rec = op.getSubject(subj=subj) @@ -217,7 +208,6 @@ def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. """ - L.name = __name__ L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) L.info('User has entered "%s"' % name) @@ -227,7 +217,6 @@ def enter_orcid(prompt): """ Make sure the user enters an integer value of 1 or greater. """ - L.name = __name__ while True: # ask the user for an ORCiD number o = req_input(prompt) @@ -243,7 +232,6 @@ def valid_nodeid(node_id): """ Make sure the node_id contains the correct prefix. """ - L.name = __name__ if NODE_ID_PREFIX in node_id: # if valid, return return node_id @@ -270,7 +258,6 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): """ Have the user enter a node_id and make sure it contains the correct id prefix. """ - L.name = __name__ while True: L.info('In loop, vars are prompt="%s", id="%s"' % (prompt, id)) # ask the user for a node id @@ -287,7 +274,6 @@ def user_input(): """ We need a few pieces of information to fill the json fields. """ - L.name = __name__ baseurl = '' L.info('Collecting user input.') for f in FIELDS: @@ -336,7 +322,6 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. """ - L.name = __name__ fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') for f in ufields: @@ -355,7 +340,6 @@ def input_test(fields): """ Testing the manually filled json file. """ - L.name = __name__ L.info('Running tests on imported json.') # first, test that there are the fields we need test_fields = default_json(fx='mnonboard.info_chx.input_test()') diff --git a/mnonboard/utils.py b/mnonboard/utils.py index ef39d7be..0674e5f6 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -10,7 +10,6 @@ def load_json(loc): """ Load json from file. """ - L.name = __name__ L.info('Loading member node json from %s' % loc) try: with open(loc, 'r') as f: @@ -28,7 +27,6 @@ def save_json(loc, jf): """ Output json to file. """ - L.name = __name__ L.info('Writing member node json to %s' % loc) try: with open(loc, 'w') as f: @@ -46,7 +44,6 @@ def save_report(rep_str, loc, format='.csv'): """ Output a validation report for a set of metadata. """ - L.name = __name__ fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) L.info('Writing report to %s' % (fn)) with open(fn, 'w') as f: @@ -71,7 +68,6 @@ def init_repo(loc): ''' Initialize a new instance using opersist. ''' - L.name = __name__ try: L.info('Using opersist to init new member node folder: %s' % loc) subprocess.run(['opersist', @@ -85,7 +81,6 @@ def new_subj(loc, name, value): """ Create new subject in the database using opersist. """ - L.name = __name__ try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) subprocess.run(['opersist', @@ -104,7 +99,6 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal This one I will definitely have to explain in the docstring. """ - L.name = __name__ create = False if name: # we are probably creating a node record @@ -136,7 +130,6 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ - L.name = __name__ L.info('Restarting mnlite systemctl service...') try: subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) @@ -160,7 +153,6 @@ def harvest_data(loc, mn_name): """ """ - L.name = __name__ log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) L.info('scrapy log location is %s' % (log_loc)) @@ -177,7 +169,6 @@ def limit_tests(num_things): """ Ask the user to limit the number of tests to run on a given set of metadata. """ - L.name = __name__ while True: i = input('Testing more than 500 objects is not recommended due to performance concerns.\n\ This may take several minutes and use critical server resources. (est: %s min)\n\ From 6533d095fad8b51d2cd68588a5baad606d0466ee Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:47:40 -0800 Subject: [PATCH 159/301] undoing namespace changes --- mnonboard/__init__.py | 2 +- mnonboard/cli.py | 35 +++++++++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 1dce9da5..3dc4f69b 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -2,7 +2,7 @@ import logging from datetime import datetime -from opersist.cli import LOG_LEVELS, LOG_DATE_FORMAT, LOG_FORMAT +from opersist.cli import LOG_DATE_FORMAT, LOG_FORMAT from mnlite.mnode import DEFAULT_NODE_CONFIG DEFAULT_JSON = DEFAULT_NODE_CONFIG diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 23c7bf93..a4f92831 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -1,10 +1,9 @@ import os, sys import getopt -from utils import load_json, node_path, init_repo, get_or_create_subj, \ - save_json, restart_mnlite, harvest_data, set_schedule -from info_chx import user_input, transfer_info, input_test -from data_chx import test_mdata +import utils +import info_chx +import data_chx from defs import CFG, HELP_TEXT from mnonboard import default_json, L @@ -15,40 +14,40 @@ def run(cfg): """ if cfg['info'] == 'user': # do the full user-driven info gathering process - ufields = user_input() - fields = transfer_info(ufields) + ufields = info_chx.user_input() + fields = info_chx.transfer_info(ufields) else: # grab the info from a json - fields = load_json(cfg['json_file']) - input_test(fields) + fields = utils.load_json(cfg['json_file']) + info_chx.input_test(fields) # still need to ask the user for some names # now we're cooking # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) end_node_subj = fields['node']['subject'].split('/')[-1] - loc = node_path(nodedir=end_node_subj) + loc = utils.node_path(nodedir=end_node_subj) # initialize a repository there (step 5) - init_repo(loc) + utils.init_repo(loc) for f in ('default_owner', 'default_submitter', 'contact_subject'): # add a subject for owner and submitter (may not be necessary if they exist already) # add subject for technical contact (step 6) val = fields[f] if f not in 'contact_subject' else fields['node'][f] - get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) + utils.get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) # add node as a subject (step 7) - get_or_create_subj(loc=loc, value=fields['node']['node_id'], + utils.get_or_create_subj(loc=loc, value=fields['node']['node_id'], cn_url=cfg['cn_url'], name=end_node_subj) # set the update schedule and set the state to up - fields['node']['schedule'] = set_schedule() + fields['node']['schedule'] = utils.set_schedule() fields['node']['state'] = 'up' # okay, now overwrite the default node.json with our new one (step 8) - save_json(loc=os.path.join(loc, 'node.json'), jf=fields) + utils.save_json(loc=os.path.join(loc, 'node.json'), jf=fields) # restart the mnlite process to pick up the new node.json (step 9) - restart_mnlite() + utils.restart_mnlite() # run scrapy to harvest metadata (step 10) if not cfg['local']: - harvest_data(loc, end_node_subj) + utils.harvest_data(loc, end_node_subj) # now run tests - test_mdata(loc, num_tests=cfg['check_files']) + data_chx.test_mdata(loc, num_tests=cfg['check_files']) def main(): @@ -77,7 +76,7 @@ def main(): CFG['cn_url'] = 'https://cn.dataone.org/cn' if o in ('-d', '--dump'): # dump default json to file - save_json(a, default_json()) + utils.save_json(a, default_json()) exit(0) if o in ('-l', '--load'): # load from json file From c7394484d377f846e332bd21e62d6b0da15d40e8 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 07:53:24 -0800 Subject: [PATCH 160/301] moving init message into logger function --- mnonboard/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 3dc4f69b..99d34e00 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -38,10 +38,10 @@ def start_logging(): # initialize logging logger.addHandler(s) # stream logger.addHandler(f) # file + logger.info('----- mnonboard %s start -----' % __version__) return logger L = start_logging() -L.info('----- mnonboard %s start -----' % __version__) # absolute path of current file CUR_PATH_ABS = os.path.dirname(os.path.abspath(__file__)) From 99644256f6b1446c1c0f2dd675976d12c128c903 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 19 Jan 2023 11:08:00 -0800 Subject: [PATCH 161/301] adding args/returns to docstrings --- mnonboard/__init__.py | 8 ++- mnonboard/cli.py | 6 +++ mnonboard/data_chx.py | 27 ++++++++-- mnonboard/info_chx.py | 115 ++++++++++++++++++++++++++++++++++++++++-- mnonboard/utils.py | 64 +++++++++++++++++++++-- 5 files changed, 207 insertions(+), 13 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index 99d34e00..ca6ddaaf 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -23,6 +23,9 @@ def start_logging(): """ Initialize logger. + + Returns: + (logging.Logger): The logger to use. """ logger = logging.getLogger('mnonboard') logger.setLevel(logging.DEBUG) @@ -51,7 +54,10 @@ def start_logging(): def default_json(fx='Unspecified'): """ - A function that spits out a json file to be used in onboarding. + A function that spits out a dict to be used in onboarding. + + Returns: + (dict): A dict of values to be used in member node creation. """ L.info('%s function loading default json template.' % (fx)) return DEFAULT_JSON diff --git a/mnonboard/cli.py b/mnonboard/cli.py index a4f92831..f923a247 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -11,6 +11,9 @@ def run(cfg): """ Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. + + Args: + cfg (dict): Dict containing config variables. """ if cfg['info'] == 'user': # do the full user-driven info gathering process @@ -53,6 +56,9 @@ def run(cfg): def main(): """ Uses getopt to set config values in order to call run(). + + Returns: + (dict): Config variable dict to use in run(). """ # get arguments try: diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 5230af19..e237c2e0 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -12,7 +12,13 @@ def violation_extract(viol): """ - A function that extracts the name of the violation from a dictionary entry. + A function that extracts the name of the violation from pyshacl.validate()[2] (res_text). + + Args: + viol (str): The result text, third item returned of a pyshacl.validate() run. + + Returns: + vx (list of str): List of violation names found in the res_text """ lines = ['Source Shape: '] end = '\n' @@ -34,6 +40,13 @@ def violation_extract(viol): def violation_cat(hash, viol): """ A function that returns a string that contains the severity of a passed shacl violation and a comment. + + Args: + hash (str): Path to the metadata file (based on file hash). + viol (str): The violation name. + + Returns: + csvl (str): Comma-separated list of: hash, violation category, violation name, comment """ csvl = '%s,%s,%s,%s\n' cat, comment = '', '' @@ -58,6 +71,10 @@ def violation_cat(hash, viol): def violation_report(viol_dict, loc): """ A function that outputs a report containing information on the violations found while shacl testing. + + Args: + viol_dict (dict): Dictionary of violations compiled from this run of metadata checks. + loc (str): Directory of the opersist instance, where the report file will be written. """ L.info('Creating report.') L.debug(viol_dict) @@ -83,10 +100,10 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): Use pyshacl to test harvested metadata. Args: - loc: The base MN folder path in which opersist keeps its data and databases - shp_graph: Shape graph to be used for testing (defaults to soso v1.2.3) - num_tests: Number of metadata files to test (randomly selected; default=3) - debug: If True, will print a lot of debug information including metadata file contents + loc (str): The base MN folder path in which opersist keeps its data and databases + shp_graph (str): Shape graph to be used for testing (defaults to soso v1.2.3) + format (str): Format of the data graphs (default: json-ld) + num_tests (int): Number of metadata files to test (randomly selected; default=3) """ L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) op = getOpersistInstance(loc) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 20299c59..78945539 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -13,12 +13,24 @@ def not_empty(f): """ Test whether a string is empty. + + Args: + f (str): The string to test. + + Returns: + (bool): Whether or not the string is empty. """ return f != '' def req_input(desc): """ Require user input for a given prompt. + + Args: + desc (str): The prompt to show the user at the input step. + + Returns: + (str): User input. """ while True: i = input(desc) @@ -40,6 +52,12 @@ def valid_orcid(orcid): This seems like overkill but is probably good to have since it will be used to store contacts for database upkeep/maintenance. + + Args: + orcid (str): The orcid number. + + Returns: + (bool): Whether or not the orcid number passed checks. """ if (len(orcid) == 19): # it's 19 characters long. start test loop @@ -74,6 +92,12 @@ def valid_orcid(orcid): def base_url(descrip): """ Validate the base URL of the member node. Should include trailing slash. + + Args: + descrip (str): The prompt to show the user at the base URL input step. + + Returns: + (str): User input. """ while True: url = req_input(descrip) @@ -86,6 +110,14 @@ def base_url(descrip): def valid_url_prefix(url, prefix, f): """ Validate a URL prefix (such as for an ORCiD number). + + Args: + url (str): The URL to test. + prefix (str): The URL prefix. + f (str): The name of the field being tested. + + Returns: + True (bool): Returns True if the URL passed checks. """ # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: @@ -102,6 +134,12 @@ def sitemap_urls(num_urls): """ Collect the sitemap URLs. Usually there will be just one of these but we will prepare for more. + + Args: + num_urls (int): The number of URLs describing the sitemap. + + Returns: + SITEMAP_URLS (list): The sitemap URLs for the given member node. """ i = 0 while i < num_urls: @@ -115,6 +153,10 @@ def sitemap_urls(num_urls): def enter_schedule(): """ Give the user a choice between three basic scheduling options. + Options are: monthly, daily, and every 3 minutes. + + Returns: + (int): User-entered integer indicating schedule choice. """ p = 'Select a starting frequency with which to scrape data from this member node.\n' \ '1: Monthly\n' \ @@ -137,7 +179,13 @@ def enter_schedule(): def enter_int(prompt): """ - Make sure the user enters an integer value of 1 or greater. + Make sure the user enters a number of sitemap URLs of 1 or greater. + + Args: + prompt (str): The prompt to show the user at the input step. + + Returns: + (int): User-entered integer indicating number of sitemap URLs. """ i = None while True: @@ -161,6 +209,14 @@ def enter_int(prompt): def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ Use the DataONE API to look up whether a given ORCiD number already exists in the system. + + Args: + subj (str): The subject to look up. + cn_url (str): The URL for the DataONE api to send REST searches to (default: 'https://cn.dataone.org/cn'). + debug (bool): Whether to include debug info in log messages (lots of text). + + Returns: + (str or bool): Received response or False. """ # this authentication method was adapted from: # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb @@ -191,6 +247,13 @@ def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): def local_subj_lookup(subj, loc): """ Use the local opersist instance to look up a subject. + + Args: + subj (str): Subject id (unique). + loc (str): Location of the opersist instance. + + Returns: + (str or False): Returns subject name or False if not found. """ L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) @@ -207,6 +270,13 @@ def local_subj_lookup(subj, loc): def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. + + Args: + orcid (str): Subject orcid number. + f (str): json field name of inquiry. + + Returns: + (str): Returns user-entered subject name. """ L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) @@ -215,7 +285,13 @@ def orcid_name(orcid, f): def enter_orcid(prompt): """ - Make sure the user enters an integer value of 1 or greater. + Make sure the user enters a valid orcid number. + + Args: + prompt (str): Prompt to display at input step. + + Returns: + (str): Returns user-entered orcid number. """ while True: # ask the user for an ORCiD number @@ -231,10 +307,16 @@ def enter_orcid(prompt): def valid_nodeid(node_id): """ Make sure the node_id contains the correct prefix. + + Args: + node_id (str): Member node unique id. + + Returns: + (bool): Whether or not the node_id is valid. """ if NODE_ID_PREFIX in node_id: # if valid, return - return node_id + return True else: # if invalid, ask user if they meant to do that L.warning('Entered node_id does not contain the "%s" prefix. Entry: "%s"' % (NODE_ID_PREFIX, node_id)) @@ -246,7 +328,7 @@ def valid_nodeid(node_id): Please answer "yes" or "no" (yes is default): ' % (NODE_ID_PREFIX, node_id)) if c.lower() == 'no': L.warning('User has chosen to continue with node_id entry of %s' % (node_id)) - return node_id + return True elif (c.lower() == 'yes') or (c.lower() == ''): L.info('User has chosen to re-enter node_id. Entry: "%s"' % (c)) return False @@ -257,6 +339,14 @@ def valid_nodeid(node_id): def enter_nodeid(prompt='Unique node_id: ', id=False): """ Have the user enter a node_id and make sure it contains the correct id prefix. + Loops until a valid node id is entered. + + Args: + prompt (str): Prompt to display at input step. + id (str or bool): The node id from the user's json file or False if none. + + Returns: + (str): Only returns if node id is valid. """ while True: L.info('In loop, vars are prompt="%s", id="%s"' % (prompt, id)) @@ -268,11 +358,16 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): if valid_nodeid(id): return id else: + # loop again id = False def user_input(): """ We need a few pieces of information to fill the json fields. + Collects user input for necessary pieces of node.json information. + + Returns: + (dict): Dictionary of fields to use for node creation. Will be written to node.json. """ baseurl = '' L.info('Collecting user input.') @@ -321,6 +416,12 @@ def user_input(): def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. + + Args: + ufields (dict): A dict of user-entered fields to be translated. + + Returns: + (dict): A dict of user-entered fields in proper node.json format. """ fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') @@ -339,6 +440,12 @@ def transfer_info(ufields): def input_test(fields): """ Testing the manually filled json file. + + Args: + fields (dict): A dict of loaded json fields to test. + + Returns: + (bool): Returns True if all tests pass. """ L.info('Running tests on imported json.') # first, test that there are the fields we need diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0674e5f6..f9c4294d 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -9,6 +9,12 @@ def load_json(loc): """ Load json from file. + + Args: + loc (str): File location of the json file to be loaded. + + Returns: + j (str): Serialized json file contents. """ L.info('Loading member node json from %s' % loc) try: @@ -26,6 +32,13 @@ def load_json(loc): def save_json(loc, jf): """ Output json to file. + + Args: + loc (str): File location where the json file is to be written. + jf (dict): Dictionary to be written as json. + + Returns: + (No variable is returned) """ L.info('Writing member node json to %s' % loc) try: @@ -43,6 +56,11 @@ def save_json(loc, jf): def save_report(rep_str, loc, format='.csv'): """ Output a validation report for a set of metadata. + + Args: + rep_str (str): Report string to be written. + loc (str): File location where the report file is to be written. + jf (dict): File extension (default: .csv). """ fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) L.info('Writing report to %s' % (fn)) @@ -53,6 +71,9 @@ def save_report(rep_str, loc, format='.csv'): def dumps_json(js): """ Quick and dirty way to output formatted json. + + Args: + js (dict): Dictionary to be written as json. """ print(json.dumps(js, indent=2)) @@ -61,12 +82,23 @@ def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS, nodedir=''): Get the absolute path of the nodes directory where new members will go. Currently the nodes directory lives at `../instance/nodes/` (relative to the mnonboard dir that this file is in). + + Args: + nodepath (str): Location of the nodes directory relative to the project directory (default: 'instance/nodes/'). + curpath (str): Current absolute path of this function (default: os.path.dirname(os.path.abspath(__file__))). + nodedir (str): Name of the node directory (example: 'HAKAI_IYS'; default: '') + + Returns: + (str): Absolute path of the node directory """ return os.path.abspath(os.path.join(curpath, '../', nodepath, nodedir)) def init_repo(loc): ''' Initialize a new instance using opersist. + + Args: + loc (str): Location of the member node directory in which to initialize an opersist instance. ''' try: L.info('Using opersist to init new member node folder: %s' % loc) @@ -80,6 +112,11 @@ def init_repo(loc): def new_subj(loc, name, value): """ Create new subject in the database using opersist. + + Args: + loc (str): Location of the opersist instance. + name (str): Subject name (human readable). + value (str): Subject value (unique subject id, such as orcid or member node id). """ try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) @@ -96,8 +133,14 @@ def new_subj(loc, name, value): def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=False): """ Get an existing subject using their ORCiD or create a new one with the specified values. + Search is conducted first at the given coordinating node URL, then locally. + If no subject is found, a new record is created in the local opersist instance. - This one I will definitely have to explain in the docstring. + Args: + loc (str): Location of the opersist instance. + value (str): Subject value (unique subject id, such as orcid or member node id). + cn_url (str): The base URL of the rest API with which to search for the given subject. + name (str or bool): Subject name (human readable). """ create = False if name: @@ -121,7 +164,11 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal def set_schedule(): """ - + Ask the user what schedule on which they would like to run scrapes. + Options are: monthly, daily, and every 3 minutes. + + Returns: + (dict): Dictionary entry formatted based on the chosen schedule option. """ s = enter_schedule() return SCHEDULES[s] @@ -151,7 +198,9 @@ def restart_mnlite(): def harvest_data(loc, mn_name): """ - + Args: + loc (str): Location of the opersist instance. + mn_name (str): Name of the member node (used to name the crawl log). """ log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) @@ -168,6 +217,15 @@ def harvest_data(loc, mn_name): def limit_tests(num_things): """ Ask the user to limit the number of tests to run on a given set of metadata. + This will execute if the user decides to try and test more than 500 metadata objects. + The prompt will ask them if they wish to limit the number, then return a + number based on their decision. + + Args: + num_things (int): Initial number of things to test. + + Returns: + num_things (int): Modified number of things to test. """ while True: i = input('Testing more than 500 objects is not recommended due to performance concerns.\n\ From b589efaeefecdb8900d7b83aceae0d637c31979f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 30 Jan 2023 14:37:33 -0800 Subject: [PATCH 162/301] set up a way to send name info to the CN server --- mnonboard/cli.py | 15 ++++++++++++--- mnonboard/data_chx.py | 2 +- mnonboard/defs.py | 18 +++++++++++++++++- mnonboard/utils.py | 10 +++++++++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index f923a247..c4d5656d 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -4,7 +4,7 @@ import utils import info_chx import data_chx -from defs import CFG, HELP_TEXT +from defs import CFG, HELP_TEXT, CN_SRVR, CN_SRVR_BASEURL from mnonboard import default_json, L def run(cfg): @@ -30,11 +30,14 @@ def run(cfg): loc = utils.node_path(nodedir=end_node_subj) # initialize a repository there (step 5) utils.init_repo(loc) + names = {} for f in ('default_owner', 'default_submitter', 'contact_subject'): # add a subject for owner and submitter (may not be necessary if they exist already) # add subject for technical contact (step 6) val = fields[f] if f not in 'contact_subject' else fields['node'][f] - utils.get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) + name = utils.get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) + # store this for a few steps later + names[f] = name # add node as a subject (step 7) utils.get_or_create_subj(loc=loc, value=fields['node']['node_id'], cn_url=cfg['cn_url'], @@ -51,6 +54,7 @@ def run(cfg): utils.harvest_data(loc, end_node_subj) # now run tests data_chx.test_mdata(loc, num_tests=cfg['check_files']) + utils.create_names_xml(names, cfg['cn_url']) def main(): @@ -79,7 +83,12 @@ def main(): CFG['info'] = 'user' if o in ('-P', '--production'): # production case - CFG['cn_url'] = 'https://cn.dataone.org/cn' + CFG['cn_url'] = CN_SRVR_BASEURL % CN_SRVR['production'] + CFG['mode'] = 'production' + else: + # testing case + CFG['cn_url'] = CN_SRVR_BASEURL % CN_SRVR['testing'] + CFG['mode'] = 'testing' if o in ('-d', '--dump'): # dump default json to file utils.save_json(a, default_json()) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index e237c2e0..b3df4c04 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -39,7 +39,7 @@ def violation_extract(viol): def violation_cat(hash, viol): """ - A function that returns a string that contains the severity of a passed shacl violation and a comment. + A function that returns a CSV linestring that contains the severity of a passed shacl violation and a comment. Args: hash (str): Path to the metadata file (based on file hash). diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 64ca29be..3fe6ca4e 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -8,11 +8,18 @@ 'info': 'user', 'json_file': 'node.json', 'cn_url': 'https://cn-stage.test.dataone.org/cn', - 'mode': 'staging', + 'mode': 'testing', 'check_files': 5, 'local': False, } +CN_SRVR = { + 'production': 'cn.dataone.org', + 'testing': 'cn-stage.test.dataone.org' +} + +CN_SRVR_BASEURL = 'https://%s/cn' + HELP_TEXT = """DataONE member node onboard script %s NCEAS/Ian Nesbitt @@ -131,3 +138,12 @@ 'FileNotFoundError': 'Files must exist in the location specified', } } + +NAMES_XML = """ + + %s + %s + %s + false + +""" diff --git a/mnonboard/utils.py b/mnonboard/utils.py index f9c4294d..0c781dec 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -2,7 +2,7 @@ import json import subprocess -from defs import SCHEDULES +from defs import SCHEDULES, NAMES_XML from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name @@ -161,6 +161,7 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal if create: # finally, use opersist to create the subject (sloppy, could create it directly, but this does the same thing) new_subj(loc, name, value) + return name def set_schedule(): """ @@ -247,3 +248,10 @@ def limit_tests(num_things): L.info('User has chosen to continue testing %s objects.' % (num_things)) break return num_things + +def create_names_xml(names, cn_url): + """ + Format and send names XML document to the CN server. + """ + # format NAMES_XML + pass \ No newline at end of file From 16a0415fc8df2f2c6e2e7924c7d3017dc0c3e26a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 31 Jan 2023 19:26:09 -0800 Subject: [PATCH 163/301] add xml creation (step 15) & attempt upload to cn --- mnonboard/cli.py | 7 +++-- mnonboard/utils.py | 73 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index c4d5656d..c487799a 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -37,7 +37,7 @@ def run(cfg): val = fields[f] if f not in 'contact_subject' else fields['node'][f] name = utils.get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) # store this for a few steps later - names[f] = name + names[val] = name # add node as a subject (step 7) utils.get_or_create_subj(loc=loc, value=fields['node']['node_id'], cn_url=cfg['cn_url'], @@ -54,7 +54,10 @@ def run(cfg): utils.harvest_data(loc, end_node_subj) # now run tests data_chx.test_mdata(loc, num_tests=cfg['check_files']) - utils.create_names_xml(names, cfg['cn_url']) + # create xml to upload for validation (step 15) + utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) + # uploading xml (proceed to step 14 and ssh to find xml in ~/d1_xml) + utils.upload_xml(loc, cfg['cn_url']) def main(): diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0c781dec..0fc719c6 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -53,6 +53,27 @@ def save_json(loc, jf): L.error('Error: %s' % e) exit(1) +def save_xml(loc, xst): + """ + Output XML string to file. + + Args: + loc (str): File location where the XML file is to be written. + xst (str): XML-formatted string to be written to file. + + Returns: + (No variable is returned) + """ + L.info('Writing XML to %s' % loc) + try: + with open(loc, 'w+') as f: + json.dump(xst, f, indent=4) + L.info('File written to %s' % loc) + return + except Exception as e: + L.error('Error: %s' % e) + exit(1) + def save_report(rep_str, loc, format='.csv'): """ Output a validation report for a set of metadata. @@ -249,9 +270,55 @@ def limit_tests(num_things): break return num_things -def create_names_xml(names, cn_url): +def create_names_xml(loc, node_id, names): """ - Format and send names XML document to the CN server. + Format subject XML documents and return list of names. + + Args: + loc (str): Location (dir) to write file to. + node_id (str): Node id of current MN. + names (dict): Dict of subject names with ORCiD as index. + + Returns: + files (list): List of files written. """ + # make dir + loc = os.path.join(loc, 'xml') + try: + os.makedirs(loc, exist_ok=True) + except OSError as e: + L.error('OSError creating XML directory: %s' % (e)) + exit(1) + except Exception as e: + L.error('%s creating XML directory: %s' % (repr(e), e)) + exit(1) # format NAMES_XML - pass \ No newline at end of file + node_id = node_id.split(':')[-1] + files = [] + for id in names: + first, last = names[id].split() + xst = NAMES_XML % (id, first, last) + fn = os.path.join(loc, '%s_%s%s.xml' % (node_id, first[0], last)) + L.debug('XML content:\n%s' % (xst)) + save_xml(fn, xst) + files.append(fn) + return files + +def upload_xml(files, server): + """ + Format subject XML documents and return list of names. + + Args: + files (list): List of files to upload. + server (str): Location of CN server to upload to. + """ + op = '' + L.info('Running "ssh %s \'mkdir -p d1_xml\'"' % (server)) + try: + op = 'mkdir on remote server' + subprocess.run(['ssh', server, 'mkdir -p d1_xml'], check=True) + for fn in files: + op = 'scp to remote server' + subprocess.run(['scp', fn, '%s:~/d1_xml'], check=True) + except Exception as e: + L.error('%s running %s. Details: %s' % (repr(e), op, e)) From 3c54e5e905cd2463ca5571aad9f3e2099f09af72 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 1 Feb 2023 16:41:09 -0800 Subject: [PATCH 164/301] fixing dir in ssh calls --- mnonboard/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0fc719c6..0ccd2ded 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -313,12 +313,12 @@ def upload_xml(files, server): server (str): Location of CN server to upload to. """ op = '' - L.info('Running "ssh %s \'mkdir -p d1_xml\'"' % (server)) + L.info('Running "ssh %s \'mkdir -p ~/d1_xml/\'"' % (server)) try: op = 'mkdir on remote server' - subprocess.run(['ssh', server, 'mkdir -p d1_xml'], check=True) + subprocess.run(['ssh', server, 'mkdir -p ~/d1_xml/'], check=True) for fn in files: op = 'scp to remote server' - subprocess.run(['scp', fn, '%s:~/d1_xml'], check=True) + subprocess.run(['scp', fn, '%s:~/d1_xml/'], check=True) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) From 15ff27219f306913154bfd57552a775b4ba271b6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Feb 2023 09:28:46 -0800 Subject: [PATCH 165/301] changing severity of keyword violation --- mnonboard/defs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 3fe6ca4e..4d32caf4 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -118,7 +118,6 @@ # schema.org violations 'SO:Dataset-description': 'Dataset must have a description', 'SO:Dataset-identifier': 'Dataset identifiers must be a URL, Text or PropertyValue', - 'SO:Dataset-keywords': 'A Dataset should include descriptive keywords as literals or DefinedTerm', 'SO:Dataset-name': 'Name is required for a Dataset', 'SO:Dataset-url': 'Dataset requires a URL for the location of a page describing the dataset', 'SO:Dataset-version': 'Dataset must have a version as Literal or Number', @@ -126,6 +125,7 @@ 'optional': { # schema.org violations 'SO:Dataset-isAccessibleForFree': 'It is recommended that a Dataset indicates accessibility for free or otherwise', + 'SO:Dataset-keywords': 'A Dataset should include descriptive keywords as literals or DefinedTerm', 'SO:Dataset-sameAs': 'It is recommended that a Dataset includes a sameAs URL', # SO coordinates 'schema:GeoCoordinates-longitude': 'It is recommended that a Dataset has a longitude coordinate in WGS-84 format', From ecb194dc6c71183c245b01bf228060d7b56acd46 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Feb 2023 14:33:33 -0800 Subject: [PATCH 166/301] correcting server location bug --- mnonboard/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0ccd2ded..cef652e6 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -313,6 +313,7 @@ def upload_xml(files, server): server (str): Location of CN server to upload to. """ op = '' + server = server.split('https://')[1].split('/')[0] L.info('Running "ssh %s \'mkdir -p ~/d1_xml/\'"' % (server)) try: op = 'mkdir on remote server' From db4983135f9408b31179be4f1be741df069d3487 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 17 Feb 2023 11:05:40 -0800 Subject: [PATCH 167/301] fixing node path to use end of node_id for dir --- mnonboard/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index c487799a..2b305005 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -26,7 +26,7 @@ def run(cfg): # still need to ask the user for some names # now we're cooking # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) - end_node_subj = fields['node']['subject'].split('/')[-1] + end_node_subj = fields['node']['node_id'].split(':')[-1] loc = utils.node_path(nodedir=end_node_subj) # initialize a repository there (step 5) utils.init_repo(loc) From b51fd4a0c201f90654566a78939e6229ba31c919 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 17 Feb 2023 11:24:01 -0800 Subject: [PATCH 168/301] bug fix if -> elif --- mnonboard/info_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 78945539..1d58847f 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -378,7 +378,7 @@ def user_input(): # the second level beneath 'node' if nf in 'node_id': FIELDS[f][nf][1] = enter_nodeid(prompt=FIELDS[f][nf][0]) - if nf in ['contact_subject']: + elif nf in ['contact_subject']: FIELDS[f][nf][1] = enter_orcid(FIELDS[f][nf][0]) elif '_name' in nf: # put the contact subject name in a different dict From ce9128eab166576e0e9e2bd89033e1d1756b5b7c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 21 Feb 2023 07:08:14 -0800 Subject: [PATCH 169/301] fixing lock file bugs --- poetry.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index c07df6bc..ba6a6bf3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -629,7 +629,7 @@ python-versions = ">=3.7" debugpy = ">=1.0.0" ipython = ">=7.23.1" jupyter-client = "*" -matplotlib-inline = {version = ">=0.1.0,<0.2.0appnope", markers = "platform_system == \"Darwin\""} +matplotlib-inline = {version = ">=0.1.0,<0.2.0", markers = "platform_system == \"Darwin\""} tornado = ">=4.2" traitlets = ">=4.1.0" @@ -2017,7 +2017,7 @@ flask_accept = "^0.0.6" Flask-Cors = "^3.0.10" httpx = "^0.16.1" jupyterlab = "^3.0.9" -"org.webpki.json" = "rev develop" +"org.webpki.json" = "*" pyjnius = "^1.3.0" pyld = "tag 2.0.4-dev_ddv-0.1" pyppeteer = "^0.2.5" From 40624d2ba37214546243fee7026b9c26fb0f170c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 21 Feb 2023 07:10:16 -0800 Subject: [PATCH 170/301] sonormal now in parent dir (`../sonormal`) --- poetry.lock | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index ba6a6bf3..f667e48f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2031,7 +2031,7 @@ docs = [] [package.source] type = "directory" -url = "../../sonormal" +url = "../sonormal" [[package]] name = "soupsieve" diff --git a/pyproject.toml b/pyproject.toml index e27bc666..5f09c229 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ diskcache = "^5.2.1" Flask-Cors = "^3.0.10" flask_accept = "^0.0.6" pyld = {git = "https://github.com/datadavev/pyld.git", tag = "2.0.4-dev_ddv-0.1"} -sonormal = {path = "../../sonormal", develop=true } +sonormal = {path = "../sonormal", develop=true } #pyjnius = "^1.3.0" From 33a012a10507a73df717a78f36434dbfb731d687 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 2 Mar 2023 10:26:10 -0800 Subject: [PATCH 171/301] defining USER_AGENT --- soscan/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/settings.py b/soscan/settings.py index 6d0d09b1..38d82028 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -16,7 +16,7 @@ # Crawl responsibly by identifying yourself (and your website) on the user-agent -# USER_AGENT = 'soscan (+http://www.yourdomain.com)' +USER_AGENT = 'soscan (+https://dataone.org/)' # Obey robots.txt rules ROBOTSTXT_OBEY = True From 5ba15c0121e2e4d77bf806c35aaa1564b9e7d17f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Mar 2023 14:00:11 -0700 Subject: [PATCH 172/301] adding usage details to readme --- mnonboard/README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/mnonboard/README.md b/mnonboard/README.md index 5ea9af3c..2172963b 100644 --- a/mnonboard/README.md +++ b/mnonboard/README.md @@ -1,4 +1,66 @@ # mnonboard -This module is designed to provide a wrapper around `opersist` in order to streamline the [DataONE member node onboarding process](https://github.com/DataONEorg/mnlite/blob/feature/onboarding/docs/operation.md). +This module is designed to provide a wrapper around `opersist` and `mnlite` in order to streamline the [DataONE member node onboarding process](https://github.com/DataONEorg/mnlite/blob/feature/onboarding/docs/operation.md). It takes as input either a json document manually edited from a template, or converts direct user input to a json document. + +## Usage + +This script requires working installations of both [sonormal](https://github.com/datadavev/sonormal) and [mnlite](https://github.com/DataONEorg/mnlite) to function properly. + +### CLI options + +``` +Usage: cli [ OPTIONS ] +where OPTIONS := { + -c | --check=[ NUMBER ] + number of random metadata files to check for schema.org compliance + -d | --dump=[ FILE ] + dump default member node json file to configure manually + -h | --help + display this help message + -i | --init + initialize a new member node from scratch + -l | --load=[ FILE ] + initialize a new member node from a json file + -P | --production + run this script in production mode (uses the D1 cn API in searches) + -L | --local + run this script in local mode (will not scrape the remote site for new metadata) +} +``` + +### Onboarding process + +Let's say you are in the `mnlite` base directory. +Start by activating the `mnlite` virtual environment and changing the working directory to `./mnonboard`: + +``` +workon mnlite +cd mnonboard +``` + +**Note:** Node data is stored in `instance/nodes/` + +#### Using an existing `node.json` + +To onboard a member node with an existing `node.json` file: + +``` +python cli.py -l ../instance/nodes/BONARES/node.json +``` + +The script will guide you through the steps to set up the node and harvest its metadata. + +#### No existing `node.json` + +The script can also ask the user questions to set up the `node.json` file in an assisted manner. To do so, use the `-i` (initialize) flag: + +``` +python cli.py -i +``` + +Keep in mind that you should always check the `node.json` file to ensure correct values. + +## Other functionality + +Coming soon (see [#21](https://github.com/DataONEorg/mnlite/issues/21)) From 1322e39e8077ad0d809b19319470576559b740c5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 24 Mar 2023 21:54:54 +0000 Subject: [PATCH 173/301] updating dependencies to fix install (#22) --- poetry.lock | 3070 +++++++++++++++--------------------------------- pyproject.toml | 2 +- 2 files changed, 951 insertions(+), 2121 deletions(-) diff --git a/poetry.lock b/poetry.lock index f667e48f..2871245c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,30 +1,34 @@ [[package]] name = "alabaster" -version = "0.7.12" +version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "alembic" -version = "1.6.5" +version = "1.10.2" description = "A database migration tool for SQLAlchemy." category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.7" [package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} Mako = "*" -python-dateutil = "*" -python-editor = ">=0.3" SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["python-dateutil"] [[package]] name = "anyio" -version = "3.2.1" +version = "3.6.2" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" +category = "dev" optional = false python-versions = ">=3.6.2" @@ -33,9 +37,9 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16)"] +doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] [[package]] name = "appdirs" @@ -47,9 +51,9 @@ python-versions = "*" [[package]] name = "appnope" -version = "0.1.2" +version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -63,32 +67,52 @@ python-versions = "*" [[package]] name = "argon2-cffi" -version = "20.1.0" +version = "21.3.0" description = "The secure Argon2 password hashing algorithm." -category = "main" +category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] -cffi = ">=1.0.0" -six = "*" +argon2-cffi-bindings = "*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "wheel", "pre-commit"] -docs = ["sphinx"] +dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] +docs = ["sphinx", "sphinx-notfound-page", "furo"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] [[package]] -name = "async-generator" -version = "1.10" -description = "Async generators and context managers for Python 3.5+" +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["pytest", "cogapp", "pre-commit", "wheel"] +tests = ["pytest"] + +[[package]] +name = "asttokens" +version = "2.2.1" +description = "Annotate AST trees with source code positions" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] [[package]] name = "atomicwrites" -version = "1.4.0" +version = "1.4.1" description = "Atomic file writes." category = "dev" optional = false @@ -110,7 +134,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "automat" -version = "20.2.0" +version = "22.10.0" description = "Self-service finite-state machines for the programmer on the go." category = "main" optional = false @@ -125,33 +149,44 @@ visualize = ["graphviz (>0.5.1)", "Twisted (>=16.1.1)"] [[package]] name = "babel" -version = "2.9.1" +version = "2.12.1" description = "Internationalization utilities" -category = "main" +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" [package.dependencies] -pytz = ">=2015.7" +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "main" +category = "dev" optional = false python-versions = "*" +[[package]] +name = "backports.zoneinfo" +version = "0.2.1" +description = "Backport of the standard library zoneinfo module" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +tzdata = ["tzdata"] + [[package]] name = "beautifulsoup4" -version = "4.9.3" +version = "4.12.0" description = "Screen-scraping library" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6.0" [package.dependencies] -soupsieve = {version = ">1.2", markers = "python_version >= \"3.0\""} +soupsieve = ">1.2" [package.extras] html5lib = ["html5lib"] @@ -181,52 +216,38 @@ d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] name = "bleach" -version = "3.3.0" +version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "main" +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [package.dependencies] -packaging = "*" six = ">=1.9.0" webencodings = "*" -[[package]] -name = "cachecontrol" -version = "0.12.6" -description = "httplib2 caching for requests" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -msgpack = ">=0.5.2" -requests = "*" - [package.extras] -filecache = ["lockfile (>=0.9)"] -redis = ["redis (>=2.10.5)"] +css = ["tinycss2 (>=1.1.0,<1.2)"] [[package]] name = "cachetools" -version = "4.2.2" +version = "5.3.0" description = "Extensible memoizing collections and decorators" category = "main" optional = false -python-versions = "~=3.5" +python-versions = "~=3.7" [[package]] name = "certifi" -version = "2021.5.30" +version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.14.6" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false @@ -237,30 +258,46 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" [[package]] name = "click" -version = "7.1.2" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "comm" +version = "0.1.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +traitlets = ">=5.3" + +[package.extras] +lint = ["black (>=22.6.0)", "mdformat-gfm (>=0.3.5)", "mdformat (>0.7)", "ruff (>=0.0.156)"] +test = ["pytest"] +typing = ["mypy (>=0.990)"] [[package]] name = "constantly" @@ -272,7 +309,7 @@ python-versions = "*" [[package]] name = "cryptography" -version = "3.4.7" +version = "40.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false @@ -282,59 +319,55 @@ python-versions = ">=3.6" cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "ruff", "mypy", "check-manifest"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-shard (>=0.1.2)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] [[package]] name = "cssselect" -version = "1.1.0" +version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "cython" -version = "0.29.24" -description = "The Cython compiler for writing C extensions for the Python language." -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" [[package]] name = "dateparser" -version = "1.0.0" +version = "1.1.8" description = "Date parsing library designed to parse dates from HTML pages" category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [package.dependencies] python-dateutil = "*" pytz = "*" -regex = "!=2019.02.19" +regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27" tzlocal = "*" [package.extras] -calendars = ["convertdate", "hijri-converter", "convertdate"] +calendars = ["hijri-converter", "convertdate"] +fasttext = ["fasttext"] +langdetect = ["langdetect"] [[package]] name = "debugpy" -version = "1.3.0" +version = "1.6.6" description = "An implementation of the Debug Adapter Protocol for Python" -category = "main" +category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +python-versions = ">=3.7" [[package]] name = "decorator" -version = "5.0.9" +version = "5.1.1" description = "Decorators for Humans" -category = "main" +category = "dev" optional = false python-versions = ">=3.5" @@ -342,13 +375,13 @@ python-versions = ">=3.5" name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "diskcache" -version = "5.2.1" +version = "5.4.0" description = "Disk Cache -- Disk and file backed persistent cache." category = "main" optional = false @@ -364,42 +397,77 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "dynaconf" -version = "3.1.4" +version = "3.1.12" description = "The dynamic configurator for your Python Project" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" [package.extras] all = ["redis", "ruamel.yaml", "configobj", "hvac"] configobj = ["configobj"] ini = ["configobj"] redis = ["redis"] +test = ["pytest", "pytest-cov", "pytest-xdist", "pytest-mock", "flake8", "pep8-naming", "flake8-debugger", "flake8-print", "flake8-todo", "radon", "flask (>=0.12)", "django", "python-dotenv", "toml", "codecov", "redis", "hvac", "configobj"] toml = ["toml"] vault = ["hvac"] yaml = ["ruamel.yaml"] [[package]] name = "entrypoints" -version = "0.3" +version = "0.4" description = "Discover and load entry points from installed packages." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +tests = ["asttokens", "pytest", "littleutils", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.16.3" +description = "Fastest Python implementation of JSON schema" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.10.4" +description = "A platform independent file lock." category = "main" optional = false -python-versions = ">=2.7" +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2022.12.7)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)", "pytest (>=7.2.2)"] [[package]] name = "flask" -version = "1.1.4" +version = "1.1.2" description = "A simple framework for building complex web applications." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] -click = ">=5.1,<8.0" -itsdangerous = ">=0.24,<2.0" -Jinja2 = ">=2.10.1,<3.0" -Werkzeug = ">=0.15,<2.0" +click = ">=5.1" +itsdangerous = ">=0.24" +Jinja2 = ">=2.10.1" +Werkzeug = ">=0.15" [package.extras] dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] @@ -443,7 +511,7 @@ SQLAlchemy = ">=0.8.0" [[package]] name = "frozendict" -version = "2.0.3" +version = "2.3.6" description = "A simple immutable dictionary" category = "main" optional = false @@ -451,94 +519,37 @@ python-versions = ">=3.6" [[package]] name = "gitdb" -version = "4.0.7" +version = "4.0.10" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.4" +python-versions = ">=3.7" [package.dependencies] -smmap = ">=3.0.1,<5" +smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.18" -description = "Python Git Library" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" [[package]] -name = "h11" -version = "0.12.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "h2" -version = "3.2.0" -description = "HTTP/2 State-Machine based protocol implementation" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -hpack = ">=3.0,<4" -hyperframe = ">=5.2.0,<6" - -[[package]] -name = "hpack" -version = "3.0.0" -description = "Pure-Python HPACK header compression" +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" category = "main" optional = false -python-versions = "*" - -[[package]] -name = "httpcore" -version = "0.12.3" -description = "A minimal low-level HTTP client." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -h11 = "<1.0.0" -sniffio = ">=1.0.0,<2.0.0" - -[package.extras] -http2 = ["h2 (>=3,<5)"] - -[[package]] -name = "httpx" -version = "0.16.1" -description = "The next generation HTTP client." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -certifi = "*" -httpcore = ">=0.12.0,<0.13.0" -rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} -sniffio = "*" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" [package.extras] -brotli = ["brotlipy (>=0.7.0,<0.8.0)"] -http2 = ["h2 (>=3.0.0,<4.0.0)"] - -[[package]] -name = "hyperframe" -version = "5.2.0" -description = "HTTP/2 framing layer for Python" -category = "main" -optional = false -python-versions = "*" +docs = ["sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] [[package]] name = "hyperlink" @@ -553,7 +564,7 @@ idna = ">=2.5" [[package]] name = "idna" -version = "3.2" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false @@ -561,7 +572,7 @@ python-versions = ">=3.5" [[package]] name = "imagesize" -version = "1.2.0" +version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" optional = false @@ -569,80 +580,92 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.6.1" +version = "6.1.0" description = "Read metadata from Python packages" -category = "dev" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"] [[package]] name = "importlib-resources" -version = "5.2.0" +version = "5.12.0" description = "Read resources from Python packages" -category = "dev" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] [[package]] name = "incremental" -version = "21.3.0" -description = "A small library that versions your Python projects." +version = "22.10.0" +description = "\"A small library that versions your Python projects.\"" category = "main" optional = false python-versions = "*" [package.extras] +mypy = ["click (>=6.0)", "twisted (>=16.4.0)", "mypy (==0.812)"] scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [[package]] name = "ipykernel" -version = "6.0.1" +version = "6.22.0" description = "IPython Kernel for Jupyter" -category = "main" +category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] -debugpy = ">=1.0.0" +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" ipython = ">=7.23.1" -jupyter-client = "*" -matplotlib-inline = {version = ">=0.1.0,<0.2.0", markers = "platform_system == \"Darwin\""} -tornado = ">=4.2" -traitlets = ">=4.1.0" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=20" +tornado = ">=6.1" +traitlets = ">=5.4.0" [package.extras] -test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "ipyparallel"] +cov = ["coverage", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest-asyncio", "pytest-cov", "pytest-timeout", "pytest (>=7.0)"] [[package]] name = "ipython" -version = "7.25.0" +version = "8.11.0" description = "IPython: Productive Interactive Computing" -category = "main" +category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} @@ -653,51 +676,53 @@ jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pickleshare = "*" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" -traitlets = ">=4.2" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" [package.extras] -all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] -doc = ["Sphinx (>=1.3)"] +all = ["black", "ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.21)", "pandas", "trio"] +black = ["black"] +doc = ["ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] +notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "trio"] [[package]] name = "ipython-genutils" version = "0.2.0" description = "Vestigial utilities from IPython" -category = "main" +category = "dev" optional = false python-versions = "*" [[package]] name = "ipywidgets" -version = "7.6.3" +version = "7.7.4" description = "IPython HTML widgets for Jupyter" category = "dev" optional = false python-versions = "*" [package.dependencies] -ipykernel = ">=4.5.1" ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} -jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} -nbformat = ">=4.2.0" +ipython-genutils = ">=0.2.0,<0.3.0" +jupyterlab-widgets = {version = ">=1.0.0,<3", markers = "python_version >= \"3.6\""} traitlets = ">=4.3.1" -widgetsnbextension = ">=3.5.0,<3.6.0" +widgetsnbextension = ">=3.6.0,<3.7.0" [package.extras] -test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] +test = ["pytest (>=3.6.0)", "pytest-cov", "ipykernel", "mock"] [[package]] name = "itemadapter" -version = "0.2.0" +version = "0.7.0" description = "Common interface for data container classes" category = "main" optional = false @@ -705,7 +730,7 @@ python-versions = ">=3.6" [[package]] name = "itemloaders" -version = "1.0.4" +version = "1.0.6" description = "Base library for scrapy's ItemLoader" category = "main" optional = false @@ -719,17 +744,17 @@ w3lib = ">=1.17.0" [[package]] name = "itsdangerous" -version = "1.1.0" -description = "Various helpers to pass data to untrusted environments and back." +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" [[package]] name = "jedi" -version = "0.18.0" +version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -737,62 +762,53 @@ python-versions = ">=3.6" parso = ">=0.8.0,<0.9.0" [package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx-rtd-theme (==0.4.3)", "sphinx (==1.8.5)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "2.11.3" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "jmespath" -version = "0.10.0" +version = "1.0.1" description = "JSON Matching Expressions" category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "json5" -version = "0.9.6" -description = "A Python implementation of the JSON5 data format." -category = "main" -optional = false -python-versions = "*" - -[package.extras] -dev = ["hypothesis"] +python-versions = ">=3.7" [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.17.3" description = "An implementation of JSON Schema validation for Python" -category = "main" +category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -six = ">=1.11.0" +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" [package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] name = "jupyter-book" -version = "0.11.1" +version = "0.11.3" description = "Jupyter Book: Create an online book with Jupyter Notebooks" category = "dev" optional = false @@ -802,20 +818,19 @@ python-versions = ">=3.6" click = "*" docutils = ">=0.15,<0.17" jsonschema = "*" -jupyterbook-latex = ">=0.3.1,<0.4.0" jupytext = ">=1.8,<1.11" linkify-it-py = ">=1.0.1,<1.1.0" myst-nb = ">=0.12.0,<0.13.0" -nbconvert = "<6" -nbformat = "*" pyyaml = "*" sphinx = ">=2,<4" -sphinx-book-theme = ">=0.1.0,<0.2.0" +sphinx-book-theme = ">=0.1.3,<0.2.0" sphinx-comments = "*" sphinx-copybutton = "*" -sphinx-external-toc = ">=0.2.0,<0.3.0" +sphinx-external-toc = ">=0.2.1,<0.3.0" +sphinx-jupyterbook-latex = ">=0.4.2,<0.5.0" +sphinx-multitoc-numbering = ">=0.1.3,<0.2.0" sphinx-panels = ">=0.5.2,<0.6.0" -sphinx-thebe = ">=0.0.8,<0.1.0" +sphinx-thebe = ">=0.0.10,<0.1.0" sphinx-togglebutton = "*" sphinxcontrib-bibtex = ">=2.2.0,<2.3.0" @@ -827,7 +842,7 @@ testing = ["altair", "beautifulsoup4", "cookiecutter", "coverage", "matplotlib", [[package]] name = "jupyter-cache" -version = "0.4.2" +version = "0.4.3" description = "A defined interface for working with a cache of jupyter notebooks." category = "dev" optional = false @@ -838,85 +853,90 @@ attrs = "*" nbclient = ">=0.2,<0.6" nbdime = "*" nbformat = "*" -sqlalchemy = ">=1.3.12,<1.4.0" +sqlalchemy = ">=1.3.12,<1.5" [package.extras] cli = ["click", "click-completion", "click-log", "tabulate", "pyyaml"] code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] rtd = ["myst-nb (>=0.7,<1.0)", "sphinx-copybutton", "pydata-sphinx-theme"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "matplotlib", "numpy", "sympy", "pandas", "nbformat (>=5.1)"] +testing = ["ipykernel", "coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "matplotlib", "numpy", "sympy", "pandas", "nbformat (>=5.1)"] [[package]] name = "jupyter-client" -version = "6.2.0" +version = "8.1.0" description = "Jupyter protocol implementation and client libraries" -category = "main" +category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" [package.dependencies] -jupyter-core = ">=4.6.0" -nest-asyncio = ">=1.5" -python-dateutil = ">=2.1" -pyzmq = ">=13" -tornado = ">=4.1" -traitlets = "*" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" [package.extras] -doc = ["sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["async-generator", "ipykernel", "ipython", "mock", "pytest-asyncio", "pytest-timeout", "pytest", "mypy", "pre-commit", "jedi (<0.18)"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinx (>=4)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["codecov", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "4.7.1" +version = "5.3.0" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [package.dependencies] -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} -traitlets = "*" +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-server" -version = "1.9.0" +version = "1.15.6" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -anyio = ">=3.1.0,<4" +anyio = ">=3.1.0" argon2-cffi = "*" -ipython-genutils = "*" jinja2 = "*" jupyter-client = ">=6.1.1" jupyter-core = ">=4.6.0" nbconvert = "*" -nbformat = "*" +nbformat = ">=5.2.0" +packaging = "*" prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} pyzmq = ">=17" -requests-unixsocket = "*" Send2Trash = "*" terminado = ">=0.8.3" tornado = ">=6.1.0" -traitlets = ">=4.2.1" +traitlets = ">=5" websocket-client = "*" [package.extras] -test = ["coverage", "pytest", "pytest-cov", "pytest-mock", "requests", "pytest-tornasync", "pytest-console-scripts", "ipykernel"] +test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "pytest-timeout", "requests", "pytest-tornasync", "pytest-console-scripts", "ipykernel"] [[package]] name = "jupyter-server-mathjax" -version = "0.2.3" +version = "0.2.6" description = "MathJax resources as a Jupyter Server Extension." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -jupyter-server = ">=1.1,<2.0" +jupyter-server = ">=1.1" [package.extras] test = ["jupyter-server", "pytest"] @@ -936,68 +956,9 @@ nbconvert = ">=5.5" nbformat = "*" Sphinx = ">=2" -[[package]] -name = "jupyterbook-latex" -version = "0.3.1" -description = "Latex specific features for jupyter book" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} -sphinx = ">=3,<4" - -[package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] -myst = ["myst-nb (>=0.11,<0.13)"] -rtd = ["myst-parser", "sphinx-book-theme"] -testing = ["coverage (<5.0)", "jupyter-book (>=0.11.0a1,<0.12)", "pytest (>=3.6,<4)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions", "sphinx-external-toc (>=0.1.0,<0.3.0)", "sphinxcontrib-bibtex (>=2.2.1,<2.3.0)", "texsoup"] - -[[package]] -name = "jupyterlab" -version = "3.0.16" -description = "JupyterLab computational environment" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -ipython = "*" -jinja2 = ">=2.1" -jupyter-core = "*" -jupyter-server = ">=1.4,<2.0" -jupyterlab-server = ">=2.3,<3.0" -nbclassic = ">=0.2,<1.0" -packaging = "*" -tornado = ">=6.1.0" - -[package.extras] -test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-console-scripts", "pytest-check-links (>=0.5)", "jupyterlab-server[test] (>=2.2,<3.0)", "requests", "requests-cache", "virtualenv", "check-manifest"] - -[[package]] -name = "jupyterlab-server" -version = "2.6.1" -description = "A set of server components for JupyterLab and JupyterLab like applications ." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -babel = "*" -jinja2 = ">=2.10" -json5 = "*" -jsonschema = ">=3.0.1" -jupyter-server = ">=1.4,<2.0" -packaging = "*" -requests = "*" - -[package.extras] -test = ["codecov", "ipykernel", "pytest (>=5.3.2)", "pytest-cov", "jupyter-server", "openapi-core (>=0.13.8,<0.14.0)", "pytest-console-scripts", "strict-rfc3339", "ruamel.yaml", "wheel"] - [[package]] name = "jupyterlab-widgets" -version = "1.0.0" +version = "1.1.3" description = "A JupyterLab extension." category = "dev" optional = false @@ -1034,7 +995,7 @@ six = ">=1.4.1" [[package]] name = "linkify-it-py" -version = "1.0.1" +version = "1.0.3" description = "Links recognition library with FULL unicode support." category = "dev" optional = false @@ -1051,7 +1012,7 @@ test = ["coverage", "pytest", "pytest-cov"] [[package]] name = "lxml" -version = "4.6.3" +version = "4.9.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." category = "main" optional = false @@ -1065,11 +1026,11 @@ source = ["Cython (>=0.29.7)"] [[package]] name = "mako" -version = "1.1.4" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=0.9.2" @@ -1077,6 +1038,7 @@ MarkupSafe = ">=0.9.2" [package.extras] babel = ["babel"] lingua = ["lingua"] +testing = ["pytest"] [[package]] name = "markdown-it-py" @@ -1099,17 +1061,17 @@ testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "matplotlib-inline" -version = "0.1.2" +version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "main" +category = "dev" optional = false python-versions = ">=3.5" @@ -1135,25 +1097,17 @@ testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] name = "mistune" version = "0.8.4" description = "The fastest markdown parser in pure Python" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "msgpack" -version = "1.0.2" -description = "MessagePack (de)serializer." -category = "main" +category = "dev" optional = false python-versions = "*" [[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." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" [[package]] name = "myst-nb" @@ -1206,44 +1160,59 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest [[package]] name = "nbclassic" -version = "0.3.1" -description = "Jupyter Notebook as a Jupyter Server Extension." -category = "main" +version = "0.5.3" +description = "Jupyter Notebook as a Jupyter Server extension." +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -jupyter-server = ">=1.8,<2.0" -notebook = "<7" +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=6.1.1" +jupyter-core = ">=4.6.1" +jupyter-server = ">=1.8" +nbconvert = ">=5" +nbformat = "*" +nest-asyncio = ">=1.5" +notebook-shim = ">=0.1.0" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" [package.extras] -test = ["pytest", "pytest-tornasync", "pytest-console-scripts"] +docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] +json-logging = ["json-logging"] +test = ["pytest", "coverage", "requests", "testpath", "nbval", "pytest-playwright", "pytest-cov", "pytest-jupyter", "pytest-tornasync", "requests-unixsocket"] [[package]] name = "nbclient" -version = "0.5.3" +version = "0.5.13" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7.0" [package.dependencies] -async-generator = "*" jupyter-client = ">=6.1.5" nbformat = ">=5.0" nest-asyncio = "*" -traitlets = ">=4.2" +traitlets = ">=5.0.0" [package.extras] -dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] -test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] +test = ["ipython (<8.0.0)", "ipykernel", "ipywidgets (<8.0.0)", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "xmltodict", "black", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)"] [[package]] name = "nbconvert" version = "5.6.1" description = "Converting Jupyter Notebooks" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -1269,7 +1238,7 @@ test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywid [[package]] name = "nbdime" -version = "3.1.0" +version = "3.1.1" description = "Diff and merge of Jupyter Notebooks" category = "dev" optional = false @@ -1292,37 +1261,37 @@ test = ["pytest (>=3.6)", "pytest-cov", "pytest-timeout", "pytest-tornado", "jup [[package]] name = "nbformat" -version = "5.1.3" +version = "5.8.0" description = "The Jupyter Notebook format" -category = "main" +category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [package.dependencies] -ipython-genutils = "*" -jsonschema = ">=2.4,<2.5.0 || >2.5.0" +fastjsonschema = "*" +jsonschema = ">=2.6" jupyter-core = "*" -traitlets = ">=4.1" +traitlets = ">=5.1" [package.extras] -fast = ["fastjsonschema"] -test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.1" +version = "1.5.6" description = "Patch asyncio to allow nested event loops" -category = "main" +category = "dev" optional = false python-versions = ">=3.5" [[package]] name = "notebook" -version = "6.4.0" +version = "6.5.3" description = "A web-based notebook environment for interactive computing" -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] argon2-cffi = "*" @@ -1331,11 +1300,13 @@ ipython-genutils = "*" jinja2 = "*" jupyter-client = ">=5.3.4" jupyter-core = ">=4.6.1" -nbconvert = "*" +nbclassic = ">=0.4.7" +nbconvert = ">=5" nbformat = "*" +nest-asyncio = ">=1.5" prometheus-client = "*" pyzmq = ">=17" -Send2Trash = ">=1.5.0" +Send2Trash = ">=1.8.0" terminado = ">=0.8.3" tornado = ">=6.1" traitlets = ">=4.2.1" @@ -1343,7 +1314,21 @@ traitlets = ">=4.2.1" [package.extras] docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] json-logging = ["json-logging"] -test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] +test = ["pytest", "coverage", "requests", "testpath", "nbval", "selenium (==4.1.5)", "pytest-cov", "requests-unixsocket"] + +[[package]] +name = "notebook-shim" +version = "0.2.2" +description = "A shim layer for notebook traits and config" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-tornasync"] [[package]] name = "org.webpki.json" @@ -1362,42 +1347,39 @@ resolved_reference = "3d7ef90bf7c740841473877537302feddd229a3e" [[package]] name = "packaging" -version = "21.0" +version = "23.0" description = "Core utilities for Python packages" category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2" +python-versions = ">=3.7" [[package]] name = "pandocfilters" -version = "1.4.3" +version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "parsel" -version = "1.6.0" +version = "1.7.0" description = "Parsel is a library to extract data from HTML and XML using XPath and CSS selectors" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] cssselect = ">=0.9" lxml = "*" -six = ">=1.6.0" +packaging = "*" w3lib = ">=1.19.0" [[package]] name = "parso" -version = "0.8.2" +version = "0.8.3" description = "A Python Parser" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -1407,17 +1389,17 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.8.1" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [[package]] name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "main" +category = "dev" optional = false python-versions = "*" @@ -1428,93 +1410,112 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "main" +category = "dev" optional = false python-versions = "*" [[package]] -name = "pluggy" -version = "0.13.1" -description = "plugin and hook calling mechanisms for python" +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -dev = ["pre-commit", "tox"] +python-versions = ">=3.6" [[package]] -name = "plumbum" -version = "1.7.0" -description = "Plumbum: shell combinators library" -category = "main" +name = "platformdirs" +version = "3.1.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4,>=2.7" - -[package.dependencies] -pypiwin32 = {version = "*", markers = "platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""} +python-versions = ">=3.7" [package.extras] -dev = ["pytest", "pytest-cov", "pytest-mock", "pytest-timeout", "paramiko", "psutil"] -docs = ["recommonmark (>=0.5.0)", "Sphinx (>=3.0.0)", "sphinx-rtd-theme (>=0.5.0)"] -ssh = ["paramiko"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2.1)"] [[package]] -name = "priority" -version = "1.3.0" -description = "A pure-Python implementation of the HTTP/2 priority tree" -category = "main" +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "prometheus-client" -version = "0.11.0" +version = "0.16.0" description = "Python client for the Prometheus monitoring system." -category = "main" +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.extras] twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.19" +version = "3.0.38" description = "Library for building powerful interactive command lines in Python" -category = "main" +category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7.0" [package.dependencies] wcwidth = "*" [[package]] name = "protego" -version = "0.1.16" +version = "0.2.1" description = "Pure-Python robots.txt parser with support for modern conventions" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = "*" + +[[package]] +name = "psutil" +version = "5.9.4" +description = "Cross-platform lib for process and system monitoring in Python." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[package.dependencies] -six = "*" +[package.extras] +test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] [[package]] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "main" +category = "dev" optional = false python-versions = "*" +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +tests = ["pytest"] + [[package]] name = "py" -version = "1.10.0" +version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pyasn1" @@ -1553,7 +1554,7 @@ test = ["pytest"] [[package]] name = "pybtex-docutils" -version = "1.0.0" +version = "1.0.2" description = "A docutils backend for pybtex." category = "dev" optional = false @@ -1565,7 +1566,7 @@ pybtex = ">=0.16" [[package]] name = "pycparser" -version = "2.20" +version = "2.21" description = "C parser in Python" category = "main" optional = false @@ -1573,7 +1574,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydata-sphinx-theme" -version = "0.6.3" +version = "0.7.2" description = "Bootstrap-based Sphinx theme from the PyData community" category = "dev" optional = false @@ -1581,24 +1582,27 @@ python-versions = ">=3.5" [package.dependencies] beautifulsoup4 = "*" -docutils = "<0.17" +docutils = "!=0.17.0" sphinx = "*" [package.extras] -coverage = ["pytest-cov", "codecov", "sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] -test = ["sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] +coverage = ["pytest-cov", "codecov", "sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "sphinx-sitemap", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] +test = ["sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "sphinx-sitemap", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] [[package]] name = "pydispatcher" -version = "2.0.5" -description = "Multi-producer-multi-consumer signal dispatching mechanism" +version = "2.0.7" +description = "Multi-producer multi-consumer in-memory signal dispatch system" category = "main" optional = false python-versions = "*" +[package.extras] +dev = ["tox"] + [[package]] name = "pyee" -version = "8.1.0" +version = "8.2.2" description = "A port of node.js's EventEmitter to python." category = "main" optional = false @@ -1606,27 +1610,14 @@ python-versions = "*" [[package]] name = "pygments" -version = "2.9.0" +version = "2.14.0" description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "pyjnius" -version = "1.3.0" -description = "A Python module to access Java classes as Python classes using JNI." -category = "main" +category = "dev" optional = false -python-versions = "*" - -[package.dependencies] -cython = "*" -six = ">=1.7.0" +python-versions = ">=3.6" [package.extras] -ci = ["coveralls", "pytest-rerunfailures", "setuptools (>=34.4.0)"] -dev = ["pytest", "wheel", "pytest-cov", "pycodestyle"] +plugins = ["importlib-metadata"] [[package]] name = "PyLD" @@ -1656,53 +1647,35 @@ resolved_reference = "db1bb4a80171aa621c7f2b1bdadb74e41351360e" [[package]] name = "pyopenssl" -version = "20.0.1" +version = "23.1.0" description = "Python wrapper module around the OpenSSL library" category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +python-versions = ">=3.6" [package.dependencies] -cryptography = ">=3.2" -six = ">=1.5.2" +cryptography = ">=38.0.0,<41" [package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] test = ["flaky", "pretend", "pytest (>=3.0.1)"] -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pypiwin32" -version = "223" -description = "" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pywin32 = ">=223" - [[package]] name = "pyppeteer" -version = "0.2.5" +version = "1.0.2" description = "Headless chrome/chromium automation library (unofficial port of puppeteer)" category = "main" optional = false -python-versions = ">=3.6.1,<4.0.0" +python-versions = ">=3.7,<4.0" [package.dependencies] appdirs = ">=1.4.3,<2.0.0" +certifi = ">=2021" +importlib-metadata = ">=1.4" pyee = ">=8.1.0,<9.0.0" tqdm = ">=4.42.1,<5.0.0" urllib3 = ">=1.25.8,<2.0.0" -websockets = ">=8.1,<9.0" +websockets = ">=10.0,<11.0" [[package]] name = "pypydispatcher" @@ -1714,15 +1687,15 @@ python-versions = "*" [[package]] name = "pyrsistent" -version = "0.18.0" +version = "0.19.3" description = "Persistent/Functional/Immutable data structures" -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "pytest" -version = "6.2.4" +version = "6.2.5" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -1734,7 +1707,7 @@ attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" +pluggy = ">=0.12,<2.0" py = ">=1.8.2" toml = "*" @@ -1752,17 +1725,9 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" [package.dependencies] six = ">=1.5" -[[package]] -name = "python-editor" -version = "1.0.4" -description = "Programmatically open an editor, capture the result." -category = "main" -optional = false -python-versions = "*" - [[package]] name = "python-magic" -version = "0.4.24" +version = "0.4.27" description = "File type identification using libmagic" category = "main" optional = false @@ -1770,170 +1735,162 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pytz" -version = "2021.1" +version = "2022.7.1" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +[[package]] +name = "pytz-deprecation-shim" +version = "0.1.0.post0" +description = "Shims to make deprecation of pytz easier" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} +tzdata = {version = "*", markers = "python_version >= \"3.6\""} + [[package]] name = "pywin32" -version = "301" +version = "305" description = "Python for Window Extensions" -category = "main" +category = "dev" optional = false python-versions = "*" [[package]] name = "pywinpty" -version = "1.1.3" +version = "2.0.10" description = "Pseudo terminal support for Windows from Python." -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "pyyaml" -version = "5.4.1" +version = "6.0" description = "YAML parser and emitter for Python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" [[package]] name = "pyzmq" -version = "22.1.0" +version = "25.0.2" description = "Python bindings for 0MQ" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -py = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "queuelib" -version = "1.6.1" +version = "1.6.2" description = "Collection of persistent (disk-based) and non-persistent (memory-based) queues" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.5" [[package]] name = "regex" -version = "2021.7.6" +version = "2023.3.23" description = "Alternative regular expression module, to replace re." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" [[package]] name = "requests" -version = "2.26.0" +version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - -[[package]] -name = "requests-unixsocket" -version = "0.2.0" -description = "Use requests to talk HTTP via a UNIX domain socket" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=1.1" -urllib3 = ">=1.8" +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" +name = "requests-file" +version = "1.5.1" +description = "File transport adapter for Requests" category = "main" optional = false python-versions = "*" [package.dependencies] -idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} - -[package.extras] -idna2008 = ["idna"] - -[[package]] -name = "rpyc" -version = "5.0.1" -description = "Remote Python Call (RPyC), a transparent and symmetric RPC library" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -plumbum = "*" +requests = ">=1.0.0" +six = "*" [[package]] name = "scrapy" -version = "2.5.0" +version = "2.8.0" description = "A high-level Web Crawling and Web Scraping framework" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -cryptography = ">=2.0" +cryptography = ">=3.4.6" cssselect = ">=0.9.1" -h2 = ">=3.0,<4.0" itemadapter = ">=0.1.0" itemloaders = ">=1.0.1" -lxml = [ - {version = ">=3.5.0", markers = "platform_python_implementation == \"CPython\""}, - {version = ">=4.0.0", markers = "platform_python_implementation == \"PyPy\""}, -] +lxml = ">=4.3.0" +packaging = "*" parsel = ">=1.5.0" protego = ">=0.1.15" PyDispatcher = {version = ">=2.0.5", markers = "platform_python_implementation == \"CPython\""} -pyOpenSSL = ">=16.2.0" +pyOpenSSL = ">=21.0.0" PyPyDispatcher = {version = ">=2.1.0", markers = "platform_python_implementation == \"PyPy\""} queuelib = ">=1.4.2" -service-identity = ">=16.0.0" -Twisted = {version = ">=17.9.0", extras = ["http2"]} +service-identity = ">=18.1.0" +tldextract = "*" +Twisted = ">=18.9.0" w3lib = ">=1.17.0" -"zope.interface" = ">=4.1.3" +"zope.interface" = ">=5.1.0" [[package]] name = "scrapyd" -version = "1.2.1" +version = "1.4.1" description = "A service for running Scrapy spiders, with an HTTP API" category = "main" optional = false python-versions = "*" [package.dependencies] -Scrapy = ">=1.0" -six = "*" -Twisted = ">=8.0" +packaging = "*" +scrapy = ">=2.0.0" +twisted = ">=17.9" +w3lib = "*" +"zope.interface" = "*" + +[package.extras] +docs = ["furo", "sphinx", "sphinx-autobuild"] +test = ["pytest", "pytest-cov", "requests"] [[package]] name = "send2trash" -version = "1.7.1" +version = "1.8.0" description = "Send file to trash natively under Mac OS X, Windows and Linux." -category = "main" +category = "dev" optional = false python-versions = "*" [package.extras] +nativelib = ["pyobjc-framework-cocoa", "pywin32"] +objc = ["pyobjc-framework-cocoa"] win32 = ["pywin32"] [[package]] @@ -1959,7 +1916,7 @@ tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] name = "shortuuid" -version = "1.0.1" +version = "1.0.11" description = "A generator library for concise, unambiguous and URL-safe UUIDs." category = "main" optional = false @@ -1975,23 +1932,23 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "smmap" -version = "4.0.0" +version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "sniffio" -version = "1.2.0" +version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" +category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [[package]] name = "snowballstemmer" -version = "2.1.0" +version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." category = "dev" optional = false @@ -2007,24 +1964,14 @@ python-versions = "^3.8" develop = true [package.dependencies] -CacheControl = "^0.12.6" -click = "^7.1.2" -dateparser = "^1.0.0" -diskcache = "^5.2.1" -dynaconf = "^3.1.4" -Flask = "^1.1.2" -flask_accept = "^0.0.6" -Flask-Cors = "^3.0.10" -httpx = "^0.16.1" -jupyterlab = "^3.0.9" -"org.webpki.json" = "*" -pyjnius = "^1.3.0" -pyld = "tag 2.0.4-dev_ddv-0.1" -pyppeteer = "^0.2.5" -requests = "^2.25.0" -rpyc = "^5.0.1" -shortuuid = "^1.0.1" -uWSGI = "^2.0.19" +click = "^8.1.3" +dateparser = "^1.1.1" +diskcache = "^5.4.0" +dynaconf = "^3.1.9" +pyld = {git = "https://github.com/datadavev/pyld.git", tag = "2.0.4-dev_ddv-0.1"} +pyppeteer = "^1.0.2" +requests = "^2.28.1" +shortuuid = "^1.0.9" [package.extras] docs = [] @@ -2035,11 +1982,11 @@ url = "../sonormal" [[package]] name = "soupsieve" -version = "2.2.1" +version = "2.4" description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "sphinx" @@ -2074,25 +2021,24 @@ test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] name = "sphinx-book-theme" -version = "0.1.0" -description = "Jupyter Book: Create an online book with Jupyter Notebooks" +version = "0.1.10" +description = "A clean book theme for scientific explanations and documentation with Sphinx" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] beautifulsoup4 = ">=4.6.1,<5" -click = "*" -docutils = ">=0.15" -pydata-sphinx-theme = ">=0.6.0,<0.7.0" +docutils = ">=0.15,<0.17" +pydata-sphinx-theme = ">=0.7.2,<0.8.0" pyyaml = "*" -sphinx = ">=2,<4" +sphinx = ">=3,<5" [package.extras] code_style = ["pre-commit (>=2.7.0,<2.8.0)"] live-dev = ["sphinx-autobuild", "web-compile (>=0.2.1,<0.3.0)"] -sphinx = ["folium", "numpy", "matplotlib", "ipywidgets", "pandas", "nbclient", "myst-nb (>=0.11.1,<0.12.0)", "sphinx-togglebutton (>=0.2.1)", "sphinx-copybutton", "plotly", "sphinxcontrib-bibtex (>=2.2,<3.0)", "sphinx-thebe", "ablog (>=0.10.13,<0.11.0)", "sphinxext-opengraph"] -testing = ["myst-nb (>=0.11.1,<0.12.0)", "sphinx-thebe", "coverage", "pytest (>=6.0.1,<6.1.0)", "pytest-cov", "pytest-regressions (>=2.0.1,<2.1.0)"] +sphinx = ["ablog (>=0.10.13,<0.11.0)", "ipywidgets", "folium", "numpy", "matplotlib", "myst-nb (>=0.13,<1.0)", "nbclient", "pandas", "plotly", "sphinx (>=4.0,<5.0)", "sphinx-design", "sphinx-copybutton", "sphinx-togglebutton (>=0.2.1)", "sphinx-thebe", "sphinxcontrib-bibtex (>=2.2,<3.0)", "sphinxext-opengraph"] +testing = ["coverage", "myst-nb (>=0.13,<1.0)", "pytest (>=6.0.1,<6.1.0)", "pytest-cov", "pytest-regressions (>=2.0.1,<2.1.0)", "sphinx-thebe"] [[package]] name = "sphinx-comments" @@ -2112,30 +2058,30 @@ testing = ["beautifulsoup4", "myst-parser", "pytest", "pytest-regressions", "sph [[package]] name = "sphinx-copybutton" -version = "0.4.0" +version = "0.5.1" description = "Add a copy button to each of your code cells." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] sphinx = ">=1.8" [package.extras] code_style = ["pre-commit (==2.12.1)"] -rtd = ["sphinx", "ipython", "sphinx-book-theme"] +rtd = ["sphinx", "ipython", "myst-nb", "sphinx-book-theme", "sphinx-examples"] [[package]] name = "sphinx-external-toc" -version = "0.2.2" +version = "0.2.4" description = "A sphinx extension that allows the site-map to be defined in a single YAML file." category = "dev" optional = false python-versions = "~=3.6" [package.dependencies] -attrs = ">=19.2,<22" -click = ">=7.1,<8.0" +attrs = ">=20.3,<22" +click = ">=7.1,<9" pyyaml = "*" sphinx = ">=3,<5" @@ -2144,6 +2090,40 @@ code_style = ["pre-commit (>=2.12,<3.0)"] rtd = ["myst-parser (>=0.15.0,<0.16.0)", "sphinx-book-theme (>=0.0.36)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] +[[package]] +name = "sphinx-jupyterbook-latex" +version = "0.4.7" +description = "Latex specific features for jupyter book" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +sphinx = ">=3,<5" + +[package.extras] +code_style = ["pre-commit (>=2.12,<3.0)"] +myst = ["myst-nb (>=0.13,<0.14)"] +rtd = ["myst-parser", "sphinx-book-theme", "sphinx-design", "sphinx-jupyterbook-latex"] +testing = ["coverage (<5.0)", "myst-nb (>=0.13,<0.14)", "pytest (>=3.6,<4)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions", "sphinx-external-toc (>=0.1.0,<0.3.0)", "sphinxcontrib-bibtex (>=2.2.1,<2.3.0)", "texsoup"] + +[[package]] +name = "sphinx-multitoc-numbering" +version = "0.1.3" +description = "Supporting continuous HTML section numbering" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +sphinx = ">=3" + +[package.extras] +code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] +rtd = ["sphinx (>=3.0)", "sphinx-book-theme", "myst-parser"] +testing = ["pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "coverage (<5.0)", "pytest-regressions", "jupyter-book"] + [[package]] name = "sphinx-panels" version = "0.5.2" @@ -2164,14 +2144,14 @@ themes = ["sphinx-rtd-theme", "pydata-sphinx-theme (>=0.4.0,<0.5.0)", "sphinx-bo [[package]] name = "sphinx-thebe" -version = "0.0.8" +version = "0.0.10" description = "Integrate interactive code blocks into your documentation with Thebe and Binder." category = "dev" optional = false python-versions = "*" [package.dependencies] -sphinx = ">=1.8" +sphinx = ">=3.5,<5" [package.extras] sphinx = ["myst-parser", "sphinx-book-theme", "jupyter-sphinx", "sphinx-panels"] @@ -2194,11 +2174,11 @@ sphinx = ["myst-nb", "sphinx-book-theme"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -2240,11 +2220,11 @@ python-versions = ">=3.6" [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.0" +version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -2298,50 +2278,93 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.3.24" +version = "1.4.47" description = "Database Abstraction Library" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} [package.extras] +aiomysql = ["greenlet (!=0.4.17)", "aiomysql"] +aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"] +mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"] mssql = ["pyodbc"] mssql_pymssql = ["pymssql"] mssql_pyodbc = ["pyodbc"] -mysql = ["mysqlclient"] -oracle = ["cx-oracle"] -postgresql = ["psycopg2"] -postgresql_pg8000 = ["pg8000 (<1.16.6)"] +mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"] +mysql_connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"] +postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] postgresql_psycopg2binary = ["psycopg2-binary"] postgresql_psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql (<1)", "pymysql"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] [[package]] name = "terminado" -version = "0.10.1" +version = "0.17.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] ptyprocess = {version = "*", markers = "os_name != \"nt\""} pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=4" +tornado = ">=6.1.0" [package.extras] -test = ["pytest"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest-timeout", "pytest (>=7.0)"] [[package]] name = "testpath" -version = "0.5.0" +version = "0.6.0" description = "Test utilities for code working with files and commands" -category = "main" +category = "dev" optional = false python-versions = ">= 3.5" [package.extras] -test = ["pytest", "pathlib2"] +test = ["pytest"] + +[[package]] +name = "tldextract" +version = "3.4.0" +description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +filelock = ">=3.0.8" +idna = "*" +requests = ">=2.1.0" +requests-file = ">=1.4" [[package]] name = "toml" @@ -2353,19 +2376,19 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tornado" -version = "6.1" +version = "6.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" +category = "dev" optional = false -python-versions = ">= 3.5" +python-versions = ">= 3.7" [[package]] name = "tqdm" -version = "4.61.2" +version = "4.65.0" description = "Fast, Extensible Progress Meter" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -2373,58 +2396,59 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "traitlets" -version = "5.0.5" +version = "5.9.0" description = "Traitlets Python configuration system" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" -[package.dependencies] -ipython-genutils = "*" - [package.extras] -test = ["pytest"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "twisted" -version = "21.2.0" +version = "22.10.0" description = "An asynchronous networking framework written in Python" category = "main" optional = false -python-versions = ">=3.5.4" +python-versions = ">=3.7.1" [package.dependencies] attrs = ">=19.2.0" Automat = ">=0.8.0" constantly = ">=15.1" -h2 = {version = ">=3.0,<4.0", optional = true, markers = "extra == \"http2\""} hyperlink = ">=17.1.1" -incremental = ">=16.10.1" -priority = {version = ">=1.1.0,<2.0", optional = true, markers = "extra == \"http2\""} -twisted-iocpsupport = {version = ">=1.0.0,<1.1.0", markers = "platform_system == \"Windows\""} +incremental = ">=21.3.0" +twisted-iocpsupport = {version = ">=1.0.2,<2", markers = "platform_system == \"Windows\""} +typing-extensions = ">=3.6.5" "zope.interface" = ">=4.4.2" [package.extras] -all_non_platform = ["cython-test-exception-raiser (>=1.0,<2.0)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<4.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +all_non_platform = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] conch = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)"] +conch_nacl = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pynacl"] contextvars = ["contextvars (>=2.4,<3)"] -dev = ["towncrier (>=17.4.0)", "sphinx-rtd-theme (>=0.5.0,<0.6.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=3.3,<4.0)", "pyflakes (>=1.0.0)", "python-subunit", "twistedchecker (>=0.7.2)", "pydoctor (>=20.12.1)"] -dev_release = ["towncrier (>=17.4.0)", "sphinx-rtd-theme (>=0.5.0,<0.6.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=3.3,<4.0)", "pydoctor (>=20.12.1)"] -http2 = ["h2 (>=3.0,<4.0)", "priority (>=1.1.0,<2.0)"] -macos_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0,<2.0)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<4.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] -osx_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0,<2.0)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<4.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +dev = ["towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "python-subunit (>=1.4,<2.0)"] +dev_release = ["towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)"] +gtk_platform = ["pygobject", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +http2 = ["h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)"] +macos_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +mypy = ["mypy (==0.930)", "mypy-zope (==0.3.4)", "types-setuptools", "types-pyopenssl", "towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pynacl", "pywin32 (!=226)", "python-subunit (>=1.4,<2.0)", "contextvars (>=2.4,<3)"] +osx_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] -test = ["cython-test-exception-raiser (>=1.0,<2.0)", "PyHamcrest (>=1.9.0)"] -tls = ["pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)"] -windows_platform = ["pywin32 (!=226)", "cython-test-exception-raiser (>=1.0,<2.0)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<4.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +test = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)"] +tls = ["pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)"] +windows_platform = ["pywin32 (!=226)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] [[package]] name = "twisted-iocpsupport" -version = "1.0.1" +version = "1.0.2" description = "An extension for use in the twisted I/O Completion Ports reactor." category = "main" optional = false @@ -2432,30 +2456,43 @@ python-versions = "*" [[package]] name = "typed-ast" -version = "1.4.3" +version = "1.5.4" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "typing-extensions" -version = "3.10.0.0" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" + +[[package]] +name = "tzdata" +version = "2023.2" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" [[package]] name = "tzlocal" -version = "2.1" +version = "4.3" description = "tzinfo object for the local timezone" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] -pytz = "*" +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +pytz-deprecation-shim = "*" +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest-cov", "pytest-mock (>=3.3)", "pytest (>=4.3)", "zest.releaser"] [[package]] name = "uc-micro-py" @@ -2470,20 +2507,20 @@ test = ["coverage", "pytest", "pytest-cov"] [[package]] name = "urllib3" -version = "1.26.6" +version = "1.26.15" 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.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uwsgi" -version = "2.0.19.1" +version = "2.0.21" description = "The uWSGI server" category = "main" optional = false @@ -2491,31 +2528,28 @@ python-versions = "*" [[package]] name = "w3lib" -version = "1.22.0" +version = "2.1.1" description = "Library of web-related functions" category = "main" optional = false -python-versions = "*" - -[package.dependencies] -six = ">=1.4.1" +python-versions = ">=3.7" [[package]] name = "watchdog" -version = "2.1.3" +version = "2.3.1" description = "Filesystem events monitoring" category = "dev" optional = false python-versions = ">=3.6" [package.extras] -watchmedo = ["PyYAML (>=3.10)", "argh (>=0.24.1)"] +watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.5" +version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -2523,41 +2557,48 @@ python-versions = "*" name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" +category = "dev" optional = false python-versions = "*" [[package]] name = "websocket-client" -version = "1.1.0" +version = "1.5.1" description = "WebSocket client for Python with low level API options" -category = "main" +category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" + +[package.extras] +docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] [[package]] name = "websockets" -version = "8.1" +version = "10.4" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [[package]] name = "werkzeug" -version = "1.0.1" +version = "2.2.3" description = "The comprehensive WSGI web application library." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.1.1" [package.extras] -dev = ["pytest", "pytest-timeout", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinx-issues"] watchdog = ["watchdog"] [[package]] name = "widgetsnbextension" -version = "3.5.1" +version = "3.6.3" description = "IPython HTML widgets for Jupyter" category = "dev" optional = false @@ -2568,23 +2609,23 @@ notebook = ">=4.4.1" [[package]] name = "zipp" -version = "3.5.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] [[package]] name = "zope.interface" -version = "5.4.0" +version = "6.0" description = "Interfaces for Python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [package.extras] docs = ["sphinx", "repoze.sphinx.autointerface"] @@ -2594,1414 +2635,203 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7d4688dfd5d38e3666cc39c097e1b00a8a21782af2bd525e373f6694e6bbf383" +content-hash = "d9995c629c47a3dfba384bac0744b20da958ae7a66637d42086f1a3ce43a247d" [metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -alembic = [ - {file = "alembic-1.6.5-py2.py3-none-any.whl", hash = "sha256:e78be5b919f5bb184e3e0e2dd1ca986f2362e29a2bc933c446fe89f39dbe4e9c"}, - {file = "alembic-1.6.5.tar.gz", hash = "sha256:a21fedebb3fb8f6bbbba51a11114f08c78709377051384c9c5ead5705ee93a51"}, -] -anyio = [ - {file = "anyio-3.2.1-py3-none-any.whl", hash = "sha256:442678a3c7e1cdcdbc37dcfe4527aa851b1b0c9162653b516e9f509821691d50"}, - {file = "anyio-3.2.1.tar.gz", hash = "sha256:07968db9fa7c1ca5435a133dc62f988d84ef78e1d9b22814a59d1c62618afbc5"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -appnope = [ - {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, - {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, -] -argh = [ - {file = "argh-0.26.2-py2.py3-none-any.whl", hash = "sha256:a9b3aaa1904eeb78e32394cd46c6f37ac0fb4af6dc488daa58971bdc7d7fcaf3"}, - {file = "argh-0.26.2.tar.gz", hash = "sha256:e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65"}, -] -argon2-cffi = [ - {file = "argon2-cffi-20.1.0.tar.gz", hash = "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-win32.whl", hash = "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc"}, - {file = "argon2_cffi-20.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe"}, - {file = "argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647"}, - {file = "argon2_cffi-20.1.0-cp35-cp35m-win32.whl", hash = "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361"}, - {file = "argon2_cffi-20.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b"}, - {file = "argon2_cffi-20.1.0-cp36-cp36m-win32.whl", hash = "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496"}, - {file = "argon2_cffi-20.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa"}, - {file = "argon2_cffi-20.1.0-cp37-abi3-macosx_10_6_intel.whl", hash = "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b"}, - {file = "argon2_cffi-20.1.0-cp37-cp37m-win32.whl", hash = "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5"}, - {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"}, - {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"}, - {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"}, - {file = "argon2_cffi-20.1.0-cp39-cp39-win32.whl", hash = "sha256:e2db6e85c057c16d0bd3b4d2b04f270a7467c147381e8fd73cbbe5bc719832be"}, - {file = "argon2_cffi-20.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a84934bd818e14a17943de8099d41160da4a336bcc699bb4c394bbb9b94bd32"}, -] -async-generator = [ - {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, - {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, -] -automat = [ - {file = "Automat-20.2.0-py2.py3-none-any.whl", hash = "sha256:b6feb6455337df834f6c9962d6ccf771515b7d939bca142b29c20c2376bc6111"}, - {file = "Automat-20.2.0.tar.gz", hash = "sha256:7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33"}, -] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.9.3-py2-none-any.whl", hash = "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35"}, - {file = "beautifulsoup4-4.9.3-py3-none-any.whl", hash = "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666"}, - {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"}, -] -black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, -] -bleach = [ - {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, - {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, -] -cachecontrol = [ - {file = "CacheControl-0.12.6-py2.py3-none-any.whl", hash = "sha256:10d056fa27f8563a271b345207402a6dcce8efab7e5b377e270329c62471b10d"}, - {file = "CacheControl-0.12.6.tar.gz", hash = "sha256:be9aa45477a134aee56c8fac518627e1154df063e85f67d4f83ce0ccc23688e8"}, -] -cachetools = [ - {file = "cachetools-4.2.2-py3-none-any.whl", hash = "sha256:2cc0b89715337ab6dbba85b5b50effe2b0c74e035d83ee8ed637cf52f12ae001"}, - {file = "cachetools-4.2.2.tar.gz", hash = "sha256:61b5ed1e22a0924aed1d23b478f37e8d52549ff8a961de2909c69bf950020cff"}, -] -certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, -] -cffi = [ - {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, - {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, - {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, - {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, - {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, - {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, - {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, - {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, - {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, - {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, - {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, - {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, - {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, - {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, - {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, - {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, - {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, - {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, - {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.1.tar.gz", hash = "sha256:ad0da505736fc7e716a8da15bf19a985db21ac6415c26b34d2fafd3beb3d927e"}, - {file = "charset_normalizer-2.0.1-py3-none-any.whl", hash = "sha256:b68b38179052975093d71c1b5361bf64afd80484697c1f27056e50593e695ceb"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -constantly = [ - {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, - {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, -] -cryptography = [ - {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, - {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, - {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, - {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, - {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, -] -cssselect = [ - {file = "cssselect-1.1.0-py2.py3-none-any.whl", hash = "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf"}, - {file = "cssselect-1.1.0.tar.gz", hash = "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc"}, -] -cython = [ - {file = "Cython-0.29.24-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:6a2cf2ccccc25413864928dfd730c29db6f63eaf98206c1e600003a445ca7f58"}, - {file = "Cython-0.29.24-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b28f92e617f540d3f21f8fd479a9c6491be920ffff672a4c61b7fc4d7f749f39"}, - {file = "Cython-0.29.24-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:37bcfa5df2a3009f49624695d917c3804fccbdfcdc5eda6378754a879711a4d5"}, - {file = "Cython-0.29.24-cp27-cp27m-win32.whl", hash = "sha256:9164aeef1af6f837e4fc20402a31d256188ba4d535e262c6cb78caf57ad744f8"}, - {file = "Cython-0.29.24-cp27-cp27m-win_amd64.whl", hash = "sha256:73ac33a4379056a02031baa4def255717fadb9181b5ac2b244792d53eae1c925"}, - {file = "Cython-0.29.24-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:09ac3087ac7a3d489ebcb3fb8402e00c13d1a3a1c6bc73fd3b0d756a3e341e79"}, - {file = "Cython-0.29.24-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:774cb8fd931ee1ba52c472bc1c19077cd6895c1b24014ae07bb27df59aed5ebe"}, - {file = "Cython-0.29.24-cp34-cp34m-win32.whl", hash = "sha256:5dd56d0be50073f0e54825a8bc3393852de0eed126339ecbca0ae149dba55cfc"}, - {file = "Cython-0.29.24-cp34-cp34m-win_amd64.whl", hash = "sha256:88dc3c250dec280b0489a83950b15809762e27232f4799b1b8d0bad503f5ab84"}, - {file = "Cython-0.29.24-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:5fa12ebafc2f688ea6d26ab6d1d2e634a9872509ba7135b902bb0d8b368fb04b"}, - {file = "Cython-0.29.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:60c958bcab0ff315b4036a949bed1c65334e1f6a69e17e9966d742febb59043a"}, - {file = "Cython-0.29.24-cp35-cp35m-win32.whl", hash = "sha256:166f9f29cd0058ce1a14a7b3a2458b849ed34b1ec5fd4108af3fdd2c24afcbb0"}, - {file = "Cython-0.29.24-cp35-cp35m-win_amd64.whl", hash = "sha256:76cbca0188d278e93d12ebdaf5990678e6e436485fdfad49dbe9b07717d41a3c"}, - {file = "Cython-0.29.24-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f2e9381497b12e8f622af620bde0d1d094035d79b899abb2ddd3a7891f535083"}, - {file = "Cython-0.29.24-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d8d1a087f35e39384303f5e6b75d465d6f29d746d7138eae9d3b6e8e6f769eae"}, - {file = "Cython-0.29.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:112efa54a58293a4fb0acf0dd8e5b3736e95b595eee24dd88615648e445abe41"}, - {file = "Cython-0.29.24-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cf4452f0e4d50e11701bca38f3857fe6fa16593e7fd6a4d5f7be66f611b7da2"}, - {file = "Cython-0.29.24-cp36-cp36m-win32.whl", hash = "sha256:854fe2193d3ad4c8b61932ff54d6dbe10c5fa8749eb8958d72cc0ab28243f833"}, - {file = "Cython-0.29.24-cp36-cp36m-win_amd64.whl", hash = "sha256:84826ec1c11cda56261a252ddecac0c7d6b02e47e81b94f40b27b4c23c29c17c"}, - {file = "Cython-0.29.24-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ade74eece909fd3a437d9a5084829180751d7ade118e281e9824dd75eafaff2"}, - {file = "Cython-0.29.24-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0a142c6b862e6ed6b02209d543062c038c110585b5e32d1ad7c9717af4f07e41"}, - {file = "Cython-0.29.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:10cb3def9774fa99e4583617a5616874aed3255dc241fd1f4a3c2978c78e1c53"}, - {file = "Cython-0.29.24-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f41ef7edd76dd23315925e003f0c58c8585f3ab24be6885c4b3f60e77c82746"}, - {file = "Cython-0.29.24-cp37-cp37m-win32.whl", hash = "sha256:821c2d416ad7d006b069657ee1034c0e0cb45bdbe9ab6ab631e8c495dfcfa4ac"}, - {file = "Cython-0.29.24-cp37-cp37m-win_amd64.whl", hash = "sha256:2d9e61ed1056a3b6a4b9156b62297ad18b357a7948e57a2f49b061217696567e"}, - {file = "Cython-0.29.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b0ee28c2c8118bfb3ad9b25cf7a6cbd724e442ea96956e32ccd908d5e3e043"}, - {file = "Cython-0.29.24-cp38-cp38-manylinux1_i686.whl", hash = "sha256:eb2843f8cc01c645725e6fc690a84e99cdb266ce8ebe427cf3a680ff09f876aa"}, - {file = "Cython-0.29.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:661dbdea519d9cfb288867252b75fef73ffa8e8bb674cec27acf70646afb369b"}, - {file = "Cython-0.29.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc05de569f811be1fcfde6756c9048ae518f0c4b6d9f8f024752c5365d934cac"}, - {file = "Cython-0.29.24-cp38-cp38-win32.whl", hash = "sha256:a102cfa795c6b3b81a29bdb9dbec545367cd7f353c03e6f30a056fdfefd92854"}, - {file = "Cython-0.29.24-cp38-cp38-win_amd64.whl", hash = "sha256:416046a98255eff97ec02077d20ebeaae52682dfca1c35aadf31260442b92514"}, - {file = "Cython-0.29.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ad43e684ade673565f6f9d6638015112f6c7f11aa2a632167b79014f613f0f5f"}, - {file = "Cython-0.29.24-cp39-cp39-manylinux1_i686.whl", hash = "sha256:afb521523cb46ddaa8d269b421f88ea2731fee05e65b952b96d4db760f5a2a1c"}, - {file = "Cython-0.29.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0d414458cb22f8a90d64260da6dace5d5fcebde43f31be52ca51f818c46db8cb"}, - {file = "Cython-0.29.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cb87777e82d1996aef6c146560a19270684271c9c669ba62ac6803b3cd2ff82"}, - {file = "Cython-0.29.24-cp39-cp39-win32.whl", hash = "sha256:91339ee4b465924a3ea4b2a9cec7f7227bc4cadf673ce859d24c2b9ef60b1214"}, - {file = "Cython-0.29.24-cp39-cp39-win_amd64.whl", hash = "sha256:5fb977945a2111f6b64501fdf7ed0ec162cc502b84457fd648d6a558ea8de0d6"}, - {file = "Cython-0.29.24-py2.py3-none-any.whl", hash = "sha256:f96411f0120b5cae483923aaacd2872af8709be4b46522daedc32f051d778385"}, - {file = "Cython-0.29.24.tar.gz", hash = "sha256:cdf04d07c3600860e8c2ebaad4e8f52ac3feb212453c1764a49ac08c827e8443"}, -] -dateparser = [ - {file = "dateparser-1.0.0-py2.py3-none-any.whl", hash = "sha256:17202df32c7a36e773136ff353aa3767e987f8b3e27374c39fd21a30a803d6f8"}, - {file = "dateparser-1.0.0.tar.gz", hash = "sha256:159cc4e01a593706a15cd4e269a0b3345edf3aef8bf9278a57dac8adf5bf1e4a"}, -] -debugpy = [ - {file = "debugpy-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:54109c9cbce8e96986a943812de8536d001130bce27d1a370b0c39bc7d6ef619"}, - {file = "debugpy-1.3.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cd3e74f465bb71122481c27688cf09a3dd13fae18df30abfd51e513811fc7873"}, - {file = "debugpy-1.3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:98c76193a924baddfbffd329a03d9d5722b0ea86a777db40263f257555ab0dba"}, - {file = "debugpy-1.3.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:313bcd88d40a65a6a9032ecd3aa83099f759839ec80677bac70285aa025112ba"}, - {file = "debugpy-1.3.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:1478532ed5d29626cf2acbe58213a22ce6d86af9b57716d2e4824a5ae750418b"}, - {file = "debugpy-1.3.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:0c017a26a489cf6c57fd9a51ec33718275d15cbb19cc29097e7efb0492a1def4"}, - {file = "debugpy-1.3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d53e7b8dba67b390b43d891fd5459c49499fb274748ced89cada1f7dad95c414"}, - {file = "debugpy-1.3.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:dd1f907b2ea8b57dd26c315bd5c907a147f9b5f28ffec092c2572cab6d57e332"}, - {file = "debugpy-1.3.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ca653751aa728cf620c8fddc9c6200511fcc2e7d0a6ed615d246fdca1df5201"}, - {file = "debugpy-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:de92459af4b0079437fae79f10469488ef1566942028847e4bac780e079a5a88"}, - {file = "debugpy-1.3.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:996439d56a0a2f38ea2c0a4d88874a56815585120a3dedd03422b1e3678875f1"}, - {file = "debugpy-1.3.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a696ac566adc8b6aca3e7eb3bd2bd7b71d61f4721f42bf2e504f4166769ea4d3"}, - {file = "debugpy-1.3.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:04b6730cc4149d3fd947e351e8a2cf18cd31fd4c8ba46872921dd54c4eee2acc"}, - {file = "debugpy-1.3.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:81cfd83a911b454c36b677d0bc722c35acd978e1856d5550e71c1226af9c143c"}, - {file = "debugpy-1.3.0-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:e6f344db72fa9773ab52a1f527bb1b517e8426a13611a68aae5db587d1996bc1"}, - {file = "debugpy-1.3.0-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:c28a4a74082bf7c06553e5002ad505d4119d0b4425a70570368082bcb222d8f2"}, - {file = "debugpy-1.3.0-cp35-cp35m-win32.whl", hash = "sha256:37d06369b46d2013768494cf18e0568834d89ba52698a695358d12411ac9cf65"}, - {file = "debugpy-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0777fff5d8ce086383bbb6017ab7a4300f29c02565aa72a4533f0c815898d44b"}, - {file = "debugpy-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e658b89c9e3eab39bbbe56d3e086ffc0b3266817788cb5aa6669f194620b3951"}, - {file = "debugpy-1.3.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:61c6c77b3ea3098dfd78f2ff4ce27565145a293af995f817f2475d02a2145b6d"}, - {file = "debugpy-1.3.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fab455f6c811f98f3d669b23eb99623200929eef9c0a8a8f1052aeba89346f93"}, - {file = "debugpy-1.3.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:91ff6c5ea619a0a3bfdc49587d2f05198c1849d8888632f96d2f855e4e88a21a"}, - {file = "debugpy-1.3.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:709bc213b0b31665e00a3547cb92b2760b948b6473dbd56fe0a5ff1fa1202e80"}, - {file = "debugpy-1.3.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:813075f9ff6795187417109fff11819b23a92169b98b56837d2a9c06eb81f15e"}, - {file = "debugpy-1.3.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:d15b0be81c9a448346ed0a7c19d9c88f60ccfb53f66e5e4ec99320d9dcd4fe4e"}, - {file = "debugpy-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:1b7929baf506d897d170adbb9a99b83b6453acb2d7b10780eb46cb697522529c"}, - {file = "debugpy-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:062b87923f78636217617c8de2c16c9846612f30d12f3b51c0eb194739963003"}, - {file = "debugpy-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:231851bec777e210cebb247b8a57ae35d4bc213b190b05d95556e52a0a765ccf"}, - {file = "debugpy-1.3.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a332717a0778d55ca4629fb0b4a016affa06151a9822af940552497a77aac7ce"}, - {file = "debugpy-1.3.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcdffa215de49033aac273facbc4c2413a137b6e2b6694ac7ae04a88f38e4eba"}, - {file = "debugpy-1.3.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:33ce42e58977d811d974a1f30352d2822a0f2e7160f0e6211753da3027fcf442"}, - {file = "debugpy-1.3.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:71f634cf1eb52c825a000300e031c52e789337754237745a4d31560ce0041c9c"}, - {file = "debugpy-1.3.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:8e26ce355631f80f044bf0c97fd2d8db0b83b43b6fa8abac956108e58c79f522"}, - {file = "debugpy-1.3.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:72c3cb415cdf42c7ff26ee2aebe3095bc136ed3065d1f60d76feebe47b1980a6"}, - {file = "debugpy-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:9b4304cc2ddedcefdc7ac0d6499a246aff6c981b58bfbd89f4103c0584e200e5"}, - {file = "debugpy-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bd307ceabb2b17328e84cc0416bd6c0181de78d4f920510017f4fc7590afc2d9"}, - {file = "debugpy-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b3e2d0256736e77acfa1c05c35ed0f7b00a17a7d7da45e47d0705c5a2fc31256"}, - {file = "debugpy-1.3.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de28c434abb8179b05afaa8a0447fff36980f397ef6c64a6c825a26c5258b67f"}, - {file = "debugpy-1.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9c858b3bc1a28b30d06df0bdb02a7a5e7a146f986b0d5e4c438cc1940d121bce"}, - {file = "debugpy-1.3.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:028fd23004a4f86e37767efa1c285ee74ee2c5cd9b02f9dff62be0ce17429ad9"}, - {file = "debugpy-1.3.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:068db6d85b69500f76fb28ac2b8d6dcedb6d9e405fbffb39489651eb56e793f0"}, - {file = "debugpy-1.3.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0ba4dd246588740f17725841be08c7368c1f2df706bb65dd85998c5809809c8e"}, - {file = "debugpy-1.3.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:2a8246403058457e8f777853af52a61402cf8596d6b9442de1112038495b5603"}, - {file = "debugpy-1.3.0-cp38-cp38-win32.whl", hash = "sha256:d678f48f2fd14716839e7e5b560eacbebddb0cc95832998dd020010e20a1cd9e"}, - {file = "debugpy-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a1df03e909e8b3f9eb45e2d3495e290df8fe9df1b903957b144125635b5ecf6"}, - {file = "debugpy-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7cd804d531e6c932ffb87766746bca111c9470b6c7877340df9ed3edd66d7c7c"}, - {file = "debugpy-1.3.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5f7aeae9c8d7b77d8bad23d82723585949d4ef32fc4eb769e28f1d33319a28b0"}, - {file = "debugpy-1.3.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a24d65a295875d6f7b063bbc100240523537aff3380d33c1205819ebf213e340"}, - {file = "debugpy-1.3.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:63acc9e755c1ae426c223b0596ac098b773a633091121c997086b7bd50faa1e0"}, - {file = "debugpy-1.3.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:4558ac356f3a6d46d3b3fb92bf4c053b87fd3903cf4022f10425e811c62a0514"}, - {file = "debugpy-1.3.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d1254de50f25623df4ff90512f4dd5734874438680f6ad284daa9af1c622f504"}, - {file = "debugpy-1.3.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:29252f8253b1cbd5a4786d41d0d44835bd8152f910af109a48eebf1d0b66a40c"}, - {file = "debugpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:9c3cb1f0324dcaf5e1dcc64013dbe959112724c8f58a558fc804741a54a90f14"}, - {file = "debugpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:68905f3bc59b7d903724e040f80bd89c9d649d67473f09d6912908a4c46f971e"}, - {file = "debugpy-1.3.0-py2.py3-none-any.whl", hash = "sha256:8e3002cfb2ebf570f19fd060950e459a071630f6767f7e44804ac5a67ef57baf"}, - {file = "debugpy-1.3.0.zip", hash = "sha256:71ab9068e87a28cfbb7a7db041a946ac5493d45d0c61280021af038e14a64232"}, -] -decorator = [ - {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, - {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, -] -defusedxml = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] -diskcache = [ - {file = "diskcache-5.2.1-py3-none-any.whl", hash = "sha256:6e8137c778fd2752b93c8a8f944e939b3665d645b46774d8537dd3528ac3baa1"}, - {file = "diskcache-5.2.1.tar.gz", hash = "sha256:1805acd5868ac10ad547208951a1190a0ab7bbff4e70f9a07cde4dbdfaa69f64"}, -] -docutils = [ - {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, - {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, -] -dynaconf = [ - {file = "dynaconf-3.1.4-py2.py3-none-any.whl", hash = "sha256:e6f383b84150b70fc439c8b2757581a38a58d07962aa14517292dcce1a77e160"}, - {file = "dynaconf-3.1.4.tar.gz", hash = "sha256:b2f472d83052f809c5925565b8a2ba76a103d5dc1dbb9748b693ed67212781b9"}, -] -entrypoints = [ - {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, - {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, -] -flask = [ - {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, - {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, -] -flask-accept = [ - {file = "flask_accept-0.0.6-py3-none-any.whl", hash = "sha256:4be4c34aa0a13bb56427e45426297858e3d189bebac415b88694e6489f61d1e0"}, - {file = "flask_accept-0.0.6.tar.gz", hash = "sha256:be48f7d805f1a9dadeabce0fd166404eda92da8d2cf1945237aff278238f4c70"}, -] -flask-cors = [ - {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, - {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, -] -flask-sqlalchemy = [ - {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, - {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, -] -frozendict = [ - {file = "frozendict-2.0.3-py3-none-any.whl", hash = "sha256:58143e2d3d11699bc295d9e7e05f10dde99a727e2295d7f43542ecdc42c5ec70"}, - {file = "frozendict-2.0.3.tar.gz", hash = "sha256:163c616188beb97fdc8ef6e73ec2ebd70a844d4cf19d2e383aa94d1b8376653d"}, -] -gitdb = [ - {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, - {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, -] -gitpython = [ - {file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"}, - {file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"}, -] -h11 = [ - {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, - {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, -] -h2 = [ - {file = "h2-3.2.0-py2.py3-none-any.whl", hash = "sha256:61e0f6601fa709f35cdb730863b4e5ec7ad449792add80d1410d4174ed139af5"}, - {file = "h2-3.2.0.tar.gz", hash = "sha256:875f41ebd6f2c44781259005b157faed1a5031df3ae5aa7bcb4628a6c0782f14"}, -] -hpack = [ - {file = "hpack-3.0.0-py2.py3-none-any.whl", hash = "sha256:0edd79eda27a53ba5be2dfabf3b15780928a0dff6eb0c60a3d6767720e970c89"}, - {file = "hpack-3.0.0.tar.gz", hash = "sha256:8eec9c1f4bfae3408a3f30500261f7e6a65912dc138526ea054f9ad98892e9d2"}, -] -httpcore = [ - {file = "httpcore-0.12.3-py3-none-any.whl", hash = "sha256:93e822cd16c32016b414b789aeff4e855d0ccbfc51df563ee34d4dbadbb3bcdc"}, - {file = "httpcore-0.12.3.tar.gz", hash = "sha256:37ae835fb370049b2030c3290e12ed298bf1473c41bb72ca4aa78681eba9b7c9"}, -] -httpx = [ - {file = "httpx-0.16.1-py3-none-any.whl", hash = "sha256:9cffb8ba31fac6536f2c8cde30df859013f59e4bcc5b8d43901cb3654a8e0a5b"}, - {file = "httpx-0.16.1.tar.gz", hash = "sha256:126424c279c842738805974687e0518a94c7ae8d140cd65b9c4f77ac46ffa537"}, -] -hyperframe = [ - {file = "hyperframe-5.2.0-py2.py3-none-any.whl", hash = "sha256:5187962cb16dcc078f23cb5a4b110098d546c3f41ff2d4038a9896893bbd0b40"}, - {file = "hyperframe-5.2.0.tar.gz", hash = "sha256:a9f5c17f2cc3c719b917c4f33ed1c61bd1f8dfac4b1bd23b7c80b3400971b41f"}, -] -hyperlink = [ - {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, - {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, -] -idna = [ - {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, - {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, -] -imagesize = [ - {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, - {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, - {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, -] -importlib-resources = [ - {file = "importlib_resources-5.2.0-py3-none-any.whl", hash = "sha256:a0143290bef3cbc99de9e40176e4987780939a955b8632f02ce6c935f42e9bfc"}, - {file = "importlib_resources-5.2.0.tar.gz", hash = "sha256:22a2c42d8c6a1d30aa8a0e1f57293725bfd5c013d562585e46aff469e0ff78b3"}, -] -incremental = [ - {file = "incremental-21.3.0-py2.py3-none-any.whl", hash = "sha256:92014aebc6a20b78a8084cdd5645eeaa7f74b8933f70fa3ada2cfbd1e3b54321"}, - {file = "incremental-21.3.0.tar.gz", hash = "sha256:02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipykernel = [ - {file = "ipykernel-6.0.1-py3-none-any.whl", hash = "sha256:9a8576cb70a70cc8c63b0b6671e5f4767917071204653a5934e9b2c8680cec74"}, - {file = "ipykernel-6.0.1.tar.gz", hash = "sha256:a4f51c53c7be3f93d75c25839183fa2dfa24908fc650dfd023b276c7a080dc73"}, -] -ipython = [ - {file = "ipython-7.25.0-py3-none-any.whl", hash = "sha256:aa21412f2b04ad1a652e30564fff6b4de04726ce875eab222c8430edc6db383a"}, - {file = "ipython-7.25.0.tar.gz", hash = "sha256:54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] -ipywidgets = [ - {file = "ipywidgets-7.6.3-py2.py3-none-any.whl", hash = "sha256:e6513cfdaf5878de30f32d57f6dc2474da395a2a2991b94d487406c0ab7f55ca"}, - {file = "ipywidgets-7.6.3.tar.gz", hash = "sha256:9f1a43e620530f9e570e4a493677d25f08310118d315b00e25a18f12913c41f0"}, -] -itemadapter = [ - {file = "itemadapter-0.2.0-py3-none-any.whl", hash = "sha256:5327c2136353cb965b6b4ba564af002fd458691b8e30d3bd6b14c474d92c6b25"}, - {file = "itemadapter-0.2.0.tar.gz", hash = "sha256:cb7aaa577fefe2aa6f229ccf4d058e05f44e0178a98c8fb70ee4d95acfabb423"}, -] -itemloaders = [ - {file = "itemloaders-1.0.4-py3-none-any.whl", hash = "sha256:4cb46a0f8915e910c770242ae3b60b1149913ed37162804f1e40e8535d6ec497"}, - {file = "itemloaders-1.0.4.tar.gz", hash = "sha256:1277cd8ca3e4c02dcdfbc1bcae9134ad89acfa6041bd15b4561c6290203a0c96"}, -] -itsdangerous = [ - {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, - {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, -] -jedi = [ - {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, - {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, -] -jinja2 = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, -] -jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, -] -json5 = [ - {file = "json5-0.9.6-py2.py3-none-any.whl", hash = "sha256:823e510eb355949bed817e1f3e2d682455dc6af9daf6066d5698d6a2ca4481c2"}, - {file = "json5-0.9.6.tar.gz", hash = "sha256:9175ad1bc248e22bb8d95a8e8d765958bf0008fef2fe8abab5bc04e0f1ac8302"}, -] -jsonschema = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] -jupyter-book = [ - {file = "jupyter-book-0.11.1.tar.gz", hash = "sha256:98bae76d879a68dd25678cc6de38ddf4c0689dfaec6a7fd6207f917277d181b7"}, - {file = "jupyter_book-0.11.1-py3-none-any.whl", hash = "sha256:8d9098ba716e039b3bc1d823a03c92c79f58a91f56d3f2f2b39f24db2868c1e8"}, -] -jupyter-cache = [ - {file = "jupyter-cache-0.4.2.tar.gz", hash = "sha256:5cd0ab6170e520f31e4557ccff00ec486c33fa6b6a493e11b61399da1773ce8a"}, - {file = "jupyter_cache-0.4.2-py3-none-any.whl", hash = "sha256:db0eba0c3f85ac92af1a3a29db1201ccfa75aa6d894cf254a0c6f6ac0ce010fe"}, -] -jupyter-client = [ - {file = "jupyter_client-6.2.0-py3-none-any.whl", hash = "sha256:9715152067e3f7ea3b56f341c9a0f9715c8c7cc316ee0eb13c3c84f5ca0065f5"}, - {file = "jupyter_client-6.2.0.tar.gz", hash = "sha256:e2ab61d79fbf8b56734a4c2499f19830fbd7f6fefb3e87868ef0545cb3c17eb9"}, -] -jupyter-core = [ - {file = "jupyter_core-4.7.1-py3-none-any.whl", hash = "sha256:8c6c0cac5c1b563622ad49321d5ec47017bd18b94facb381c6973a0486395f8e"}, - {file = "jupyter_core-4.7.1.tar.gz", hash = "sha256:79025cb3225efcd36847d0840f3fc672c0abd7afd0de83ba8a1d3837619122b4"}, -] -jupyter-server = [ - {file = "jupyter_server-1.9.0-py3-none-any.whl", hash = "sha256:1a6bfcf4cd58a84dfe9d3060a76bf98428c08b8a177202fc0cadcec5f7d74090"}, - {file = "jupyter_server-1.9.0.tar.gz", hash = "sha256:7d19006380f6217458a9db309b54e3dab87ced6c06329c61823907bef2a6f51b"}, -] -jupyter-server-mathjax = [ - {file = "jupyter_server_mathjax-0.2.3-py3-none-any.whl", hash = "sha256:740de2ed0d370f1856faddfaf8c09a6d7435d09d3672f24826451467b268969d"}, - {file = "jupyter_server_mathjax-0.2.3.tar.gz", hash = "sha256:564e8d1272019c6771208f577b5f9f2b3afb02b9e2bff3b34c042cef8ed84451"}, -] -jupyter-sphinx = [ - {file = "jupyter_sphinx-0.3.2-py3-none-any.whl", hash = "sha256:301e36d0fb3007bb5802f6b65b60c24990eb99c983332a2ab6eecff385207dc9"}, - {file = "jupyter_sphinx-0.3.2.tar.gz", hash = "sha256:37fc9408385c45326ac79ca0452fbd7ae2bf0e97842d626d2844d4830e30aaf2"}, -] -jupyterbook-latex = [ - {file = "jupyterbook_latex-0.3.1-py3-none-any.whl", hash = "sha256:497b95db02224602903e0e60275eac2a7aabe4a6977dc5b743fde4151b8ab27f"}, - {file = "jupyterbook_latex-0.3.1.tar.gz", hash = "sha256:2606e27e285d58cf8a5d9fad0b0f79a0180604e15c641a6790a4bd81667f3d63"}, -] -jupyterlab = [ - {file = "jupyterlab-3.0.16-py3-none-any.whl", hash = "sha256:88f6e7580c15cf731d96495fda362e786753e18d1e3e7e735915862efb602a92"}, - {file = "jupyterlab-3.0.16.tar.gz", hash = "sha256:7ad4fbe1f6d38255869410fd151a8b15692a663ca97c0a8146b3f5c40e275c23"}, -] -jupyterlab-server = [ - {file = "jupyterlab_server-2.6.1-py3-none-any.whl", hash = "sha256:58d4b660fce8da4e90f0433ac54f462436fe5fbe731e3a281e15adcdecddb0eb"}, - {file = "jupyterlab_server-2.6.1.tar.gz", hash = "sha256:73279d1ffdcd3426f716bf5538cf1fdd2eb8a340ac25c5688f3c192c5bd3afc9"}, -] -jupyterlab-widgets = [ - {file = "jupyterlab_widgets-1.0.0-py3-none-any.whl", hash = "sha256:caeaf3e6103180e654e7d8d2b81b7d645e59e432487c1d35a41d6d3ee56b3fef"}, - {file = "jupyterlab_widgets-1.0.0.tar.gz", hash = "sha256:5c1a29a84d3069208cb506b10609175b249b6486d6b1cbae8fcde2a11584fb78"}, -] -jupytext = [ - {file = "jupytext-1.10.3-py3-none-any.whl", hash = "sha256:8b123b1c0151a1813948f55da06fa22e181c54c2b3a137bb6de3c69c10f0a7ed"}, - {file = "jupytext-1.10.3.tar.gz", hash = "sha256:bd54cf44c587d580c848fd4f677c1887797747385dde81c1ea9ae06687cac025"}, -] -latexcodec = [ - {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, - {file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a"}, -] -linkify-it-py = [ - {file = "linkify-it-py-1.0.1.tar.gz", hash = "sha256:90b632ee516bf523c007ee96aa14ffc7efe1ca4074a80b0df366d66922d6d087"}, - {file = "linkify_it_py-1.0.1-py3-none-any.whl", hash = "sha256:29ba044d36f0ff938730a8167b7341a7caffc3e11666f9009996af6b82b61dfc"}, -] -lxml = [ - {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"}, - {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"}, - {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"}, - {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"}, - {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"}, - {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"}, - {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"}, - {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"}, - {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"}, - {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"}, - {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"}, - {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"}, - {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"}, - {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"}, - {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"}, - {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"}, - {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"}, - {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"}, - {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"}, - {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"}, - {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"}, - {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"}, - {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"}, - {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"}, -] -mako = [ - {file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"}, - {file = "Mako-1.1.4.tar.gz", hash = "sha256:17831f0b7087c313c0ffae2bcbbd3c1d5ba9eeac9c38f2eb7b50e8c99fe9d5ab"}, -] -markdown-it-py = [ - {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, - {file = "markdown_it_py-0.6.2-py3-none-any.whl", hash = "sha256:30b3e9f8198dc82a5df0dcb73fd31d56cd9a43bf8a747feb10b2ba74f962bcb1"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -matplotlib-inline = [ - {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"}, - {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"}, -] -mdit-py-plugins = [ - {file = "mdit-py-plugins-0.2.6.tar.gz", hash = "sha256:1e467ca2ea056e8065cbd5d6c61e5052bb50826bde84c40f6a5ed77e82125710"}, - {file = "mdit_py_plugins-0.2.6-py3-none-any.whl", hash = "sha256:77fd75dad81109ee91f30eb49146196f79afbbae041f298ae4886c8c2b5e23d7"}, -] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] -msgpack = [ - {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"}, - {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192"}, - {file = "msgpack-1.0.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841"}, - {file = "msgpack-1.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f"}, - {file = "msgpack-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2"}, - {file = "msgpack-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc"}, - {file = "msgpack-1.0.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1"}, - {file = "msgpack-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a"}, - {file = "msgpack-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b"}, - {file = "msgpack-1.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83"}, - {file = "msgpack-1.0.2-cp38-cp38-win32.whl", hash = "sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9"}, - {file = "msgpack-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009"}, - {file = "msgpack-1.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e"}, - {file = "msgpack-1.0.2-cp39-cp39-win32.whl", hash = "sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33"}, - {file = "msgpack-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f"}, - {file = "msgpack-1.0.2.tar.gz", hash = "sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984"}, -] -mypy-extensions = [ - {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"}, -] -myst-nb = [ - {file = "myst-nb-0.12.3.tar.gz", hash = "sha256:4666039f538abf32d6489f4caf912d505e8798a2709bcf7a7936823ca6b15810"}, - {file = "myst_nb-0.12.3-py3-none-any.whl", hash = "sha256:3bc5191494720748419b8247e9ffc92d39b4ea7689f92d937e65110b346403fd"}, -] -myst-parser = [ - {file = "myst-parser-0.13.7.tar.gz", hash = "sha256:e4bc99e43e19f70d22e528de8e7cce59f7e8e7c4c34dcba203de92de7a7c7c85"}, - {file = "myst_parser-0.13.7-py3-none-any.whl", hash = "sha256:260355b4da8e8865fe080b0638d7f1ab1791dc4bed02a7a48630b6bad4249219"}, -] -nbclassic = [ - {file = "nbclassic-0.3.1-py3-none-any.whl", hash = "sha256:a7437c90a0bffcce172a4540cc53e140ea5987280c87c31a0cfa6e5d315eb907"}, - {file = "nbclassic-0.3.1.tar.gz", hash = "sha256:f920f8d09849bea7950e1017ff3bd101763a8d68f565a51ce053572e65aa7947"}, -] -nbclient = [ - {file = "nbclient-0.5.3-py3-none-any.whl", hash = "sha256:e79437364a2376892b3f46bedbf9b444e5396cfb1bc366a472c37b48e9551500"}, - {file = "nbclient-0.5.3.tar.gz", hash = "sha256:db17271330c68c8c88d46d72349e24c147bb6f34ec82d8481a8f025c4d26589c"}, -] -nbconvert = [ - {file = "nbconvert-5.6.1-py2.py3-none-any.whl", hash = "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee"}, - {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, -] -nbdime = [ - {file = "nbdime-3.1.0-py2.py3-none-any.whl", hash = "sha256:f341097d50c5459901a2be2eed221e1f936144741d96544372981051a3bec157"}, - {file = "nbdime-3.1.0.tar.gz", hash = "sha256:12dc4390b355b26d07ac8d11d50efbcb54bae0ad5842b817131babd2f4567963"}, -] -nbformat = [ - {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, - {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"}, -] -nest-asyncio = [ - {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"}, - {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, -] -notebook = [ - {file = "notebook-6.4.0-py3-none-any.whl", hash = "sha256:f7f0a71a999c7967d9418272ae4c3378a220bd28330fbfb49860e46cf8a5838a"}, - {file = "notebook-6.4.0.tar.gz", hash = "sha256:9c4625e2a2aa49d6eae4ce20cbc3d8976db19267e32d2a304880e0c10bf8aef9"}, -] +alabaster = [] +alembic = [] +anyio = [] +appdirs = [] +appnope = [] +argh = [] +argon2-cffi = [] +argon2-cffi-bindings = [] +asttokens = [] +atomicwrites = [] +attrs = [] +automat = [] +babel = [] +backcall = [] +"backports.zoneinfo" = [] +beautifulsoup4 = [] +black = [] +bleach = [] +cachetools = [] +certifi = [] +cffi = [] +charset-normalizer = [] +click = [] +colorama = [] +comm = [] +constantly = [] +cryptography = [] +cssselect = [] +dateparser = [] +debugpy = [] +decorator = [] +defusedxml = [] +diskcache = [] +docutils = [] +dynaconf = [] +entrypoints = [] +executing = [] +fastjsonschema = [] +filelock = [] +flask = [] +flask-accept = [] +flask-cors = [] +flask-sqlalchemy = [] +frozendict = [] +gitdb = [] +gitpython = [] +greenlet = [] +hyperlink = [] +idna = [] +imagesize = [] +importlib-metadata = [] +importlib-resources = [] +incremental = [] +iniconfig = [] +ipykernel = [] +ipython = [] +ipython-genutils = [] +ipywidgets = [] +itemadapter = [] +itemloaders = [] +itsdangerous = [] +jedi = [] +jinja2 = [] +jmespath = [] +jsonschema = [] +jupyter-book = [] +jupyter-cache = [] +jupyter-client = [] +jupyter-core = [] +jupyter-server = [] +jupyter-server-mathjax = [] +jupyter-sphinx = [] +jupyterlab-widgets = [] +jupytext = [] +latexcodec = [] +linkify-it-py = [] +lxml = [] +mako = [] +markdown-it-py = [] +markupsafe = [] +matplotlib-inline = [] +mdit-py-plugins = [] +mistune = [] +mypy-extensions = [] +myst-nb = [] +myst-parser = [] +nbclassic = [] +nbclient = [] +nbconvert = [] +nbdime = [] +nbformat = [] +nest-asyncio = [] +notebook = [] +notebook-shim = [] "org.webpki.json" = [] -packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, -] -pandocfilters = [ - {file = "pandocfilters-1.4.3.tar.gz", hash = "sha256:bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb"}, -] -parsel = [ - {file = "parsel-1.6.0-py2.py3-none-any.whl", hash = "sha256:9e1fa8db1c0b4a878bf34b35c043d89c9d1cbebc23b4d34dbc3c0ec33f2e087d"}, - {file = "parsel-1.6.0.tar.gz", hash = "sha256:70efef0b651a996cceebc69e55a85eb2233be0890959203ba7c3a03c72725c79"}, -] -parso = [ - {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, - {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, -] -pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pickleshare = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -plumbum = [ - {file = "plumbum-1.7.0-py2.py3-none-any.whl", hash = "sha256:139bbe08ee065b522a8a07d4f7e9f8eddffd78cc218b65b11cca2b33683e6b57"}, - {file = "plumbum-1.7.0.tar.gz", hash = "sha256:317744342c755319907c773cc87c3a30adaa3a41b0d34c0ce02d9d1904922dce"}, -] -priority = [ - {file = "priority-1.3.0-py2.py3-none-any.whl", hash = "sha256:be4fcb94b5e37cdeb40af5533afe6dd603bd665fe9c8b3052610fc1001d5d1eb"}, - {file = "priority-1.3.0.tar.gz", hash = "sha256:6bc1961a6d7fcacbfc337769f1a382c8e746566aaa365e78047abe9f66b2ffbe"}, -] -prometheus-client = [ - {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"}, - {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"}, - {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"}, -] -protego = [ - {file = "Protego-0.1.16.tar.gz", hash = "sha256:a682771bc7b51b2ff41466460896c1a5a653f9a1e71639ef365a72e66d8734b4"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] -py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, - {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"}, - {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"}, - {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"}, - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"}, - {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"}, - {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"}, - {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"}, - {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"}, - {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"}, - {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pyasn1-modules = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.4.egg", hash = "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199"}, - {file = "pyasn1_modules-0.2.8-py2.5.egg", hash = "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405"}, - {file = "pyasn1_modules-0.2.8-py2.6.egg", hash = "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb"}, - {file = "pyasn1_modules-0.2.8-py2.7.egg", hash = "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, - {file = "pyasn1_modules-0.2.8-py3.1.egg", hash = "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d"}, - {file = "pyasn1_modules-0.2.8-py3.2.egg", hash = "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45"}, - {file = "pyasn1_modules-0.2.8-py3.3.egg", hash = "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4"}, - {file = "pyasn1_modules-0.2.8-py3.4.egg", hash = "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811"}, - {file = "pyasn1_modules-0.2.8-py3.5.egg", hash = "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed"}, - {file = "pyasn1_modules-0.2.8-py3.6.egg", hash = "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0"}, - {file = "pyasn1_modules-0.2.8-py3.7.egg", hash = "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd"}, -] -pybtex = [ - {file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f"}, - {file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755"}, -] -pybtex-docutils = [ - {file = "pybtex-docutils-1.0.0.tar.gz", hash = "sha256:cead6554b4af99c287dd29f38b1fa152c9542f56a51cb6cbc3997c95b2725b2e"}, - {file = "pybtex_docutils-1.0.0-py3-none-any.whl", hash = "sha256:8a2ca2d89b70be3a722d73aeb64d57065c79000f54719672dd9a9a86288d13f7"}, -] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pydata-sphinx-theme = [ - {file = "pydata-sphinx-theme-0.6.3.tar.gz", hash = "sha256:32e0580ef985734d652eec2bf25e0995a330a9d4f76deaa353571ce8e180ab14"}, - {file = "pydata_sphinx_theme-0.6.3-py3-none-any.whl", hash = "sha256:f0fee20dc33fa5efa6b9be57368be760d236d8b9c1486b14ad1d17b7e7e0db04"}, -] -pydispatcher = [ - {file = "PyDispatcher-2.0.5.tar.gz", hash = "sha256:5570069e1b1769af1fe481de6dd1d3a388492acddd2cdad7a3bde145615d5caf"}, - {file = "PyDispatcher-2.0.5.zip", hash = "sha256:5be4a8be12805ef7d712dd9a93284fb8bc53f309867e573f653a72e5fd10e433"}, -] -pyee = [ - {file = "pyee-8.1.0-py2.py3-none-any.whl", hash = "sha256:383973b63ad7ed5e3c0311f8b179c52981f9e7b3eaea0e9a830d13ec34dde65f"}, - {file = "pyee-8.1.0.tar.gz", hash = "sha256:92dacc5bd2bdb8f95aa8dd2585d47ca1c4840e2adb95ccf90034d64f725bfd31"}, -] -pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, -] -pyjnius = [ - {file = "pyjnius-1.3.0-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:6600ad9d4afa74af4157adcc4748f62e5c2dd4efc2562ece9f1d39274a2259b0"}, - {file = "pyjnius-1.3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:163c3825e70e9ba6f9dd42e8342ad0fee7c99e18e10c0436d8e1dca340c2c5c4"}, - {file = "pyjnius-1.3.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:522a2955cf5543f60eafa6f7e63d01240260f7071fdfe4c2d0f8a0ca1c8b2119"}, - {file = "pyjnius-1.3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d65d510bc88f808e29e355f85ce4a0e35d974af01dd8a217eb98c97588b1cc80"}, - {file = "pyjnius-1.3.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c5bad82180251fa628e74c2a3f4a119a5e60250cc26723b3e190f0c32e08ece3"}, - {file = "pyjnius-1.3.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:245fe0218f5ec4b7f229955a8785678b98a697776c9e2cc1ac735d61ad08169c"}, - {file = "pyjnius-1.3.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:f8b5c28398dc082419d195fd108647e5665c361f2897b94a09833f324e8987db"}, - {file = "pyjnius-1.3.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:1e2f231f83159eafd3b3c3e7393148e6f3376f1f786bbceae78bbdda1bdcc9a9"}, - {file = "pyjnius-1.3.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2bfe44f8d674b2826c11c4920fcfbbec4b65c331c309b3e01c1d9527f934fb01"}, - {file = "pyjnius-1.3.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:97a8fd5917069e892af94fba114cf8760583140aeaa77225d9b81d07a25a976c"}, - {file = "pyjnius-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:162a0c43dfc303a83a8d80e3d6a980f5f10426e9fc0d4bec0e39b4bd1e162f6b"}, - {file = "pyjnius-1.3.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:0a7f2de85a0036f57f42b1ec7876dc04e1ad4886e5d0bac32d155265652cce6b"}, - {file = "pyjnius-1.3.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c2ffa4aeb2e56fb9f11be6782cc16f14c3743e27c65b1fcf5f514dc9782e5231"}, - {file = "pyjnius-1.3.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:44f3b1aedcbb4227499c70ba39d77462c437abb2b0cec14f52be568a1df1e0ee"}, - {file = "pyjnius-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f4fe0629e5a00f3f6104a28275ff4ea56456e11296875e9e73f3447870e20d96"}, - {file = "pyjnius-1.3.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:21b805277a27b1d436ca1c76bc5f269b232801f69a4e4f22bc72ed98b47355c2"}, - {file = "pyjnius-1.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:95d1741605dcac7abf79f22eb199c3fdcde3581c3629b2f3ed13f98b2d682d29"}, - {file = "pyjnius-1.3.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:84eb01a0d4d592171769f56805895cc1825a9a3b3deac0d90909077e8a2f32a3"}, - {file = "pyjnius-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:05d6ad4e64241e4412491bf6502daf8eae40296aa39cd5093c14931e466ebfe3"}, - {file = "pyjnius-1.3.0.0.tar.gz", hash = "sha256:d20845e75a2d18224e661d0e2bc2ce9141f17472e685cd6579847b0a7b5da6ad"}, -] +packaging = [] +pandocfilters = [] +parsel = [] +parso = [] +pathspec = [] +pexpect = [] +pickleshare = [] +pkgutil-resolve-name = [] +platformdirs = [] +pluggy = [] +prometheus-client = [] +prompt-toolkit = [] +protego = [] +psutil = [] +ptyprocess = [] +pure-eval = [] +py = [] +pyasn1 = [] +pyasn1-modules = [] +pybtex = [] +pybtex-docutils = [] +pycparser = [] +pydata-sphinx-theme = [] +pydispatcher = [] +pyee = [] +pygments = [] PyLD = [] -pyopenssl = [ - {file = "pyOpenSSL-20.0.1-py2.py3-none-any.whl", hash = "sha256:818ae18e06922c066f777a33f1fca45786d85edfe71cd043de6379337a7f274b"}, - {file = "pyOpenSSL-20.0.1.tar.gz", hash = "sha256:4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pypiwin32 = [ - {file = "pypiwin32-223-py3-none-any.whl", hash = "sha256:67adf399debc1d5d14dffc1ab5acacb800da569754fafdc576b2a039485aa775"}, - {file = "pypiwin32-223.tar.gz", hash = "sha256:71be40c1fbd28594214ecaecb58e7aa8b708eabfa0125c8a109ebd51edbd776a"}, -] -pyppeteer = [ - {file = "pyppeteer-0.2.5-py3-none-any.whl", hash = "sha256:d4cb4a5ef94b00c1073aed888b39646ce26cff3339cff7a3f1f1cc307bf50408"}, - {file = "pyppeteer-0.2.5.tar.gz", hash = "sha256:c2974be1afa13b17f7ecd120d265d8b8cd324d536a231c3953ca872b68aba4af"}, -] -pypydispatcher = [ - {file = "PyPyDispatcher-2.1.2.tar.gz", hash = "sha256:b6bec5dfcff9d2535bca2b23c80eae367b1ac250a645106948d315fcfa9130f2"}, -] -pyrsistent = [ - {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, - {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, - {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, - {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, - {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, - {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, - {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, - {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, - {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, - {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, - {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, - {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, -] -pytest = [ - {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, - {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python-editor = [ - {file = "python-editor-1.0.4.tar.gz", hash = "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b"}, - {file = "python_editor-1.0.4-py2-none-any.whl", hash = "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"}, - {file = "python_editor-1.0.4-py2.7.egg", hash = "sha256:ea87e17f6ec459e780e4221f295411462e0d0810858e055fc514684350a2f522"}, - {file = "python_editor-1.0.4-py3-none-any.whl", hash = "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d"}, - {file = "python_editor-1.0.4-py3.5.egg", hash = "sha256:c3da2053dbab6b29c94e43c486ff67206eafbe7eb52dbec7390b5e2fb05aac77"}, -] -python-magic = [ - {file = "python-magic-0.4.24.tar.gz", hash = "sha256:de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf"}, - {file = "python_magic-0.4.24-py2.py3-none-any.whl", hash = "sha256:4fec8ee805fea30c07afccd1592c0f17977089895bdfaae5fec870a84e997626"}, -] -pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, -] -pywin32 = [ - {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"}, - {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"}, - {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"}, - {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"}, - {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"}, - {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"}, - {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"}, - {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"}, - {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"}, - {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"}, -] -pywinpty = [ - {file = "pywinpty-1.1.3-cp36-none-win_amd64.whl", hash = "sha256:81dc6f16d917b756e06fc58943e9750d59dbefc0ffd2086871d3fa5f33824446"}, - {file = "pywinpty-1.1.3-cp37-none-win_amd64.whl", hash = "sha256:54557887e712ea3215ab0d9f089ed55a6cc8d826cd5d1e340d75300654c9663f"}, - {file = "pywinpty-1.1.3-cp38-none-win_amd64.whl", hash = "sha256:f5e25197397f1fef0362caf3eb89f25441827a1e48bf15827c27021592fd2160"}, - {file = "pywinpty-1.1.3-cp39-none-win_amd64.whl", hash = "sha256:b767276224f86b7560eb9173ba7956758cafcdfab97bb33837d42d2a0f1dbf67"}, - {file = "pywinpty-1.1.3.tar.gz", hash = "sha256:3a1d57b338390333812a5eed31c93c7d8ba82b131078063703e731946d90c9f2"}, -] -pyyaml = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, -] -pyzmq = [ - {file = "pyzmq-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e9b9a2f6944acdaf57316436c1acdcb30b8df76726bcf570ad9342bc5001654"}, - {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24fb5bb641f0b2aa25fc3832f4b6fc62430f14a7d328229fe994b2bcdc07c93a"}, - {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c4674004ed64685a38bee222cd75afa769424ec603f9329f0dd4777138337f48"}, - {file = "pyzmq-22.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:461ed80d741692d9457ab820b1cc057ba9c37c394e67b647b639f623c8b321f6"}, - {file = "pyzmq-22.1.0-cp36-cp36m-win32.whl", hash = "sha256:de5806be66c9108e4dcdaced084e8ceae14100aa559e2d57b4f0cceb98c462de"}, - {file = "pyzmq-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a1c77796f395804d6002ff56a6a8168c1f98579896897ad7e35665a9b4a9eec5"}, - {file = "pyzmq-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a81c9e6754465d09a87e3acd74d9bb1f0039b2d785c6899622f0afdb41d760"}, - {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0f0f27eaab9ba7b92d73d71c51d1a04464a1da6097a252d007922103253d2313"}, - {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b8fb1b3174b56fd020e4b10232b1764e52cf7f3babcfb460c5253bdc48adad0"}, - {file = "pyzmq-22.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fff75af4c7af92dce9f81fa2a83ed009c3e1f33ee8b5222db2ef80b94e242e"}, - {file = "pyzmq-22.1.0-cp37-cp37m-win32.whl", hash = "sha256:cb9f9fe1305ef69b65794655fd89b2209b11bff3e837de981820a8aa051ef914"}, - {file = "pyzmq-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bf80b2cec42d96117248b99d3c86e263a00469c840a778e6cb52d916f4fdf82c"}, - {file = "pyzmq-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0ea7f4237991b0f745a4432c63e888450840bf8cb6c48b93fb7d62864f455529"}, - {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:12ffcf33db6ba7c0e5aaf901e65517f5e2b719367b80bcbfad692f546a297c7a"}, - {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d3ecfee2ee8d91ab2e08d2d8e89302c729b244e302bbc39c5b5dde42306ff003"}, - {file = "pyzmq-22.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:68e2c4505992ab5b89f976f89a9135742b18d60068f761bef994a6805f1cae0c"}, - {file = "pyzmq-22.1.0-cp38-cp38-win32.whl", hash = "sha256:285514956c08c7830da9d94e01f5414661a987831bd9f95e4d89cc8aaae8da10"}, - {file = "pyzmq-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5e5be93e1714a59a535bbbc086b9e4fd2448c7547c5288548f6fd86353cad9e"}, - {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b2f707b52e09098a7770503e39294ca6e22ae5138ffa1dd36248b6436d23d78e"}, - {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:18dd2ca4540c476558099891c129e6f94109971d110b549db2a9775c817cedbd"}, - {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:c6d0c32532a0519997e1ded767e184ebb8543bdb351f8eff8570bd461e874efc"}, - {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:9ee48413a2d3cd867fd836737b4c89c24cea1150a37f4856d82d20293fa7519f"}, - {file = "pyzmq-22.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4c4fe69c7dc0d13d4ae180ad650bb900854367f3349d3c16f0569f6c6447f698"}, - {file = "pyzmq-22.1.0-cp39-cp39-win32.whl", hash = "sha256:fc712a90401bcbf3fa25747f189d6dcfccbecc32712701cad25c6355589dac57"}, - {file = "pyzmq-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:68be16107f41563b9f67d93dff1c9f5587e0f76aa8fd91dc04c83d813bcdab1f"}, - {file = "pyzmq-22.1.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:734ea6565c71fc2d03d5b8c7d0d7519c96bb5567e0396da1b563c24a4ac66f0c"}, - {file = "pyzmq-22.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:1389b615917d4196962a9b469e947ba862a8ec6f5094a47da5e7a8d404bc07a4"}, - {file = "pyzmq-22.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:41049cff5265e9cd75606aa2c90a76b9c80b98d8fe70ee08cf4af3cedb113358"}, - {file = "pyzmq-22.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f49755684a963731479ff3035d45a8185545b4c9f662d368bd349c419839886d"}, - {file = "pyzmq-22.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6355f81947e1fe6e7bb9e123aeb3067264391d3ebe8402709f824ef8673fa6f3"}, - {file = "pyzmq-22.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:089b974ec04d663b8685ac90e86bfe0e4da9d911ff3cf52cb765ff22408b102d"}, - {file = "pyzmq-22.1.0.tar.gz", hash = "sha256:7040d6dd85ea65703904d023d7f57fab793d7ffee9ba9e14f3b897f34ff2415d"}, -] -queuelib = [ - {file = "queuelib-1.6.1-py2.py3-none-any.whl", hash = "sha256:90ee30ebb0b57112606358b63c09a681bbb9a7dd1120af09c836b475504cea85"}, - {file = "queuelib-1.6.1.tar.gz", hash = "sha256:631d067c9be57e395c382d680d3653ca1452cd29e8da25c5e8d94b5c0c528c31"}, -] -regex = [ - {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, - {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, - {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, - {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, - {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, - {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, - {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, - {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, - {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, - {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, - {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, - {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, - {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, -] -requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] -requests-unixsocket = [ - {file = "requests-unixsocket-0.2.0.tar.gz", hash = "sha256:9e5c1a20afc3cf786197ae59c79bcdb0e7565f218f27df5f891307ee8817c1ea"}, - {file = "requests_unixsocket-0.2.0-py2.py3-none-any.whl", hash = "sha256:014d07bfb66dc805a011a8b4b306cf4ec96d2eddb589f6b2b5765e626f0dc0cc"}, -] -rfc3986 = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] -rpyc = [ - {file = "rpyc-5.0.1-py3-none-any.whl", hash = "sha256:97c40d84994816e6b39be9224c936817bb6f76e71b9b49d29adb22531d9c820f"}, -] -scrapy = [ - {file = "Scrapy-2.5.0-py2.py3-none-any.whl", hash = "sha256:5f590fdc84b496e5a4bb5ef99836b0aa688a07cfcb4bc3bb7290f66486f27424"}, - {file = "Scrapy-2.5.0.tar.gz", hash = "sha256:0a68ed41f7173679f160c4cef2db05288548c21e7164170552adae8b13cefaab"}, -] -scrapyd = [ - {file = "scrapyd-1.2.1-py2.py3-none-any.whl", hash = "sha256:7887b2b6d1d84291528cb65b6a2cce95d630e027c32330e72a5aa16710a6c3cb"}, - {file = "scrapyd-1.2.1.tar.gz", hash = "sha256:9afff46957794618daea93046bca58576d06c1a32b290134c051235971c32a9c"}, -] -send2trash = [ - {file = "Send2Trash-1.7.1-py3-none-any.whl", hash = "sha256:c20fee8c09378231b3907df9c215ec9766a84ee20053d99fbad854fe8bd42159"}, - {file = "Send2Trash-1.7.1.tar.gz", hash = "sha256:17730aa0a33ab82ed6ca76be3bb25f0433d0014f1ccf63c979bab13a5b9db2b2"}, -] -service-identity = [ - {file = "service-identity-21.1.0.tar.gz", hash = "sha256:6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34"}, - {file = "service_identity-21.1.0-py2.py3-none-any.whl", hash = "sha256:f0b0caac3d40627c3c04d7a51b6e06721857a0e10a8775f2d1d7e72901b3a7db"}, -] -shortuuid = [ - {file = "shortuuid-1.0.1-py3-none-any.whl", hash = "sha256:492c7402ff91beb1342a5898bd61ea953985bf24a41cd9f247409aa2e03c8f77"}, - {file = "shortuuid-1.0.1.tar.gz", hash = "sha256:3c11d2007b915c43bee3e10625f068d8a349e04f0d81f08f5fa08507427ebf1f"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, - {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, -] -sniffio = [ - {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, - {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, - {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, -] +pyopenssl = [] +pyppeteer = [] +pypydispatcher = [] +pyrsistent = [] +pytest = [] +python-dateutil = [] +python-magic = [] +pytz = [] +pytz-deprecation-shim = [] +pywin32 = [] +pywinpty = [] +pyyaml = [] +pyzmq = [] +queuelib = [] +regex = [] +requests = [] +requests-file = [] +scrapy = [] +scrapyd = [] +send2trash = [] +service-identity = [] +shortuuid = [] +six = [] +smmap = [] +sniffio = [] +snowballstemmer = [] sonormal = [] -soupsieve = [ - {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"}, - {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, -] -sphinx = [ - {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"}, - {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"}, -] -sphinx-book-theme = [ - {file = "sphinx-book-theme-0.1.0.tar.gz", hash = "sha256:b2db884eb9a843f7864a5660322ac7b0b9cd762f31341dedb4530f1546675bbd"}, - {file = "sphinx_book_theme-0.1.0-py3-none-any.whl", hash = "sha256:182e57262e76c657a8f3082b0922f3617c8b0cb3e4c4079fa6b2ae9b2a5d3ae9"}, -] -sphinx-comments = [ - {file = "sphinx-comments-0.0.3.tar.gz", hash = "sha256:00170afff27019fad08e421da1ae49c681831fb2759786f07c826e89ac94cf21"}, - {file = "sphinx_comments-0.0.3-py3-none-any.whl", hash = "sha256:1e879b4e9bfa641467f83e3441ac4629225fc57c29995177d043252530c21d00"}, -] -sphinx-copybutton = [ - {file = "sphinx-copybutton-0.4.0.tar.gz", hash = "sha256:8daed13a87afd5013c3a9af3575cc4d5bec052075ccd3db243f895c07a689386"}, - {file = "sphinx_copybutton-0.4.0-py3-none-any.whl", hash = "sha256:4340d33c169dac6dd82dce2c83333412aa786a42dd01a81a8decac3b130dc8b0"}, -] -sphinx-external-toc = [ - {file = "sphinx_external_toc-0.2.2-py3-none-any.whl", hash = "sha256:853bab3374cfbd8f0833838a245fc52b2920d355e493fe783e71054019aaa720"}, - {file = "sphinx_external_toc-0.2.2.tar.gz", hash = "sha256:a72c5861f670f1c7a1b92f2159fc9c7c5370e079cad1e3a7be4b269fa8048e8a"}, -] -sphinx-panels = [ - {file = "sphinx-panels-0.5.2.tar.gz", hash = "sha256:b7b3faa05f37b7318fd14cd85c4effa1ab905dfc8bed236a63978565ea461ae4"}, - {file = "sphinx_panels-0.5.2-py3-none-any.whl", hash = "sha256:2b2e18448b0494e7a232d6c7dfb9aa3982e7aeb92aeea7d1b146e34e9261d2f1"}, -] -sphinx-thebe = [ - {file = "sphinx-thebe-0.0.8.tar.gz", hash = "sha256:6229caa99e996776ffdc5c658d9dcce09e0c749727e5aa3d280a2bbf3a72068a"}, - {file = "sphinx_thebe-0.0.8-py3-none-any.whl", hash = "sha256:dd3cf6ea66d308539d5b14ec89a284108a74b8e1b30ea88232353fb756bfc88c"}, -] -sphinx-togglebutton = [ - {file = "sphinx-togglebutton-0.2.3.tar.gz", hash = "sha256:41cbe2f87459eade8dc5718bb56146e8e113a05fb97459b90472470f0d357b55"}, - {file = "sphinx_togglebutton-0.2.3-py3-none-any.whl", hash = "sha256:8a3707154b1b3480a7918f189f43b7eee0d34ffa552895af77bb273476b8d5e0"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-bibtex = [ - {file = "sphinxcontrib-bibtex-2.2.1.tar.gz", hash = "sha256:00d474092e04b1d941e645cf6c027632a975cd0b9337cf47d379f63a5928f334"}, - {file = "sphinxcontrib_bibtex-2.2.1-py3-none-any.whl", hash = "sha256:38e8e9e1d450b50f33b2e42855da66e7c71e7ea533ca2a381b6d8d6314975a36"}, -] -sphinxcontrib-devhelp = [ - {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"}, -] -sphinxcontrib-drawio = [ - {file = "sphinxcontrib-drawio-0.0.13.tar.gz", hash = "sha256:d54f44a1d9646b4ec21f936433a4dd12057af9691ff4405c4c6b8205ee182798"}, - {file = "sphinxcontrib_drawio-0.0.13-py3-none-any.whl", hash = "sha256:48858bf7d85a73c9383f0781eca45f5044b08608f8a1d01dcf8e2daded868373"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {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"}, -] -sphinxcontrib-plantuml = [ - {file = "sphinxcontrib-plantuml-0.21.tar.gz", hash = "sha256:53e1808dc2b1f3ec20c177fa3fa6d438d75ef572a25a489e330bb01130508d87"}, -] -sphinxcontrib-qthelp = [ - {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"}, -] -sphinxcontrib-serializinghtml = [ - {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"}, -] -sqlalchemy = [ - {file = "SQLAlchemy-1.3.24-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:87a2725ad7d41cd7376373c15fd8bf674e9c33ca56d0b8036add2d634dba372e"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win32.whl", hash = "sha256:f597a243b8550a3a0b15122b14e49d8a7e622ba1c9d29776af741f1845478d79"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win_amd64.whl", hash = "sha256:fc4cddb0b474b12ed7bdce6be1b9edc65352e8ce66bc10ff8cbbfb3d4047dbf4"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f1149d6e5c49d069163e58a3196865e4321bad1803d7886e07d8710de392c548"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:14f0eb5db872c231b20c18b1e5806352723a3a89fb4254af3b3e14f22eaaec75"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:e98d09f487267f1e8d1179bf3b9d7709b30a916491997137dd24d6ae44d18d79"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:fc1f2a5a5963e2e73bac4926bdaf7790c4d7d77e8fc0590817880e22dd9d0b8b"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win32.whl", hash = "sha256:f3c5c52f7cb8b84bfaaf22d82cb9e6e9a8297f7c2ed14d806a0f5e4d22e83fb7"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win_amd64.whl", hash = "sha256:0352db1befcbed2f9282e72843f1963860bf0e0472a4fa5cf8ee084318e0e6ab"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:2ed6343b625b16bcb63c5b10523fd15ed8934e1ed0f772c534985e9f5e73d894"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:34fcec18f6e4b24b4a5f6185205a04f1eab1e56f8f1d028a2a03694ebcc2ddd4"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e47e257ba5934550d7235665eee6c911dc7178419b614ba9e1fbb1ce6325b14f"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:816de75418ea0953b5eb7b8a74933ee5a46719491cd2b16f718afc4b291a9658"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win32.whl", hash = "sha256:26155ea7a243cbf23287f390dba13d7927ffa1586d3208e0e8d615d0c506f996"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win_amd64.whl", hash = "sha256:f03bd97650d2e42710fbe4cf8a59fae657f191df851fc9fc683ecef10746a375"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a006d05d9aa052657ee3e4dc92544faae5fcbaafc6128217310945610d862d39"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1e2f89d2e5e3c7a88e25a3b0e43626dba8db2aa700253023b82e630d12b37109"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0d5d862b1cfbec5028ce1ecac06a3b42bc7703eb80e4b53fceb2738724311443"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0172423a27fbcae3751ef016663b72e1a516777de324a76e30efa170dbd3dd2d"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win32.whl", hash = "sha256:d37843fb8df90376e9e91336724d78a32b988d3d20ab6656da4eb8ee3a45b63c"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win_amd64.whl", hash = "sha256:c10ff6112d119f82b1618b6dc28126798481b9355d8748b64b9b55051eb4f01b"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:861e459b0e97673af6cc5e7f597035c2e3acdfb2608132665406cded25ba64c7"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5de2464c254380d8a6c20a2746614d5a436260be1507491442cf1088e59430d2"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d375d8ccd3cebae8d90270f7aa8532fe05908f79e78ae489068f3b4eee5994e8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:014ea143572fee1c18322b7908140ad23b3994036ef4c0d630110faf942652f8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win32.whl", hash = "sha256:6607ae6cd3a07f8a4c3198ffbf256c261661965742e2b5265a77cd5c679c9bba"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win_amd64.whl", hash = "sha256:fcb251305fa24a490b6a9ee2180e5f8252915fb778d3dafc70f9cc3f863827b9"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01aa5f803db724447c1d423ed583e42bf5264c597fd55e4add4301f163b0be48"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4d0e3515ef98aa4f0dc289ff2eebb0ece6260bbf37c2ea2022aad63797eacf60"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bce28277f308db43a6b4965734366f533b3ff009571ec7ffa583cb77539b84d6"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8110e6c414d3efc574543109ee618fe2c1f96fa31833a1ff36cc34e968c4f233"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win32.whl", hash = "sha256:ee5f5188edb20a29c1cc4a039b074fdc5575337c9a68f3063449ab47757bb064"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win_amd64.whl", hash = "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b"}, - {file = "SQLAlchemy-1.3.24.tar.gz", hash = "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519"}, -] -terminado = [ - {file = "terminado-0.10.1-py3-none-any.whl", hash = "sha256:c89ace5bffd0e7268bdcf22526830eb787fd146ff9d78691a0528386f92b9ae3"}, - {file = "terminado-0.10.1.tar.gz", hash = "sha256:89d5dac2f4e2b39758a0ff9a3b643707c95a020a6df36e70583b88297cd59cbe"}, -] -testpath = [ - {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"}, - {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tornado = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] -tqdm = [ - {file = "tqdm-4.61.2-py2.py3-none-any.whl", hash = "sha256:5aa445ea0ad8b16d82b15ab342de6b195a722d75fc1ef9934a46bba6feafbc64"}, - {file = "tqdm-4.61.2.tar.gz", hash = "sha256:8bb94db0d4468fea27d004a0f1d1c02da3cdedc00fe491c0de986b76a04d6b0a"}, -] -traitlets = [ - {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, - {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, -] -twisted = [ - {file = "Twisted-21.2.0-py3-none-any.whl", hash = "sha256:aab38085ea6cda5b378b519a0ec99986874921ee8881318626b0a3414bb2631e"}, - {file = "Twisted-21.2.0.tar.gz", hash = "sha256:77544a8945cf69b98d2946689bbe0c75de7d145cdf11f391dd487eae8fc95a12"}, -] -twisted-iocpsupport = [ - {file = "twisted-iocpsupport-1.0.1.tar.gz", hash = "sha256:bdda01692988f29d43d832a4b1f402199d0c7d80083ad65059a0892a3670fc9a"}, - {file = "twisted_iocpsupport-1.0.1-cp27-cp27m-win32.whl", hash = "sha256:34a3dfd743f9b7a464ba72c9fa9fc21e2a5e5d2f5a8c805f3e3057a2b3c1f7de"}, - {file = "twisted_iocpsupport-1.0.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e9cfab3e9dbc3a541722b7e34656e3694a7a09d113c40b51213e8d8a5b6a2314"}, - {file = "twisted_iocpsupport-1.0.1-cp35-cp35m-win32.whl", hash = "sha256:28770b4d0da9364df81371e962323a8390b181eeeccec91eb21316489a4ee337"}, - {file = "twisted_iocpsupport-1.0.1-cp35-cp35m-win_amd64.whl", hash = "sha256:95595fb8d242b802b21f2c0652af0997287dcba67f4f85285be9adc15572e462"}, - {file = "twisted_iocpsupport-1.0.1-cp36-cp36m-win32.whl", hash = "sha256:de5a2273df46fafab430fadfe0213943ffbc0cdb8ab5d49cb41e0610043ee70e"}, - {file = "twisted_iocpsupport-1.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f3c505de2237ed47c20e425dfc903a2ee1ee2cf08654f2c88898e50a60a5f210"}, - {file = "twisted_iocpsupport-1.0.1-cp37-cp37m-win32.whl", hash = "sha256:90e6f15acf86de2b66e1441fb1c4bcbba4e1361b799fa5c20899e453eb66c5c9"}, - {file = "twisted_iocpsupport-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4b9fd9b059545536d5f7ac10f642ebba0437203e884479eb9d01d636dd287414"}, - {file = "twisted_iocpsupport-1.0.1-cp38-cp38-win32.whl", hash = "sha256:e1dae2dd44a11153b169dda012b222bce524792dc64859ab2b86deb7a0915863"}, - {file = "twisted_iocpsupport-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f5c45094f16c1c0749453a9341bfe818cb5f4543e76ae744bc983c992a0abdd"}, - {file = "twisted_iocpsupport-1.0.1-cp39-cp39-win32.whl", hash = "sha256:5b9ce8803023d0818ab2507fe222c16c193bae091abb59a45841a757ffe198fe"}, - {file = "twisted_iocpsupport-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8dab94de3a9bafae1e3ec92aec01f1239b2b4b4f3866162f2c5f2e649e2661dc"}, - {file = "twisted_iocpsupport-1.0.1-pp27-pypy_73-win32.whl", hash = "sha256:eb033bed4f20d2053767054c33be4d8ae09faf23d547681ecd5ff463d97bc099"}, - {file = "twisted_iocpsupport-1.0.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:ed8cb959d7dce287419e766267a280139fedf14217d85695d7b6384d8ccd3353"}, - {file = "twisted_iocpsupport-1.0.1-pp37-pypy37_pp73-win32.whl", hash = "sha256:1535e537b6d60d0cfd2b4785f1c7a021beb62d8df6bac3dc6c45bb866ce648e4"}, -] -typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, -] -tzlocal = [ - {file = "tzlocal-2.1-py2.py3-none-any.whl", hash = "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4"}, - {file = "tzlocal-2.1.tar.gz", hash = "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44"}, -] -uc-micro-py = [ - {file = "uc-micro-py-1.0.1.tar.gz", hash = "sha256:b7cdf4ea79433043ddfe2c82210208f26f7962c0cfbe3bacb05ee879a7fdb596"}, - {file = "uc_micro_py-1.0.1-py3-none-any.whl", hash = "sha256:316cfb8b6862a0f1d03540f0ae6e7b033ff1fa0ddbe60c12cbe0d4cec846a69f"}, -] -urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, -] -uwsgi = [ - {file = "uWSGI-2.0.19.1.tar.gz", hash = "sha256:faa85e053c0b1be4d5585b0858d3a511d2cd10201802e8676060fd0a109e5869"}, -] -w3lib = [ - {file = "w3lib-1.22.0-py2.py3-none-any.whl", hash = "sha256:0161d55537063e00d95a241663ede3395c4c6d7b777972ba2fd58bbab2001e53"}, - {file = "w3lib-1.22.0.tar.gz", hash = "sha256:0ad6d0203157d61149fd45aaed2e24f53902989c32fc1dccc2e2bfba371560df"}, -] -watchdog = [ - {file = "watchdog-2.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9628f3f85375a17614a2ab5eac7665f7f7be8b6b0a2a228e6f6a2e91dd4bfe26"}, - {file = "watchdog-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:acc4e2d5be6f140f02ee8590e51c002829e2c33ee199036fcd61311d558d89f4"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85b851237cf3533fabbc034ffcd84d0fa52014b3121454e5f8b86974b531560c"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a12539ecf2478a94e4ba4d13476bb2c7a2e0a2080af2bb37df84d88b1b01358a"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6fe9c8533e955c6589cfea6f3f0a1a95fb16867a211125236c82e1815932b5d7"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d9456f0433845e7153b102fffeb767bde2406b76042f2216838af3b21707894e"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd8c595d5a93abd441ee7c5bb3ff0d7170e79031520d113d6f401d0cf49d7c8f"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0bcfe904c7d404eb6905f7106c54873503b442e8e918cc226e1828f498bdc0ca"}, - {file = "watchdog-2.1.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf84bd94cbaad8f6b9cbaeef43080920f4cb0e61ad90af7106b3de402f5fe127"}, - {file = "watchdog-2.1.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b8ddb2c9f92e0c686ea77341dcb58216fa5ff7d5f992c7278ee8a392a06e86bb"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8805a5f468862daf1e4f4447b0ccf3acaff626eaa57fbb46d7960d1cf09f2e6d"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:3e305ea2757f81d8ebd8559d1a944ed83e3ab1bdf68bcf16ec851b97c08dc035"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_i686.whl", hash = "sha256:431a3ea70b20962e6dee65f0eeecd768cd3085ea613ccb9b53c8969de9f6ebd2"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:e4929ac2aaa2e4f1a30a36751160be391911da463a8799460340901517298b13"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:201cadf0b8c11922f54ec97482f95b2aafca429c4c3a4bb869a14f3c20c32686"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:3a7d242a7963174684206093846537220ee37ba9986b824a326a8bb4ef329a33"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:54e057727dd18bd01a3060dbf5104eb5a495ca26316487e0f32a394fd5fe725a"}, - {file = "watchdog-2.1.3-py3-none-win32.whl", hash = "sha256:b5fc5c127bad6983eecf1ad117ab3418949f18af9c8758bd10158be3647298a9"}, - {file = "watchdog-2.1.3-py3-none-win_amd64.whl", hash = "sha256:44acad6f642996a2b50bb9ce4fb3730dde08f23e79e20cd3d8e2a2076b730381"}, - {file = "watchdog-2.1.3-py3-none-win_ia64.whl", hash = "sha256:0bcdf7b99b56a3ae069866c33d247c9994ffde91b620eaf0306b27e099bd1ae0"}, - {file = "watchdog-2.1.3.tar.gz", hash = "sha256:e5236a8e8602ab6db4b873664c2d356c365ab3cac96fbdec4970ad616415dd45"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -websocket-client = [ - {file = "websocket-client-1.1.0.tar.gz", hash = "sha256:b68e4959d704768fa20e35c9d508c8dc2bbc041fd8d267c0d7345cffe2824568"}, - {file = "websocket_client-1.1.0-py2.py3-none-any.whl", hash = "sha256:e5c333bfa9fa739538b652b6f8c8fc2559f1d364243c8a689d7c0e1d41c2e611"}, -] -websockets = [ - {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, - {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, - {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, - {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, - {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, - {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, - {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, - {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, - {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, - {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, - {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, - {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, - {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, - {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, - {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, - {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, - {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, - {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, - {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, - {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, - {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, - {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, -] -werkzeug = [ - {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, - {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, -] -widgetsnbextension = [ - {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"}, - {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"}, -] -zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, -] -"zope.interface" = [ - {file = "zope.interface-5.4.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531"}, - {file = "zope.interface-5.4.0-cp27-cp27m-win32.whl", hash = "sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325"}, - {file = "zope.interface-5.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117"}, - {file = "zope.interface-5.4.0-cp35-cp35m-win32.whl", hash = "sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8"}, - {file = "zope.interface-5.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63"}, - {file = "zope.interface-5.4.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2"}, - {file = "zope.interface-5.4.0-cp36-cp36m-win32.whl", hash = "sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78"}, - {file = "zope.interface-5.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1"}, - {file = "zope.interface-5.4.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf"}, - {file = "zope.interface-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7"}, - {file = "zope.interface-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94"}, - {file = "zope.interface-5.4.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4"}, - {file = "zope.interface-5.4.0-cp38-cp38-win32.whl", hash = "sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb"}, - {file = "zope.interface-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54"}, - {file = "zope.interface-5.4.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c"}, - {file = "zope.interface-5.4.0-cp39-cp39-win32.whl", hash = "sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e"}, - {file = "zope.interface-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09"}, - {file = "zope.interface-5.4.0.tar.gz", hash = "sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e"}, -] +soupsieve = [] +sphinx = [] +sphinx-book-theme = [] +sphinx-comments = [] +sphinx-copybutton = [] +sphinx-external-toc = [] +sphinx-jupyterbook-latex = [] +sphinx-multitoc-numbering = [] +sphinx-panels = [] +sphinx-thebe = [] +sphinx-togglebutton = [] +sphinxcontrib-applehelp = [] +sphinxcontrib-bibtex = [] +sphinxcontrib-devhelp = [] +sphinxcontrib-drawio = [] +sphinxcontrib-htmlhelp = [] +sphinxcontrib-jsmath = [] +sphinxcontrib-plantuml = [] +sphinxcontrib-qthelp = [] +sphinxcontrib-serializinghtml = [] +sqlalchemy = [] +stack-data = [] +terminado = [] +testpath = [] +tldextract = [] +toml = [] +tornado = [] +tqdm = [] +traitlets = [] +twisted = [] +twisted-iocpsupport = [] +typed-ast = [] +typing-extensions = [] +tzdata = [] +tzlocal = [] +uc-micro-py = [] +urllib3 = [] +uwsgi = [] +w3lib = [] +watchdog = [] +wcwidth = [] +webencodings = [] +websocket-client = [] +websockets = [] +werkzeug = [] +widgetsnbextension = [] +zipp = [] +"zope.interface" = [] diff --git a/pyproject.toml b/pyproject.toml index 5f09c229..85b0471b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ Flask = "^1.1.2" SQLAlchemy = "^1.3.20" dateparser = "^1.0.0" Flask-SQLAlchemy = "^2.4.4" -click = "^7.1.2" +click = "8.1.3" #Flask-MonitoringDashboard = "^3.1.0" Scrapy = "^2.4.1" requests = "^2.25.0" From 83f28598e747570e347eaac52742fd7dd2f55298 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 28 Mar 2023 08:57:59 -0700 Subject: [PATCH 174/301] essentials > optional (DataONEorg/member-repos#67) --- mnonboard/defs.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 4d32caf4..3fcd17ad 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -111,22 +111,23 @@ 'ShapeLoadError': 'Shape graph must load correctly', 'JSONDecodeError': 'Metadata files must be properly formatted json-ld', # science-on-schema.org violations - 'soso:DatasetNS1Shape': 'Expecting SO namespace of not ', - 'soso:DatasetNS2Shape': 'Expecting SO namespace of not ', - 'soso:DatasetNS3Shape': 'Expecting SO namespace of not ', 'soso:IDShape': 'Dataset must have an ID', # schema.org violations 'SO:Dataset-description': 'Dataset must have a description', 'SO:Dataset-identifier': 'Dataset identifiers must be a URL, Text or PropertyValue', 'SO:Dataset-name': 'Name is required for a Dataset', 'SO:Dataset-url': 'Dataset requires a URL for the location of a page describing the dataset', - 'SO:Dataset-version': 'Dataset must have a version as Literal or Number', }, 'optional': { + # science-on-schema.org violations + 'soso:DatasetNS1Shape': 'Expecting SO namespace of not ', + 'soso:DatasetNS2Shape': 'Expecting SO namespace of not ', + 'soso:DatasetNS3Shape': 'Expecting SO namespace of not ', # schema.org violations 'SO:Dataset-isAccessibleForFree': 'It is recommended that a Dataset indicates accessibility for free or otherwise', 'SO:Dataset-keywords': 'A Dataset should include descriptive keywords as literals or DefinedTerm', 'SO:Dataset-sameAs': 'It is recommended that a Dataset includes a sameAs URL', + 'SO:Dataset-version': 'Dataset must have a version as Literal or Number', # SO coordinates 'schema:GeoCoordinates-longitude': 'It is recommended that a Dataset has a longitude coordinate in WGS-84 format', 'schema:GeoCoordinates-latitude': 'It is recommended that a Dataset has a latitude coordinate in WGS-84 format', From 926f03633ff46bdc07e3482d91aa6a0a9eca2d2c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 23 May 2023 21:29:49 +0000 Subject: [PATCH 175/301] fixing dependencies again --- poetry.lock | 3640 ++++++++++++++++++++++-------------------------- pyproject.toml | 13 +- 2 files changed, 1712 insertions(+), 1941 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2871245c..250c4cf3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,18 +1,140 @@ +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. + [[package]] -name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" [[package]] name = "alembic" -version = "1.10.2" +version = "1.11.1" description = "A database migration tool for SQLAlchemy." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "alembic-1.11.1-py3-none-any.whl", hash = "sha256:dc871798a601fab38332e38d6ddb38d5e734f60034baeb8e2db5b642fccd8ab8"}, + {file = "alembic-1.11.1.tar.gz", hash = "sha256:6a810a6b012c88b33458fceb869aef09ac75d6ace5291915ba7fae44de372c01"}, +] [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} @@ -24,23 +146,6 @@ typing-extensions = ">=4" [package.extras] tz = ["python-dateutil"] -[[package]] -name = "anyio" -version = "3.6.2" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] - [[package]] name = "appdirs" version = "1.4.4" @@ -48,89 +153,41 @@ description = "A small Python module for determining appropriate platform-specif category = "main" optional = false python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] [[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "argh" -version = "0.26.2" -description = "An unobtrusive argparse wrapper with natural syntax" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -argon2-cffi-bindings = "*" - -[package.extras] -dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] -docs = ["sphinx", "sphinx-notfound-page", "furo"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -category = "dev" +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" optional = false python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["pytest", "cogapp", "pre-commit", "wheel"] -tests = ["pytest"] - -[[package]] -name = "asttokens" -version = "2.2.1" -description = "Annotate AST trees with source code positions" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -six = "*" - -[package.extras] -test = ["astroid", "pytest"] - -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] [[package]] name = "attrs" -version = "20.3.0" +version = "23.1.0" description = "Classes Without Boilerplate" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "automat" @@ -139,96 +196,47 @@ description = "Self-service finite-state machines for the programmer on the go." category = "main" optional = false python-versions = "*" +files = [ + {file = "Automat-22.10.0-py2.py3-none-any.whl", hash = "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180"}, + {file = "Automat-22.10.0.tar.gz", hash = "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e"}, +] [package.dependencies] attrs = ">=19.2.0" six = "*" [package.extras] -visualize = ["graphviz (>0.5.1)", "Twisted (>=16.1.1)"] - -[[package]] -name = "babel" -version = "2.12.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "dev" -optional = false -python-versions = "*" +visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] [[package]] -name = "backports.zoneinfo" +name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, +] [package.extras] tzdata = ["tzdata"] -[[package]] -name = "beautifulsoup4" -version = "4.12.0" -description = "Screen-scraping library" -category = "dev" -optional = false -python-versions = ">=3.6.0" - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "black" -version = "20.8b1" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] - -[[package]] -name = "bleach" -version = "6.0.0" -description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] - [[package]] name = "cachetools" version = "5.3.0" @@ -236,14 +244,22 @@ description = "Extensible memoizing collections and decorators" category = "main" optional = false 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"}, +] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] [[package]] name = "cffi" @@ -252,6 +268,72 @@ description = "Foreign Function Interface for Python calling C code." category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" @@ -263,6 +345,83 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "main" optional = false 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]] name = "click" @@ -271,6 +430,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -282,22 +445,10 @@ 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" - -[[package]] -name = "comm" -version = "0.1.3" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -traitlets = ">=5.3" - -[package.extras] -lint = ["black (>=22.6.0)", "mdformat-gfm (>=0.3.5)", "mdformat (>0.7)", "ruff (>=0.0.156)"] -test = ["pytest"] -typing = ["mypy (>=0.990)"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "constantly" @@ -306,25 +457,50 @@ description = "Symbolic constants in Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, + {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, +] [[package]] name = "cryptography" -version = "40.0.0" +version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, +] [package.dependencies] cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "ruff", "mypy", "check-manifest"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-shard (>=0.1.2)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] test-randomorder = ["pytest-randomly"] tox = ["tox"] @@ -335,6 +511,48 @@ description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + +[[package]] +name = "dataone-common" +version = "3.5.0" +description = "Contains functionality common to projects that interact with the DataONE infrastructure via Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dataone.common-3.5.0-py3-none-any.whl", hash = "sha256:4a7e5b0c737fb418d46780b8cd4fdfba0ece9c0ee9bf2fc8d2d4ded04ba60952"}, +] + +[package.dependencies] +cryptography = ">=3.0" +iso8601 = ">=0.1.12" +pyasn1 = ">=0.4.8" +PyJWT = ">=1.7.1" +pyxb = ">=1.2.6" +rdflib = ">=5.0.0" +zipstream = ">=1.1.4" + +[[package]] +name = "dataone-libclient" +version = "3.5.0" +description = "A DataONE client library for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dataone.libclient-3.5.0-py3-none-any.whl", hash = "sha256:1bb026f400dacd476866f9c86f029780af7df866f0d10dc474bb14da5a9a09a2"}, +] + +[package.dependencies] +aiohttp = ">=3.6.2" +"dataone.common" = ">=3.5.0" +pyxb = ">=1.2.6" +requests = {version = ">=2.24.0", extras = ["security"]} +requests-toolbelt = ">=0.9.1" [[package]] name = "dateparser" @@ -343,6 +561,10 @@ description = "Date parsing library designed to parse dates from HTML pages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "dateparser-1.1.8-py2.py3-none-any.whl", hash = "sha256:070b29b5bbf4b1ec2cd51c96ea040dc68a614de703910a91ad1abba18f9f379f"}, + {file = "dateparser-1.1.8.tar.gz", hash = "sha256:86b8b7517efcc558f085a142cdb7620f0921543fcabdb538c8a4c4001d8178e3"}, +] [package.dependencies] python-dateutil = "*" @@ -351,49 +573,21 @@ regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27" tzlocal = "*" [package.extras] -calendars = ["hijri-converter", "convertdate"] +calendars = ["convertdate", "hijri-converter"] fasttext = ["fasttext"] langdetect = ["langdetect"] -[[package]] -name = "debugpy" -version = "1.6.6" -description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "diskcache" -version = "5.4.0" +version = "5.6.1" description = "Disk Cache -- Disk and file backed persistent cache." category = "main" optional = false python-versions = ">=3" - -[[package]] -name = "docutils" -version = "0.16" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "diskcache-5.6.1-py3-none-any.whl", hash = "sha256:558c6a2d5d7c721bb00e40711803d6804850c9f76c426ed81ecc627fe9d2ce2d"}, + {file = "diskcache-5.6.1.tar.gz", hash = "sha256:e4c978532feff5814c4cc00fe1e11e40501985946643d73220d41ee7737c72c3"}, +] [[package]] name = "dynaconf" @@ -402,58 +596,36 @@ description = "The dynamic configurator for your Python Project" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "dynaconf-3.1.12-py2.py3-none-any.whl", hash = "sha256:a79d7b3ad4a35af9b576c49f11cd3b23a1b04b87b63a4e9f92cc82f2b0cafeeb"}, + {file = "dynaconf-3.1.12.tar.gz", hash = "sha256:11a60bcd735f82b8a47b288f99e4ffbbd08c6c130a7be93c5d03e93fc260a5e1"}, +] [package.extras] -all = ["redis", "ruamel.yaml", "configobj", "hvac"] +all = ["configobj", "hvac", "redis", "ruamel.yaml"] configobj = ["configobj"] ini = ["configobj"] redis = ["redis"] -test = ["pytest", "pytest-cov", "pytest-xdist", "pytest-mock", "flake8", "pep8-naming", "flake8-debugger", "flake8-print", "flake8-todo", "radon", "flask (>=0.12)", "django", "python-dotenv", "toml", "codecov", "redis", "hvac", "configobj"] +test = ["codecov", "configobj", "django", "flake8", "flake8-debugger", "flake8-print", "flake8-todo", "flask (>=0.12)", "hvac", "pep8-naming", "pytest", "pytest-cov", "pytest-mock", "pytest-xdist", "python-dotenv", "radon", "redis", "toml"] toml = ["toml"] vault = ["hvac"] yaml = ["ruamel.yaml"] -[[package]] -name = "entrypoints" -version = "0.4" -description = "Discover and load entry points from installed packages." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "executing" -version = "1.2.0" -description = "Get the currently executing AST node of a frame, and other information" -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -tests = ["asttokens", "pytest", "littleutils", "rich"] - -[[package]] -name = "fastjsonschema" -version = "2.16.3" -description = "Fastest Python implementation of JSON schema" -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - [[package]] name = "filelock" -version = "3.10.4" +version = "3.12.0" description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" +files = [ + {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-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)", "pytest (>=7.2.2)"] +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 = "flask" @@ -462,6 +634,10 @@ description = "A simple framework for building complex web applications." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Flask-1.1.2-py2.py3-none-any.whl", hash = "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557"}, + {file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"}, +] [package.dependencies] click = ">=5.1" @@ -470,8 +646,8 @@ Jinja2 = ">=2.10.1" Werkzeug = ">=0.15" [package.extras] -dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] -docs = ["sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] +docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] dotenv = ["python-dotenv"] [[package]] @@ -481,6 +657,10 @@ description = "Custom Accept header routing support for Flask" category = "main" optional = false python-versions = "*" +files = [ + {file = "flask_accept-0.0.6-py3-none-any.whl", hash = "sha256:4be4c34aa0a13bb56427e45426297858e3d189bebac415b88694e6489f61d1e0"}, + {file = "flask_accept-0.0.6.tar.gz", hash = "sha256:be48f7d805f1a9dadeabce0fd166404eda92da8d2cf1945237aff278238f4c70"}, +] [package.dependencies] flask = "*" @@ -492,6 +672,10 @@ description = "A Flask extension adding a decorator for CORS support" category = "main" optional = false python-versions = "*" +files = [ + {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, + {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, +] [package.dependencies] Flask = ">=0.9" @@ -504,6 +688,10 @@ description = "Adds SQLAlchemy support to your Flask application." category = "main" optional = false python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" +files = [ + {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, + {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, +] [package.dependencies] Flask = ">=0.10" @@ -511,33 +699,134 @@ SQLAlchemy = ">=0.8.0" [[package]] name = "frozendict" -version = "2.3.6" +version = "2.3.8" description = "A simple immutable dictionary" category = "main" optional = false python-versions = ">=3.6" - -[[package]] -name = "gitdb" -version = "4.0.10" -description = "Git Object Database" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.31" -description = "GitPython is a Python library used to interact with Git repositories" -category = "dev" +files = [ + {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]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" optional = false python-versions = ">=3.7" - -[package.dependencies] -gitdb = ">=4.0.1,<5" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] [[package]] name = "greenlet" @@ -546,10 +835,94 @@ description = "Lightweight in-process concurrent programming" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +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 = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" [package.extras] -docs = ["sphinx", "docutils (<0.18)"] -test = ["objgraph", "psutil"] +all = ["chardet (>=2.2)", "genshi", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] [[package]] name = "hyperlink" @@ -558,6 +931,10 @@ description = "A featureful, immutable, and correct URL for Python." category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, + {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, +] [package.dependencies] idna = ">=2.5" @@ -569,30 +946,30 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.4.1" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "importlib-metadata" -version = "6.1.0" +version = "6.6.0" description = "Read metadata from Python packages" category = "main" 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 = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"] +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 = "importlib-resources" @@ -601,13 +978,17 @@ description = "Read resources from Python packages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "incremental" @@ -616,125 +997,65 @@ description = "\"A small library that versions your Python projects.\"" category = "main" optional = false python-versions = "*" +files = [ + {file = "incremental-22.10.0-py2.py3-none-any.whl", hash = "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51"}, + {file = "incremental-22.10.0.tar.gz", hash = "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0"}, +] [package.extras] -mypy = ["click (>=6.0)", "twisted (>=16.4.0)", "mypy (==0.812)"] +mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"] scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] [[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "ipykernel" -version = "6.22.0" -description = "IPython Kernel for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.6.5" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=20" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest-asyncio", "pytest-cov", "pytest-timeout", "pytest (>=7.0)"] - -[[package]] -name = "ipython" -version = "8.11.0" -description = "IPython: Productive Interactive Computing" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" - -[package.extras] -all = ["black", "ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.21)", "pandas", "trio"] -black = ["black"] -doc = ["ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "trio"] - -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "dev" +name = "iso8601" +version = "1.1.0" +description = "Simple module to parse ISO 8601 dates" +category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6.2,<4.0" +files = [ + {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, + {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, +] [[package]] -name = "ipywidgets" -version = "7.7.4" -description = "IPython HTML widgets for Jupyter" -category = "dev" +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +category = "main" optional = false python-versions = "*" +files = [ + {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, + {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, +] [package.dependencies] -ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} -ipython-genutils = ">=0.2.0,<0.3.0" -jupyterlab-widgets = {version = ">=1.0.0,<3", markers = "python_version >= \"3.6\""} -traitlets = ">=4.3.1" -widgetsnbextension = ">=3.6.0,<3.7.0" - -[package.extras] -test = ["pytest (>=3.6.0)", "pytest-cov", "ipykernel", "mock"] +six = "*" [[package]] name = "itemadapter" -version = "0.7.0" +version = "0.8.0" description = "Common interface for data container classes" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "itemadapter-0.8.0-py3-none-any.whl", hash = "sha256:2ac1fbcc363b789a18639935ca322e50a65a0a7dfdd8d973c34e2c468e6c0f94"}, + {file = "itemadapter-0.8.0.tar.gz", hash = "sha256:77758485fb0ac10730d4b131363e37d65cb8db2450bfec7a57c3f3271f4a48a9"}, +] [[package]] name = "itemloaders" -version = "1.0.6" +version = "1.1.0" description = "Base library for scrapy's ItemLoader" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "itemloaders-1.1.0-py3-none-any.whl", hash = "sha256:c8c82fe0c11fc4cdd08ec04df0b3c43f3cb7190002edb517e02d55de8efc2aeb"}, + {file = "itemloaders-1.1.0.tar.gz", hash = "sha256:21d81c61da6a08b48e5996288cdf3031c0f92e5d0075920a0242527523e14a48"}, +] [package.dependencies] itemadapter = ">=0.1.0" @@ -744,41 +1065,33 @@ w3lib = ">=1.17.0" [[package]] name = "itsdangerous" -version = "2.1.2" +version = "2.0.1" description = "Safely pass data to untrusted environments and back." category = "main" optional = false -python-versions = ">=3.7" - -[[package]] -name = "jedi" -version = "0.18.2" -description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" -optional = false python-versions = ">=3.6" - -[package.dependencies] -parso = ">=0.8.0,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx-rtd-theme (==0.4.3)", "sphinx (==1.8.5)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +files = [ + {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, + {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, +] [[package]] name = "jinja2" -version = "3.1.2" +version = "2.11.3" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, +] [package.dependencies] -MarkupSafe = ">=2.0" +MarkupSafe = ">=0.23" [package.extras] -i18n = ["Babel (>=2.7)"] +i18n = ["Babel (>=0.8)"] [[package]] name = "jmespath" @@ -787,686 +1100,366 @@ description = "JSON Matching Expressions" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] [[package]] -name = "jsonschema" -version = "4.17.3" -description = "An implementation of JSON Schema validation for Python" -category = "dev" +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 = ">=3.7" - -[package.dependencies] -attrs = ">=17.4.0" -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} -pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] [package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] [[package]] -name = "jupyter-book" -version = "0.11.3" -description = "Jupyter Book: Create an online book with Jupyter Notebooks" -category = "dev" +name = "mako" +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] [package.dependencies] -click = "*" -docutils = ">=0.15,<0.17" -jsonschema = "*" -jupytext = ">=1.8,<1.11" -linkify-it-py = ">=1.0.1,<1.1.0" -myst-nb = ">=0.12.0,<0.13.0" -pyyaml = "*" -sphinx = ">=2,<4" -sphinx-book-theme = ">=0.1.3,<0.2.0" -sphinx-comments = "*" -sphinx-copybutton = "*" -sphinx-external-toc = ">=0.2.1,<0.3.0" -sphinx-jupyterbook-latex = ">=0.4.2,<0.5.0" -sphinx-multitoc-numbering = ">=0.1.3,<0.2.0" -sphinx-panels = ">=0.5.2,<0.6.0" -sphinx-thebe = ">=0.0.10,<0.1.0" -sphinx-togglebutton = "*" -sphinxcontrib-bibtex = ">=2.2.0,<2.3.0" +MarkupSafe = ">=0.9.2" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] -pdfhtml = ["pyppeteer"] -sphinx = ["altair", "bokeh", "folium", "ipywidgets", "matplotlib", "nbclient", "numpy", "pandas", "plotly", "sphinx-click", "sphinx-inline-tabs", "sphinxext-rediraffe (>=0.2.3,<0.3.0)", "sympy"] -testing = ["altair", "beautifulsoup4", "cookiecutter", "coverage", "matplotlib", "pyppeteer", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "pytest-timeout", "pytest-xdist", "sphinx-click", "sphinx-tabs", "texsoup"] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] [[package]] -name = "jupyter-cache" -version = "0.4.3" -description = "A defined interface for working with a cache of jupyter notebooks." -category = "dev" +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "org-webpki-json" +version = "0.1.0" +description = "rfc8785 JSON canonicalization" +category = "main" +optional = false +python-versions = "^3.6" +files = [] +develop = false -[package.dependencies] -attrs = "*" -nbclient = ">=0.2,<0.6" -nbdime = "*" -nbformat = "*" -sqlalchemy = ">=1.3.12,<1.5" - -[package.extras] -cli = ["click", "click-completion", "click-log", "tabulate", "pyyaml"] -code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] -rtd = ["myst-nb (>=0.7,<1.0)", "sphinx-copybutton", "pydata-sphinx-theme"] -testing = ["ipykernel", "coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "matplotlib", "numpy", "sympy", "pandas", "nbformat (>=5.1)"] +[package.source] +type = "git" +url = "https://github.com/datadavev/json-canonicalization.git" +reference = "develop" +resolved_reference = "3d7ef90bf7c740841473877537302feddd229a3e" [[package]] -name = "jupyter-client" -version = "8.1.0" -description = "Jupyter protocol implementation and client libraries" -category = "dev" +name = "owlrl" +version = "6.0.2" +description = "OWL-RL and RDFS based RDF Closure inferencing for Python" +category = "main" optional = false -python-versions = ">=3.8" +python-versions = "*" +files = [ + {file = "owlrl-6.0.2-py3-none-any.whl", hash = "sha256:57eca06b221edbbc682376c8d42e2ddffc99f61e82c0da02e26735592f08bacc"}, + {file = "owlrl-6.0.2.tar.gz", hash = "sha256:904e3310ff4df15101475776693d2427d1f8244ee9a6a9f9e13c3c57fae90b74"}, +] [package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" -traitlets = ">=5.3" - -[package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinx (>=4)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["codecov", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] - -[[package]] -name = "jupyter-core" -version = "5.3.0" -description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-server" -version = "1.15.6" -description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -anyio = ">=3.1.0" -argon2-cffi = "*" -jinja2 = "*" -jupyter-client = ">=6.1.1" -jupyter-core = ">=4.6.0" -nbconvert = "*" -nbformat = ">=5.2.0" -packaging = "*" -prometheus-client = "*" -pywinpty = {version = "*", markers = "os_name == \"nt\""} -pyzmq = ">=17" -Send2Trash = "*" -terminado = ">=0.8.3" -tornado = ">=6.1.0" -traitlets = ">=5" -websocket-client = "*" - -[package.extras] -test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "pytest-timeout", "requests", "pytest-tornasync", "pytest-console-scripts", "ipykernel"] - -[[package]] -name = "jupyter-server-mathjax" -version = "0.2.6" -description = "MathJax resources as a Jupyter Server Extension." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -jupyter-server = ">=1.1" - -[package.extras] -test = ["jupyter-server", "pytest"] - -[[package]] -name = "jupyter-sphinx" -version = "0.3.2" -description = "Jupyter Sphinx Extensions" -category = "dev" -optional = false -python-versions = ">= 3.6" - -[package.dependencies] -IPython = "*" -ipywidgets = ">=7.0.0" -nbconvert = ">=5.5" -nbformat = "*" -Sphinx = ">=2" - -[[package]] -name = "jupyterlab-widgets" -version = "1.1.3" -description = "A JupyterLab extension." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "jupytext" -version = "1.10.3" -description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" -category = "dev" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -markdown-it-py = ">=0.6.0,<0.7.0" -nbformat = "*" -pyyaml = "*" -toml = "*" - -[package.extras] -rst2md = ["sphinx-gallery (>=0.7.0,<0.8.0)"] -toml = ["toml"] - -[[package]] -name = "latexcodec" -version = "2.0.1" -description = "A lexer and codec to work with LaTeX code in Python." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -six = ">=1.4.1" - -[[package]] -name = "linkify-it-py" -version = "1.0.3" -description = "Links recognition library with FULL unicode support." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -uc-micro-py = "*" - -[package.extras] -benchmark = ["pytest", "pytest-benchmark"] -dev = ["pre-commit", "isort", "flake8", "black"] -doc = ["sphinx", "sphinx-book-theme", "myst-parser"] -test = ["coverage", "pytest", "pytest-cov"] - -[[package]] -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.*" - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] -source = ["Cython (>=0.29.7)"] - -[[package]] -name = "mako" -version = "1.2.4" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["babel"] -lingua = ["lingua"] -testing = ["pytest"] - -[[package]] -name = "markdown-it-py" -version = "0.6.2" -description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -attrs = ">=19,<21" -mdit-py-plugins = ">=0.2.1,<0.3.0" - -[package.extras] -code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistune (>=0.8.4,<0.9.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "panflute (>=1.12,<2.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["myst-nb (>=0.11.1,<0.12.0)", "sphinx-book-theme", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-copybutton", "sphinx (>=2,<4)", "pyyaml"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "pytest-benchmark (>=3.2,<4.0)", "psutil"] - -[[package]] -name = "markupsafe" -version = "2.1.2" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "matplotlib-inline" -version = "0.1.6" -description = "Inline Matplotlib backend for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mdit-py-plugins" -version = "0.2.6" -description = "Collection of plugins for markdown-it-py" -category = "dev" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -markdown-it-py = ">=0.5.8,<2.0.0" - -[package.extras] -code_style = ["pre-commit (==2.6)"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "myst-nb" -version = "0.12.3" -description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -docutils = ">=0.15" -importlib-metadata = "*" -ipython = "*" -ipywidgets = ">=7.0.0,<8" -jupyter-cache = ">=0.4.1,<0.5.0" -jupyter-sphinx = ">=0.3.2,<0.4.0" -myst-parser = ">=0.13.5,<0.14.0" -nbconvert = ">=5.6,<6.0" -nbformat = ">=5.0,<6.0" -pyyaml = "*" -sphinx = ">=2,<4" -sphinx-togglebutton = ">=0.2.2,<0.3.0" - -[package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] -rtd = ["alabaster", "altair", "bokeh", "coconut (>=1.4.3,<1.5.0)", "ipywidgets", "jupytext (>=1.8.0,<1.9.0)", "matplotlib", "numpy", "pandas", "plotly", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-copybutton", "sphinx-panels (>=0.4.1,<0.5.0)", "sphinxcontrib-bibtex", "sympy"] -testing = ["coverage (<5.0)", "jupytext (>=1.8.0,<1.9.0)", "matplotlib (>=3.3.0,<3.4.0)", "numpy", "pandas", "pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions", "sympy"] - -[[package]] -name = "myst-parser" -version = "0.13.7" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -docutils = ">=0.15,<0.18" -jinja2 = "*" -markdown-it-py = ">=0.6.2,<0.7.0" -mdit-py-plugins = ">=0.2.5,<0.3.0" -pyyaml = "*" -sphinx = ">=2.1,<4" - -[package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)"] -testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "nbclassic" -version = "0.5.3" -description = "Jupyter Notebook as a Jupyter Server extension." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=6.1.1" -jupyter-core = ">=4.6.1" -jupyter-server = ">=1.8" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -notebook-shim = ">=0.1.0" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] -json-logging = ["json-logging"] -test = ["pytest", "coverage", "requests", "testpath", "nbval", "pytest-playwright", "pytest-cov", "pytest-jupyter", "pytest-tornasync", "requests-unixsocket"] - -[[package]] -name = "nbclient" -version = "0.5.13" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" -optional = false -python-versions = ">=3.7.0" - -[package.dependencies] -jupyter-client = ">=6.1.5" -nbformat = ">=5.0" -nest-asyncio = "*" -traitlets = ">=5.0.0" - -[package.extras] -sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] -test = ["ipython (<8.0.0)", "ipykernel", "ipywidgets (<8.0.0)", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "xmltodict", "black", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)"] - -[[package]] -name = "nbconvert" -version = "5.6.1" -description = "Converting Jupyter Notebooks" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -bleach = "*" -defusedxml = "*" -entrypoints = ">=0.2.2" -jinja2 = ">=2.4" -jupyter-core = "*" -mistune = ">=0.8.1,<2" -nbformat = ">=4.4" -pandocfilters = ">=1.4.1" -pygments = "*" -testpath = "*" -traitlets = ">=4.2" - -[package.extras] -all = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "mock"] -docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "jupyter-client (>=5.3.1)"] -execute = ["jupyter-client (>=5.3.1)"] -serve = ["tornado (>=4.0)"] -test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "mock"] - -[[package]] -name = "nbdime" -version = "3.1.1" -description = "Diff and merge of Jupyter Notebooks" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -colorama = "*" -GitPython = "<2.1.4 || >2.1.4,<2.1.5 || >2.1.5,<2.1.6 || >2.1.6" -jinja2 = ">=2.9" -jupyter-server = "*" -jupyter-server-mathjax = ">=0.2.2" -nbformat = "*" -pygments = "*" -requests = "*" -tornado = "*" - -[package.extras] -docs = ["sphinx", "recommonmark", "sphinx-rtd-theme"] -test = ["pytest (>=3.6)", "pytest-cov", "pytest-timeout", "pytest-tornado", "jupyter-server", "jsonschema", "mock", "notebook", "requests", "tabulate"] - -[[package]] -name = "nbformat" -version = "5.8.0" -description = "The Jupyter Notebook format" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -fastjsonschema = "*" -jsonschema = ">=2.6" -jupyter-core = "*" -traitlets = ">=5.1" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] - -[[package]] -name = "nest-asyncio" -version = "1.5.6" -description = "Patch asyncio to allow nested event loops" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "notebook" -version = "6.5.3" -description = "A web-based notebook environment for interactive computing" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=5.3.4" -jupyter-core = ">=4.6.1" -nbclassic = ">=0.4.7" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] -json-logging = ["json-logging"] -test = ["pytest", "coverage", "requests", "testpath", "nbval", "selenium (==4.1.5)", "pytest-cov", "requests-unixsocket"] - -[[package]] -name = "notebook-shim" -version = "0.2.2" -description = "A shim layer for notebook traits and config" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -jupyter-server = ">=1.8,<3" - -[package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-tornasync"] - -[[package]] -name = "org.webpki.json" -version = "0.1.0" -description = "rfc8785 JSON canonicalization" -category = "main" -optional = false -python-versions = "^3.6" -develop = false - -[package.source] -type = "git" -url = "https://github.com/datadavev/json-canonicalization.git" -reference = "develop" -resolved_reference = "3d7ef90bf7c740841473877537302feddd229a3e" +rdflib = ">=6.0.2" [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" - -[[package]] -name = "pandocfilters" -version = "1.5.0" -description = "Utilities for writing pandoc filters in python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "parsel" -version = "1.7.0" +version = "1.8.1" description = "Parsel is a library to extract data from HTML and XML using XPath and CSS selectors" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "parsel-1.8.1-py2.py3-none-any.whl", hash = "sha256:2708fc74daeeb4ce471e2c2e9089b650ec940c7a218053e57421e69b5b00f82c"}, + {file = "parsel-1.8.1.tar.gz", hash = "sha256:aff28e68c9b3f1a901db2a4e3f158d8480a38724d7328ee751c1a4e1c1801e39"}, +] [package.dependencies] cssselect = ">=0.9" +jmespath = "*" lxml = "*" packaging = "*" w3lib = ">=1.19.0" [[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -category = "dev" +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" - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - -[[package]] -name = "pathspec" -version = "0.11.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "dev" -optional = false -python-versions = "*" +files = [ + {file = "prettytable-2.5.0-py3-none-any.whl", hash = "sha256:1411c65d21dca9eaa505ba1d041bed75a6d629ae22f5109a923f4e719cfecba4"}, + {file = "prettytable-2.5.0.tar.gz", hash = "sha256:f7da57ba63d55116d65e5acb147bfdfa60dceccabf0d607d6817ee2888a05f2c"}, +] [package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pkgutil-resolve-name" -version = "1.3.10" -description = "Resolve a name to an object." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "platformdirs" -version = "3.1.1" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2.1)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "prometheus-client" -version = "0.16.0" -description = "Python client for the Prometheus monitoring system." -category = "dev" -optional = false -python-versions = ">=3.6" +wcwidth = "*" [package.extras] -twisted = ["twisted"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.38" -description = "Library for building powerful interactive command lines in Python" -category = "dev" -optional = false -python-versions = ">=3.7.0" - -[package.dependencies] -wcwidth = "*" +tests = ["pytest", "pytest-cov", "pytest-lazy-fixture"] [[package]] name = "protego" @@ -1475,94 +1468,40 @@ description = "Pure-Python robots.txt parser with support for modern conventions category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Protego-0.2.1-py2.py3-none-any.whl", hash = "sha256:04419b18f20e8909f1691c6b678392988271cc2a324a72f9663cb3af838b4bf7"}, + {file = "Protego-0.2.1.tar.gz", hash = "sha256:df666d4304dab774e2dc9feb208bb1ac8d71ea5ceec12f4c99eba30fbd642ff2"}, +] [package.dependencies] six = "*" -[[package]] -name = "psutil" -version = "5.9.4" -description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -tests = ["pytest"] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" category = "main" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" category = "main" optional = false -python-versions = "*" - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" - -[[package]] -name = "pybtex" -version = "0.24.0" -description = "A BibTeX-compatible bibliography processor in Python" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" - -[package.dependencies] -latexcodec = ">=1.0.4" -PyYAML = ">=3.01" -six = "*" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "pybtex-docutils" -version = "1.0.2" -description = "A docutils backend for pybtex." -category = "dev" -optional = false -python-versions = ">=3.6" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] [package.dependencies] -docutils = ">=0.8" -pybtex = ">=0.16" +pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pycparser" @@ -1571,23 +1510,10 @@ description = "C parser in Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pydata-sphinx-theme" -version = "0.7.2" -description = "Bootstrap-based Sphinx theme from the PyData community" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -beautifulsoup4 = "*" -docutils = "!=0.17.0" -sphinx = "*" - -[package.extras] -coverage = ["pytest-cov", "codecov", "sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "sphinx-sitemap", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] -test = ["sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "sphinx-sitemap", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pydispatcher" @@ -1596,6 +1522,10 @@ description = "Multi-producer multi-consumer in-memory signal dispatch system" category = "main" optional = false python-versions = "*" +files = [ + {file = "PyDispatcher-2.0.7-py3-none-any.whl", hash = "sha256:96543bea04115ffde08f851e1d45cacbfd1ee866ac42127d9b476dc5aefa7de0"}, + {file = "PyDispatcher-2.0.7.tar.gz", hash = "sha256:b777c6ad080dc1bad74a4c29d6a46914fa6701ac70f94b0d66fbcfde62f5be31"}, +] [package.extras] dev = ["tox"] @@ -1607,25 +1537,37 @@ description = "A port of node.js's EventEmitter to python." category = "main" optional = false python-versions = "*" +files = [ + {file = "pyee-8.2.2-py2.py3-none-any.whl", hash = "sha256:c09f56e36eb10bf23aa2aacf145f690ded75b990a3d9523fd478b005940303d2"}, + {file = "pyee-8.2.2.tar.gz", hash = "sha256:5c7e60f8df95710dbe17550e16ce0153f83990c00ef744841b43f371ed53ebea"}, +] [[package]] -name = "pygments" -version = "2.14.0" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" +name = "pyjwt" +version = "2.7.0" +description = "JSON Web Token implementation in Python" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, + {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, +] [package.extras] -plugins = ["importlib-metadata"] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "PyLD" -version = "2.0.4.dev0" +version = "2.1.0" description = "Python implementation of the JSON-LD API" category = "main" optional = false python-versions = "*" +files = [] develop = false [package.dependencies] @@ -1642,16 +1584,20 @@ requests = ["requests"] [package.source] type = "git" url = "https://github.com/datadavev/pyld.git" -reference = "2.0.4-dev_ddv-0.1" -resolved_reference = "db1bb4a80171aa621c7f2b1bdadb74e41351360e" +reference = "ddv-2.1.0" +resolved_reference = "f5711b40d40d2fe43e0e68cb17005cf198757771" [[package]] name = "pyopenssl" -version = "23.1.0" +version = "23.1.1" description = "Python wrapper module around the OpenSSL library" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyOpenSSL-23.1.1-py3-none-any.whl", hash = "sha256:9e0c526404a210df9d2b18cd33364beadb0dc858a739b885677bc65e105d4a4c"}, + {file = "pyOpenSSL-23.1.1.tar.gz", hash = "sha256:841498b9bec61623b1b6c47ebbc02367c07d60e0e195f19790817f10cc8db0b7"}, +] [package.dependencies] cryptography = ">=38.0.0,<41" @@ -1660,6 +1606,21 @@ cryptography = ">=38.0.0,<41" docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] test = ["flaky", "pretend", "pytest (>=3.0.1)"] +[[package]] +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 = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pyppeteer" version = "1.0.2" @@ -1667,6 +1628,10 @@ description = "Headless chrome/chromium automation library (unofficial port of p category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "pyppeteer-1.0.2-py3-none-any.whl", hash = "sha256:11a734d8f02c6b128035aba8faf32748f2016310a6a1cbc6aa5b1e2580742e8f"}, + {file = "pyppeteer-1.0.2.tar.gz", hash = "sha256:ddb0d15cb644720160d49abb1ad0d97e87a55581febf1b7531be9e983aad7742"}, +] [package.dependencies] appdirs = ">=1.4.3,<2.0.0" @@ -1684,35 +1649,35 @@ description = "Multi-producer-multi-consumer signal dispatching mechanism" category = "main" optional = false python-versions = "*" +files = [ + {file = "PyPyDispatcher-2.1.2.tar.gz", hash = "sha256:b6bec5dfcff9d2535bca2b23c80eae367b1ac250a645106948d315fcfa9130f2"}, +] [[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -category = "dev" +name = "pyshacl" +version = "0.22.2" +description = "Python SHACL Validator" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7.0,<4.0.0" +files = [ + {file = "pyshacl-0.22.2-py3-none-any.whl", hash = "sha256:d7188d955c52bb37c4be25d46ce0e57a41e6e3fcf47265117a4f734b5788ca5f"}, + {file = "pyshacl-0.22.2.tar.gz", hash = "sha256:a9cbba8048438410eca0ee437df2cc55612cf5ed14574dc9524713063d10d3e4"}, +] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" +html5lib = ">=1.1,<2" +owlrl = ">=6.0.2,<7" +packaging = ">=21.3" +prettytable = ">=2.2.1,<3.0.0" +rdflib = ">=6.2.0,<7" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +dev-coverage = ["coverage (>6.1,!=6.1.1,<7)", "platformdirs", "pytest-cov (>=2.8.1,<3.0.0)"] +dev-lint = ["black (==22.8.0)", "flake8 (>=5.0.4,<6.0.0)", "isort (>=5.10.1,<6.0.0)", "platformdirs"] +dev-type-checking = ["mypy (>=0.800,<0.900)", "mypy (>=0.900,<0.1000)", "platformdirs", "types-setuptools"] +http = ["sanic (>=22.12,<23)", "sanic-cors (==2.2.0)", "sanic-ext (>=23.3,<23.6)"] +js = ["pyduktape2 (>=0.4.2,<0.5.0)"] [[package]] name = "python-dateutil" @@ -1721,6 +1686,10 @@ description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -1732,95 +1701,187 @@ description = "File type identification using libmagic" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, + {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, +] [[package]] name = "pytz" -version = "2022.7.1" +version = "2023.3" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] [[package]] -name = "pytz-deprecation-shim" -version = "0.1.0.post0" -description = "Shims to make deprecation of pytz easier" +name = "pyxb" +version = "1.2.6" +description = "Python XML Schema Bindings" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} -tzdata = {version = "*", markers = "python_version >= \"3.6\""} - -[[package]] -name = "pywin32" -version = "305" -description = "Python for Window Extensions" -category = "dev" -optional = false python-versions = "*" +files = [ + {file = "PyXB-1.2.6.tar.gz", hash = "sha256:2a00f38dd1d87b88f92d79bc5a09718d730419b88e814545f472bbd5a3bf27b4"}, +] [[package]] -name = "pywinpty" -version = "2.0.10" -description = "Pseudo terminal support for Windows from Python." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "dev" +name = "queuelib" +version = "1.6.2" +description = "Collection of persistent (disk-based) and non-persistent (memory-based) queues" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.5" +files = [ + {file = "queuelib-1.6.2-py2.py3-none-any.whl", hash = "sha256:4b96d48f650a814c6fb2fd11b968f9c46178b683aad96d68f930fe13a8574d19"}, + {file = "queuelib-1.6.2.tar.gz", hash = "sha256:4b207267f2642a8699a1f806045c56eb7ad1a85a10c0e249884580d139c2fcd2"}, +] [[package]] -name = "pyzmq" -version = "25.0.2" -description = "Python bindings for 0MQ" -category = "dev" +name = "rdflib" +version = "6.3.2" +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.6" +python-versions = ">=3.7,<4.0" +files = [ + {file = "rdflib-6.3.2-py3-none-any.whl", hash = "sha256:36b4e74a32aa1e4fa7b8719876fb192f19ecd45ff932ea5ebbd2e417a0247e63"}, + {file = "rdflib-6.3.2.tar.gz", hash = "sha256:72af591ff704f4caacea7ecc0c5a9056b8553e0489dd4f35a9bc52dbd41522e0"}, +] [package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} +isodate = ">=0.6.0,<0.7.0" +pyparsing = ">=2.1.0,<4" -[[package]] -name = "queuelib" -version = "1.6.2" -description = "Collection of persistent (disk-based) and non-persistent (memory-based) queues" -category = "main" -optional = false -python-versions = ">=3.5" +[package.extras] +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 = "regex" -version = "2023.3.23" +version = "2023.5.5" description = "Alternative regular expression module, to replace re." category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" +files = [ + {file = "regex-2023.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48c9ec56579d4ba1c88f42302194b8ae2350265cb60c64b7b9a88dcb7fbde309"}, + {file = "regex-2023.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f4541550459c08fdd6f97aa4e24c6f1932eec780d58a2faa2068253df7d6ff"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e22e4460f0245b468ee645156a4f84d0fc35a12d9ba79bd7d79bdcd2f9629d"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b870b6f632fc74941cadc2a0f3064ed8409e6f8ee226cdfd2a85ae50473aa94"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:171c52e320fe29260da550d81c6b99f6f8402450dc7777ef5ced2e848f3b6f8f"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad5524c2aedaf9aa14ef1bc9327f8abd915699dea457d339bebbe2f0d218f86"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a0f874ee8c0bc820e649c900243c6d1e6dc435b81da1492046716f14f1a2a96"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e645c757183ee0e13f0bbe56508598e2d9cd42b8abc6c0599d53b0d0b8dd1479"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a4c5da39bca4f7979eefcbb36efea04471cd68db2d38fcbb4ee2c6d440699833"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5e3f4468b8c6fd2fd33c218bbd0a1559e6a6fcf185af8bb0cc43f3b5bfb7d636"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:59e4b729eae1a0919f9e4c0fc635fbcc9db59c74ad98d684f4877be3d2607dd6"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ba73a14e9c8f9ac409863543cde3290dba39098fc261f717dc337ea72d3ebad2"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0bbd5dcb19603ab8d2781fac60114fb89aee8494f4505ae7ad141a3314abb1f9"}, + {file = "regex-2023.5.5-cp310-cp310-win32.whl", hash = "sha256:40005cbd383438aecf715a7b47fe1e3dcbc889a36461ed416bdec07e0ef1db66"}, + {file = "regex-2023.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:59597cd6315d3439ed4b074febe84a439c33928dd34396941b4d377692eca810"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f08276466fedb9e36e5193a96cb944928301152879ec20c2d723d1031cd4ddd"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd46f30e758629c3ee91713529cfbe107ac50d27110fdcc326a42ce2acf4dafc"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2910502f718828cecc8beff004917dcf577fc5f8f5dd40ffb1ea7612124547b"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:445d6f4fc3bd9fc2bf0416164454f90acab8858cd5a041403d7a11e3356980e8"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18196c16a584619c7c1d843497c069955d7629ad4a3fdee240eb347f4a2c9dbe"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d430a23b661629661f1fe8395be2004006bc792bb9fc7c53911d661b69dd7e"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a28979cc667e5f82ef433db009184e7ac277844eea0f7f4d254b789517941d"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f764e4dfafa288e2eba21231f455d209f4709436baeebb05bdecfb5d8ddc3d35"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23d86ad2121b3c4fc78c58f95e19173790e22ac05996df69b84e12da5816cb17"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:690a17db524ee6ac4a27efc5406530dd90e7a7a69d8360235323d0e5dafb8f5b"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1ecf3dcff71f0c0fe3e555201cbe749fa66aae8d18f80d2cc4de8e66df37390a"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:811040d7f3dd9c55eb0d8b00b5dcb7fd9ae1761c454f444fd9f37fe5ec57143a"}, + {file = "regex-2023.5.5-cp311-cp311-win32.whl", hash = "sha256:c8c143a65ce3ca42e54d8e6fcaf465b6b672ed1c6c90022794a802fb93105d22"}, + {file = "regex-2023.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:586a011f77f8a2da4b888774174cd266e69e917a67ba072c7fc0e91878178a80"}, + {file = "regex-2023.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b6365703e8cf1644b82104cdd05270d1a9f043119a168d66c55684b1b557d008"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a56c18f21ac98209da9c54ae3ebb3b6f6e772038681d6cb43b8d53da3b09ee81"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b942d8b3ce765dbc3b1dad0a944712a89b5de290ce8f72681e22b3c55f3cc8"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:844671c9c1150fcdac46d43198364034b961bd520f2c4fdaabfc7c7d7138a2dd"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ce65bdeaf0a386bb3b533a28de3994e8e13b464ac15e1e67e4603dd88787fa"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fee0016cc35a8a91e8cc9312ab26a6fe638d484131a7afa79e1ce6165328a135"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18f05d14f14a812fe9723f13afafefe6b74ca042d99f8884e62dbd34dcccf3e2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:941b3f1b2392f0bcd6abf1bc7a322787d6db4e7457be6d1ffd3a693426a755f2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:921473a93bcea4d00295799ab929522fc650e85c6b9f27ae1e6bb32a790ea7d3"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:e2205a81f815b5bb17e46e74cc946c575b484e5f0acfcb805fb252d67e22938d"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:385992d5ecf1a93cb85adff2f73e0402dd9ac29b71b7006d342cc920816e6f32"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:890a09cb0a62198bff92eda98b2b507305dd3abf974778bae3287f98b48907d3"}, + {file = "regex-2023.5.5-cp36-cp36m-win32.whl", hash = "sha256:821a88b878b6589c5068f4cc2cfeb2c64e343a196bc9d7ac68ea8c2a776acd46"}, + {file = "regex-2023.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:7918a1b83dd70dc04ab5ed24c78ae833ae8ea228cef84e08597c408286edc926"}, + {file = "regex-2023.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:338994d3d4ca4cf12f09822e025731a5bdd3a37aaa571fa52659e85ca793fb67"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a69cf0c00c4d4a929c6c7717fd918414cab0d6132a49a6d8fc3ded1988ed2ea"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f5e06df94fff8c4c85f98c6487f6636848e1dc85ce17ab7d1931df4a081f657"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8906669b03c63266b6a7693d1f487b02647beb12adea20f8840c1a087e2dfb5"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fda3e50abad8d0f48df621cf75adc73c63f7243cbe0e3b2171392b445401550"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac2b7d341dc1bd102be849d6dd33b09701223a851105b2754339e390be0627a"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb2b495dd94b02de8215625948132cc2ea360ae84fe6634cd19b6567709c8ae2"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aa7d032c1d84726aa9edeb6accf079b4caa87151ca9fabacef31fa028186c66d"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d45864693351c15531f7e76f545ec35000d50848daa833cead96edae1665559"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21e90a288e6ba4bf44c25c6a946cb9b0f00b73044d74308b5e0afd190338297c"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:10250a093741ec7bf74bcd2039e697f519b028518f605ff2aa7ac1e9c9f97423"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6b8d0c153f07a953636b9cdb3011b733cadd4178123ef728ccc4d5969e67f3c2"}, + {file = "regex-2023.5.5-cp37-cp37m-win32.whl", hash = "sha256:10374c84ee58c44575b667310d5bbfa89fb2e64e52349720a0182c0017512f6c"}, + {file = "regex-2023.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9b320677521aabf666cdd6e99baee4fb5ac3996349c3b7f8e7c4eee1c00dfe3a"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:afb1c70ec1e594a547f38ad6bf5e3d60304ce7539e677c1429eebab115bce56e"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf123225945aa58b3057d0fba67e8061c62d14cc8a4202630f8057df70189051"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99757ad7fe5c8a2bb44829fc57ced11253e10f462233c1255fe03888e06bc19"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a623564d810e7a953ff1357f7799c14bc9beeab699aacc8b7ab7822da1e952b8"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ced02e3bd55e16e89c08bbc8128cff0884d96e7f7a5633d3dc366b6d95fcd1d6"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cbe6b5be3b9b698d8cc4ee4dee7e017ad655e83361cd0ea8e653d65e469468"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a6e4b0e0531223f53bad07ddf733af490ba2b8367f62342b92b39b29f72735a"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e9c4f778514a560a9c9aa8e5538bee759b55f6c1dcd35613ad72523fd9175b8"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:256f7f4c6ba145f62f7a441a003c94b8b1af78cee2cccacfc1e835f93bc09426"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd7b68fd2e79d59d86dcbc1ccd6e2ca09c505343445daaa4e07f43c8a9cc34da"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4a5059bd585e9e9504ef9c07e4bc15b0a621ba20504388875d66b8b30a5c4d18"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6893544e06bae009916a5658ce7207e26ed17385149f35a3125f5259951f1bbe"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c64d5abe91a3dfe5ff250c6bb267ef00dbc01501518225b45a5f9def458f31fb"}, + {file = "regex-2023.5.5-cp38-cp38-win32.whl", hash = "sha256:7923470d6056a9590247ff729c05e8e0f06bbd4efa6569c916943cb2d9b68b91"}, + {file = "regex-2023.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:4035d6945cb961c90c3e1c1ca2feb526175bcfed44dfb1cc77db4fdced060d3e"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50fd2d9b36938d4dcecbd684777dd12a407add4f9f934f235c66372e630772b0"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d19e57f888b00cd04fc38f5e18d0efbd91ccba2d45039453ab2236e6eec48d4d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd966475e963122ee0a7118ec9024388c602d12ac72860f6eea119a3928be053"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db09e6c18977a33fea26fe67b7a842f706c67cf8bda1450974d0ae0dd63570df"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6164d4e2a82f9ebd7752a06bd6c504791bedc6418c0196cd0a23afb7f3e12b2d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84397d3f750d153ebd7f958efaa92b45fea170200e2df5e0e1fd4d85b7e3f58a"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c3efee9bb53cbe7b285760c81f28ac80dc15fa48b5fe7e58b52752e642553f1"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:144b5b017646b5a9392a5554a1e5db0000ae637be4971c9747566775fc96e1b2"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1189fbbb21e2c117fda5303653b61905aeeeea23de4a94d400b0487eb16d2d60"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f83fe9e10f9d0b6cf580564d4d23845b9d692e4c91bd8be57733958e4c602956"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:72aa4746993a28c841e05889f3f1b1e5d14df8d3daa157d6001a34c98102b393"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:de2f780c3242ea114dd01f84848655356af4dd561501896c751d7b885ea6d3a1"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:290fd35219486dfbc00b0de72f455ecdd63e59b528991a6aec9fdfc0ce85672e"}, + {file = "regex-2023.5.5-cp39-cp39-win32.whl", hash = "sha256:732176f5427e72fa2325b05c58ad0b45af341c459910d766f814b0584ac1f9ac"}, + {file = "regex-2023.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:1307aa4daa1cbb23823d8238e1f61292fd07e4e5d8d38a6efff00b67a7cdb764"}, + {file = "regex-2023.5.5.tar.gz", hash = "sha256:7d76a8a1fc9da08296462a18f16620ba73bcbf5909e42383b253ef34d9d5141e"}, +] [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {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)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-file" @@ -1829,18 +1890,41 @@ description = "File transport adapter for Requests" category = "main" optional = false python-versions = "*" +files = [ + {file = "requests-file-1.5.1.tar.gz", hash = "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e"}, + {file = "requests_file-1.5.1-py2.py3-none-any.whl", hash = "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953"}, +] + +[package.dependencies] +requests = ">=1.0.0" +six = "*" + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] [package.dependencies] -requests = ">=1.0.0" -six = "*" +requests = ">=2.0.1,<3.0.0" [[package]] name = "scrapy" -version = "2.8.0" +version = "2.9.0" description = "A high-level Web Crawling and Web Scraping framework" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Scrapy-2.9.0-py2.py3-none-any.whl", hash = "sha256:908fdb7874d235230a16fa288637e3f673813cf27fb177f589b5a22bad00b0f9"}, + {file = "Scrapy-2.9.0.tar.gz", hash = "sha256:564c972b56e54b83141f395ce3f6a25bfe2093d61d13f9b81d05384e19db98da"}, +] [package.dependencies] cryptography = ">=3.4.6" @@ -1856,6 +1940,7 @@ pyOpenSSL = ">=21.0.0" PyPyDispatcher = {version = ">=2.1.0", markers = "platform_python_implementation == \"PyPy\""} queuelib = ">=1.4.2" service-identity = ">=18.1.0" +setuptools = "*" tldextract = "*" Twisted = ">=18.9.0" w3lib = ">=1.17.0" @@ -1863,15 +1948,20 @@ w3lib = ">=1.17.0" [[package]] name = "scrapyd" -version = "1.4.1" +version = "1.4.2" description = "A service for running Scrapy spiders, with an HTTP API" category = "main" optional = false python-versions = "*" +files = [ + {file = "scrapyd-1.4.2-py2.py3-none-any.whl", hash = "sha256:2f030bfa1cb04309406c6a96f7ec236706ea04a988fda88e39c07d1890eb7ca9"}, + {file = "scrapyd-1.4.2.tar.gz", hash = "sha256:fd10df9ba9a2a147cc8015bf15a47a2949e02ea8dee9dcb12e3bc98c2ff50615"}, +] [package.dependencies] packaging = "*" scrapy = ">=2.0.0" +setuptools = "*" twisted = ">=17.9" w3lib = "*" "zope.interface" = "*" @@ -1880,19 +1970,6 @@ w3lib = "*" docs = ["furo", "sphinx", "sphinx-autobuild"] test = ["pytest", "pytest-cov", "requests"] -[[package]] -name = "send2trash" -version = "1.8.0" -description = "Send file to trash natively under Mac OS X, Windows and Linux." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -nativelib = ["pyobjc-framework-cocoa", "pywin32"] -objc = ["pyobjc-framework-cocoa"] -win32 = ["pywin32"] - [[package]] name = "service-identity" version = "21.1.0" @@ -1900,6 +1977,10 @@ description = "Service identity verification for pyOpenSSL & cryptography." category = "main" optional = false python-versions = "*" +files = [ + {file = "service-identity-21.1.0.tar.gz", hash = "sha256:6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34"}, + {file = "service_identity-21.1.0-py2.py3-none-any.whl", hash = "sha256:f0b0caac3d40627c3c04d7a51b6e06721857a0e10a8775f2d1d7e72901b3a7db"}, +] [package.dependencies] attrs = ">=19.1.0" @@ -1909,11 +1990,28 @@ pyasn1-modules = "*" six = "*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "pytest", "sphinx", "furo", "idna", "pyopenssl"] -docs = ["sphinx", "furo"] +dev = ["coverage[toml] (>=5.0.2)", "furo", "idna", "pyOpenSSL", "pytest", "sphinx"] +docs = ["furo", "sphinx"] idna = ["idna"] tests = ["coverage[toml] (>=5.0.2)", "pytest"] +[[package]] +name = "setuptools" +version = "67.8.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {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-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]] name = "shortuuid" version = "1.0.11" @@ -1921,6 +2019,10 @@ description = "A generator library for concise, unambiguous and URL-safe UUIDs." category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "shortuuid-1.0.11-py3-none-any.whl", hash = "sha256:27ea8f28b1bd0bf8f15057a3ece57275d2059d2b0bb02854f02189962c13b6aa"}, + {file = "shortuuid-1.0.11.tar.gz", hash = "sha256:fc75f2615914815a8e4cb1501b3a513745cb66ef0fd5fc6fb9f8c3fa3481f789"}, +] [[package]] name = "six" @@ -1929,30 +2031,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "smmap" -version = "5.0.0" -description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "sonormal" @@ -1961,6 +2043,7 @@ description = "Schema.org normalization service" category = "main" optional = false python-versions = "^3.8" +files = [] develop = true [package.dependencies] @@ -1968,7 +2051,7 @@ click = "^8.1.3" dateparser = "^1.1.1" diskcache = "^5.4.0" dynaconf = "^3.1.9" -pyld = {git = "https://github.com/datadavev/pyld.git", tag = "2.0.4-dev_ddv-0.1"} +pyld = {git = "https://github.com/datadavev/pyld.git", tag = "ddv-2.1.0"} pyppeteer = "^1.0.2" requests = "^2.28.1" shortuuid = "^1.0.9" @@ -1980,385 +2063,92 @@ docs = [] type = "directory" url = "../sonormal" -[[package]] -name = "soupsieve" -version = "2.4" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "sphinx" -version = "3.5.4" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.12,<0.17" -imagesize = "*" -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = "*" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = "*" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-book-theme" -version = "0.1.10" -description = "A clean book theme for scientific explanations and documentation with Sphinx" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -beautifulsoup4 = ">=4.6.1,<5" -docutils = ">=0.15,<0.17" -pydata-sphinx-theme = ">=0.7.2,<0.8.0" -pyyaml = "*" -sphinx = ">=3,<5" - -[package.extras] -code_style = ["pre-commit (>=2.7.0,<2.8.0)"] -live-dev = ["sphinx-autobuild", "web-compile (>=0.2.1,<0.3.0)"] -sphinx = ["ablog (>=0.10.13,<0.11.0)", "ipywidgets", "folium", "numpy", "matplotlib", "myst-nb (>=0.13,<1.0)", "nbclient", "pandas", "plotly", "sphinx (>=4.0,<5.0)", "sphinx-design", "sphinx-copybutton", "sphinx-togglebutton (>=0.2.1)", "sphinx-thebe", "sphinxcontrib-bibtex (>=2.2,<3.0)", "sphinxext-opengraph"] -testing = ["coverage", "myst-nb (>=0.13,<1.0)", "pytest (>=6.0.1,<6.1.0)", "pytest-cov", "pytest-regressions (>=2.0.1,<2.1.0)", "sphinx-thebe"] - -[[package]] -name = "sphinx-comments" -version = "0.0.3" -description = "Add comments and annotation to your documentation." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -sphinx = ">=1.8" - -[package.extras] -code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] -sphinx = ["sphinx (>=2)", "sphinx-book-theme", "myst-parser"] -testing = ["beautifulsoup4", "myst-parser", "pytest", "pytest-regressions", "sphinx (>=2)", "sphinx-book-theme"] - -[[package]] -name = "sphinx-copybutton" -version = "0.5.1" -description = "Add a copy button to each of your code cells." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -sphinx = ">=1.8" - -[package.extras] -code_style = ["pre-commit (==2.12.1)"] -rtd = ["sphinx", "ipython", "myst-nb", "sphinx-book-theme", "sphinx-examples"] - -[[package]] -name = "sphinx-external-toc" -version = "0.2.4" -description = "A sphinx extension that allows the site-map to be defined in a single YAML file." -category = "dev" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -attrs = ">=20.3,<22" -click = ">=7.1,<9" -pyyaml = "*" -sphinx = ">=3,<5" - -[package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] -rtd = ["myst-parser (>=0.15.0,<0.16.0)", "sphinx-book-theme (>=0.0.36)"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "sphinx-jupyterbook-latex" -version = "0.4.7" -description = "Latex specific features for jupyter book" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} -sphinx = ">=3,<5" - -[package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] -myst = ["myst-nb (>=0.13,<0.14)"] -rtd = ["myst-parser", "sphinx-book-theme", "sphinx-design", "sphinx-jupyterbook-latex"] -testing = ["coverage (<5.0)", "myst-nb (>=0.13,<0.14)", "pytest (>=3.6,<4)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions", "sphinx-external-toc (>=0.1.0,<0.3.0)", "sphinxcontrib-bibtex (>=2.2.1,<2.3.0)", "texsoup"] - -[[package]] -name = "sphinx-multitoc-numbering" -version = "0.1.3" -description = "Supporting continuous HTML section numbering" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -sphinx = ">=3" - -[package.extras] -code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] -rtd = ["sphinx (>=3.0)", "sphinx-book-theme", "myst-parser"] -testing = ["pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "coverage (<5.0)", "pytest-regressions", "jupyter-book"] - -[[package]] -name = "sphinx-panels" -version = "0.5.2" -description = "A sphinx extension for creating panels in a grid layout." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -sphinx = ">=2,<4" - -[package.extras] -code_style = ["pre-commit (>=2.7.0,<2.8.0)"] -live-dev = ["sphinx-autobuild", "web-compile (>=0.2.0,<0.3.0)"] -testing = ["pytest (>=6.0.1,<6.1.0)", "pytest-regressions (>=2.0.1,<2.1.0)"] -themes = ["sphinx-rtd-theme", "pydata-sphinx-theme (>=0.4.0,<0.5.0)", "sphinx-book-theme (>=0.0.36,<0.1.0)", "myst-parser (>=0.12.9,<0.13.0)"] - -[[package]] -name = "sphinx-thebe" -version = "0.0.10" -description = "Integrate interactive code blocks into your documentation with Thebe and Binder." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -sphinx = ">=3.5,<5" - -[package.extras] -sphinx = ["myst-parser", "sphinx-book-theme", "jupyter-sphinx", "sphinx-panels"] -testing = ["pytest", "pytest-regressions", "beautifulsoup4"] - -[[package]] -name = "sphinx-togglebutton" -version = "0.2.3" -description = "Toggle page content and collapse admonitions in Sphinx." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -sphinx = "*" - -[package.extras] -sphinx = ["myst-nb", "sphinx-book-theme"] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.4" -description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-bibtex" -version = "2.2.1" -description = "Sphinx extension for BibTeX style citations." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -docutils = ">=0.8" -pybtex = ">=0.20" -pybtex-docutils = ">=1.0.0" -Sphinx = ">=2.1" - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-drawio" -version = "0.0.13" -description = "Sphinx Extension to include draw.io files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.1" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-plantuml" -version = "0.21" -description = "Sphinx \"plantuml\" extension" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -Sphinx = ">=1.6" - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -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)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - [[package]] name = "sqlalchemy" -version = "1.4.47" +version = "1.4.48" description = "Database Abstraction Library" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} - -[package.extras] -aiomysql = ["greenlet (!=0.4.17)", "aiomysql"] -aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"] +files = [ + {file = "SQLAlchemy-1.4.48-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:4bac3aa3c3d8bc7408097e6fe8bf983caa6e9491c5d2e2488cfcfd8106f13b6a"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dbcae0e528d755f4522cad5842f0942e54b578d79f21a692c44d91352ea6d64e"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27m-win32.whl", hash = "sha256:cbbe8b8bffb199b225d2fe3804421b7b43a0d49983f81dc654d0431d2f855543"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27m-win_amd64.whl", hash = "sha256:627e04a5d54bd50628fc8734d5fc6df2a1aa5962f219c44aad50b00a6cdcf965"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9af1db7a287ef86e0f5cd990b38da6bd9328de739d17e8864f1817710da2d217"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ce7915eecc9c14a93b73f4e1c9d779ca43e955b43ddf1e21df154184f39748e5"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5381ddd09a99638f429f4cbe1b71b025bed318f6a7b23e11d65f3eed5e181c33"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:87609f6d4e81a941a17e61a4c19fee57f795e96f834c4f0a30cee725fc3f81d9"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0808ad34167f394fea21bd4587fc62f3bd81bba232a1e7fbdfa17e6cfa7cd7"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-win32.whl", hash = "sha256:d53cd8bc582da5c1c8c86b6acc4ef42e20985c57d0ebc906445989df566c5603"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-win_amd64.whl", hash = "sha256:4355e5915844afdc5cf22ec29fba1010166e35dd94a21305f49020022167556b"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:066c2b0413e8cb980e6d46bf9d35ca83be81c20af688fedaef01450b06e4aa5e"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99bf13e07140601d111a7c6f1fc1519914dd4e5228315bbda255e08412f61a4"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee26276f12614d47cc07bc85490a70f559cba965fb178b1c45d46ffa8d73fda"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-win32.whl", hash = "sha256:49c312bcff4728bffc6fb5e5318b8020ed5c8b958a06800f91859fe9633ca20e"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-win_amd64.whl", hash = "sha256:cef2e2abc06eab187a533ec3e1067a71d7bbec69e582401afdf6d8cad4ba3515"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3509159e050bd6d24189ec7af373359f07aed690db91909c131e5068176c5a5d"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc2ab4d9f6d9218a5caa4121bdcf1125303482a1cdcfcdbd8567be8518969c0"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1ddbbcef9bcedaa370c03771ebec7e39e3944782bef49e69430383c376a250b"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f82d8efea1ca92b24f51d3aea1a82897ed2409868a0af04247c8c1e4fef5890"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-win32.whl", hash = "sha256:e3e98d4907805b07743b583a99ecc58bf8807ecb6985576d82d5e8ae103b5272"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-win_amd64.whl", hash = "sha256:25887b4f716e085a1c5162f130b852f84e18d2633942c8ca40dfb8519367c14f"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0817c181271b0ce5df1aa20949f0a9e2426830fed5ecdcc8db449618f12c2730"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1dd2562313dd9fe1778ed56739ad5d9aae10f9f43d9f4cf81d65b0c85168bb"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:68413aead943883b341b2b77acd7a7fe2377c34d82e64d1840860247cec7ff7c"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbde5642104ac6e95f96e8ad6d18d9382aa20672008cf26068fe36f3004491df"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-win32.whl", hash = "sha256:11c6b1de720f816c22d6ad3bbfa2f026f89c7b78a5c4ffafb220e0183956a92a"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-win_amd64.whl", hash = "sha256:eb5464ee8d4bb6549d368b578e9529d3c43265007193597ddca71c1bae6174e6"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:92e6133cf337c42bfee03ca08c62ba0f2d9695618c8abc14a564f47503157be9"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d29a3fc6d9c45962476b470a81983dd8add6ad26fdbfae6d463b509d5adcda"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:005e942b451cad5285015481ae4e557ff4154dde327840ba91b9ac379be3b6ce"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8cfe951ed074ba5e708ed29c45397a95c4143255b0d022c7c8331a75ae61f3"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-win32.whl", hash = "sha256:2b9af65cc58726129d8414fc1a1a650dcdd594ba12e9c97909f1f57d48e393d3"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-win_amd64.whl", hash = "sha256:2b562e9d1e59be7833edf28b0968f156683d57cabd2137d8121806f38a9d58f4"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a1fc046756cf2a37d7277c93278566ddf8be135c6a58397b4c940abf837011f4"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d9b55252d2ca42a09bcd10a697fa041e696def9dfab0b78c0aaea1485551a08"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6dab89874e72a9ab5462997846d4c760cdb957958be27b03b49cf0de5e5c327c"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd8b5ee5a3acc4371f820934b36f8109ce604ee73cc668c724abb054cebcb6e"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-win32.whl", hash = "sha256:eee09350fd538e29cfe3a496ec6f148504d2da40dbf52adefb0d2f8e4d38ccc4"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-win_amd64.whl", hash = "sha256:7ad2b0f6520ed5038e795cc2852eb5c1f20fa6831d73301ced4aafbe3a10e1f6"}, + {file = "SQLAlchemy-1.4.48.tar.gz", hash = "sha256:b47bc287096d989a0838ce96f7d8e966914a24da877ed41a7531d44b55cdb8df"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"] -mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] mssql = ["pyodbc"] -mssql_pymssql = ["pymssql"] -mssql_pyodbc = ["pyodbc"] -mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"] -mysql_connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"] -postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] -postgresql_psycopg2binary = ["psycopg2-binary"] -postgresql_psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1)", "pymysql"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] sqlcipher = ["sqlcipher3-binary"] -[[package]] -name = "stack-data" -version = "0.6.2" -description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] - -[[package]] -name = "terminado" -version = "0.17.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=6.1.0" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest-timeout", "pytest (>=7.0)"] - -[[package]] -name = "testpath" -version = "0.6.0" -description = "Test utilities for code working with files and commands" -category = "dev" -optional = false -python-versions = ">= 3.5" - -[package.extras] -test = ["pytest"] - [[package]] name = "tldextract" -version = "3.4.0" +version = "3.4.4" description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tldextract-3.4.4-py3-none-any.whl", hash = "sha256:581e7dbefc90e7bb857bb6f768d25c811a3c5f0892ed56a9a2999ddb7b1b70c2"}, + {file = "tldextract-3.4.4.tar.gz", hash = "sha256:5fe3210c577463545191d45ad522d3d5e78d55218ce97215e82004dcae1e1234"}, +] [package.dependencies] filelock = ">=3.0.8" @@ -2366,22 +2156,6 @@ idna = "*" requests = ">=2.1.0" requests-file = ">=1.4" -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tornado" -version = "6.2" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" -optional = false -python-versions = ">= 3.7" - [[package]] name = "tqdm" version = "4.65.0" @@ -2389,6 +2163,10 @@ description = "Fast, Extensible Progress Meter" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -2399,18 +2177,6 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "traitlets" -version = "5.9.0" -description = "Traitlets Python configuration system" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] - [[package]] name = "twisted" version = "22.10.0" @@ -2418,6 +2184,10 @@ description = "An asynchronous networking framework written in Python" category = "main" optional = false python-versions = ">=3.7.1" +files = [ + {file = "Twisted-22.10.0-py3-none-any.whl", hash = "sha256:86c55f712cc5ab6f6d64e02503352464f0400f66d4f079096d744080afcccbd0"}, + {file = "Twisted-22.10.0.tar.gz", hash = "sha256:32acbd40a94f5f46e7b42c109bfae2b302250945561783a8b7a059048f2d4d31"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -2430,102 +2200,108 @@ typing-extensions = ">=3.6.5" "zope.interface" = ">=4.4.2" [package.extras] -all_non_platform = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] -conch = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)"] -conch_nacl = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pynacl"] +all-non-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] +conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] +conch-nacl = ["PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] contextvars = ["contextvars (>=2.4,<3)"] -dev = ["towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "python-subunit (>=1.4,<2.0)"] -dev_release = ["towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)"] -gtk_platform = ["pygobject", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +dev = ["coverage (>=6b1,<7)", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "python-subunit (>=1.4,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)"] +dev-release = ["pydoctor (>=22.9.0,<22.10.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)"] +gtk-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pygobject", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] http2 = ["h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)"] -macos_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] -mypy = ["mypy (==0.930)", "mypy-zope (==0.3.4)", "types-setuptools", "types-pyopenssl", "towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pynacl", "pywin32 (!=226)", "python-subunit (>=1.4,<2.0)", "contextvars (>=2.4,<3)"] -osx_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +macos-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] +mypy = ["PyHamcrest (>=1.9.0)", "PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "coverage (>=6b1,<7)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "mypy (==0.930)", "mypy-zope (==0.3.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "service-identity (>=18.1.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)", "types-pyOpenSSL", "types-setuptools"] +osx-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] -test = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)"] -tls = ["pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)"] -windows_platform = ["pywin32 (!=226)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +test = ["PyHamcrest (>=1.9.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.0,<7.0)"] +tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] +windows-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] [[package]] name = "twisted-iocpsupport" -version = "1.0.2" +version = "1.0.3" description = "An extension for use in the twisted I/O Completion Ports reactor." category = "main" optional = false python-versions = "*" - -[[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = ">=3.6" +files = [ + {file = "twisted-iocpsupport-1.0.3.tar.gz", hash = "sha256:afb00801fdfbaccf0d0173a722626500023d4a19719ac9f129d1347a32e2fc66"}, + {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win32.whl", hash = "sha256:a379ef56a576c8090889f74441bc3822ca31ac82253cc61e8d50631bcb0c26d0"}, + {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1ea2c3fbdb739c95cc8b3355305cd593d2c9ec56d709207aa1a05d4d98671e85"}, + {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win32.whl", hash = "sha256:7efcdfafb377f32db90f42bd5fc5bb32cd1e3637ee936cdaf3aff4f4786ab3bf"}, + {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1dbfac706972bf9ec5ce1ddbc735d2ebba406ad363345df8751ffd5252aa1618"}, + {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:1ddfc5fa22ec6f913464b736b3f46e642237f17ac41be47eed6fa9bd52f5d0e0"}, + {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:1bdccbb22199fc69fd7744d6d2dfd22d073c028c8611d994b41d2d2ad0e0f40d"}, + {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:db11c80054b52dbdea44d63d5474a44c9a6531882f0e2960268b15123088641a"}, + {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:67bec1716eb8f466ef366bbf262e1467ecc9e20940111207663ac24049785bad"}, + {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win32.whl", hash = "sha256:98a6f16ab215f8c1446e9fc60aaed0ab7c746d566aa2f3492a23cea334e6bebb"}, + {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:4f249d0baac836bb431d6fa0178be063a310136bc489465a831e3abd2d7acafd"}, + {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win32.whl", hash = "sha256:aaca8f30c3b7c80d27a33fe9fe0d0bac42b1b012ddc60f677175c30e1becc1f3"}, + {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:dff43136c33665c2d117a73706aef6f7d6433e5c4560332a118fe066b16b8695"}, + {file = "twisted_iocpsupport-1.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8faceae553cfadc42ad791b1790e7cdecb7751102608c405217f6a26e877e0c5"}, + {file = "twisted_iocpsupport-1.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6f8c433faaad5d53d30d1da6968d5a3730df415e2efb6864847267a9b51290cd"}, + {file = "twisted_iocpsupport-1.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3f39c41c0213a81a9ce0961e30d0d7650f371ad80f8d261007d15a2deb6d5be3"}, +] [[package]] name = "typing-extensions" -version = "4.5.0" +version = "4.6.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.6.0-py3-none-any.whl", hash = "sha256:6ad00b63f849b7dcc313b70b6b304ed67b2b2963b3098a33efe18056b1a9a223"}, + {file = "typing_extensions-4.6.0.tar.gz", hash = "sha256:ff6b238610c747e44c268aa4bb23c8c735d665a63726df3f9431ce707f2aa768"}, +] [[package]] name = "tzdata" -version = "2023.2" +version = "2023.3" description = "Provider of IANA time zone data" category = "main" optional = false python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] [[package]] name = "tzlocal" -version = "4.3" +version = "5.0.1" description = "tzinfo object for the local timezone" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, + {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, +] [package.dependencies] "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -pytz-deprecation-shim = "*" tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest-cov", "pytest-mock (>=3.3)", "pytest (>=4.3)", "zest.releaser"] - -[[package]] -name = "uc-micro-py" -version = "1.0.1" -description = "Micro subset of unicode data files for linkify-it-py projects." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -test = ["coverage", "pytest", "pytest-cov"] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] [[package]] name = "urllib3" -version = "1.26.15" +version = "1.26.16" 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 = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] +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)"] -[[package]] -name = "uwsgi" -version = "2.0.21" -description = "The uWSGI server" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "w3lib" version = "2.1.1" @@ -2533,46 +2309,34 @@ description = "Library of web-related functions" category = "main" optional = false python-versions = ">=3.7" - -[[package]] -name = "watchdog" -version = "2.3.1" -description = "Filesystem events monitoring" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] +files = [ + {file = "w3lib-2.1.1-py3-none-any.whl", hash = "sha256:7fd5bd7980a95d1a8185e867d05f68a591aa281a3ded4590d2641d7b09086ed4"}, + {file = "w3lib-2.1.1.tar.gz", hash = "sha256:0e1198f1b745195b6b3dd1a4cd66011fbf82f30a4d9dabaee1f9e5c86f020274"}, +] [[package]] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" +category = "main" optional = false python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] [[package]] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "dev" +category = "main" optional = false python-versions = "*" - -[[package]] -name = "websocket-client" -version = "1.5.1" -description = "WebSocket client for Python with low level API options" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "websockets" @@ -2581,31 +2345,180 @@ description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, + {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, + {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, + {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, + {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, + {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, + {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, + {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, + {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, + {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, + {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, + {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, + {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, + {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, + {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, + {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, + {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, + {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, + {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, + {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, + {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, + {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, + {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, + {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, +] [[package]] name = "werkzeug" -version = "2.2.3" +version = "2.0.3" description = "The comprehensive WSGI web application library." category = "main" optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.1.1" +python-versions = ">=3.6" +files = [ + {file = "Werkzeug-2.0.3-py3-none-any.whl", hash = "sha256:1421ebfc7648a39a5c58c601b154165d05cf47a3cd0ccb70857cbdacf6c8f2b8"}, + {file = "Werkzeug-2.0.3.tar.gz", hash = "sha256:b863f8ff057c522164b6067c9e28b041161b4be5ba4d0daceeaa50a163822d3c"}, +] [package.extras] watchdog = ["watchdog"] [[package]] -name = "widgetsnbextension" -version = "3.6.3" -description = "IPython HTML widgets for Jupyter" -category = "dev" +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +category = "main" optional = false -python-versions = "*" - -[package.dependencies] -notebook = ">=4.4.1" +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" [[package]] name = "zipp" @@ -2614,224 +2527,75 @@ description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" 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 = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +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)"] + +[[package]] +name = "zipstream" +version = "1.1.4" +description = "Zipfile generator" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "zipstream-1.1.4.tar.gz", hash = "sha256:2ef24b9150c93429b172750c4890b5ab28c1317892e11727afeff986ad2a3506"}, +] [[package]] -name = "zope.interface" +name = "zope-interface" version = "6.0" description = "Interfaces for Python" category = "main" optional = false python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface"] +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.8" -content-hash = "d9995c629c47a3dfba384bac0744b20da958ae7a66637d42086f1a3ce43a247d" - -[metadata.files] -alabaster = [] -alembic = [] -anyio = [] -appdirs = [] -appnope = [] -argh = [] -argon2-cffi = [] -argon2-cffi-bindings = [] -asttokens = [] -atomicwrites = [] -attrs = [] -automat = [] -babel = [] -backcall = [] -"backports.zoneinfo" = [] -beautifulsoup4 = [] -black = [] -bleach = [] -cachetools = [] -certifi = [] -cffi = [] -charset-normalizer = [] -click = [] -colorama = [] -comm = [] -constantly = [] -cryptography = [] -cssselect = [] -dateparser = [] -debugpy = [] -decorator = [] -defusedxml = [] -diskcache = [] -docutils = [] -dynaconf = [] -entrypoints = [] -executing = [] -fastjsonschema = [] -filelock = [] -flask = [] -flask-accept = [] -flask-cors = [] -flask-sqlalchemy = [] -frozendict = [] -gitdb = [] -gitpython = [] -greenlet = [] -hyperlink = [] -idna = [] -imagesize = [] -importlib-metadata = [] -importlib-resources = [] -incremental = [] -iniconfig = [] -ipykernel = [] -ipython = [] -ipython-genutils = [] -ipywidgets = [] -itemadapter = [] -itemloaders = [] -itsdangerous = [] -jedi = [] -jinja2 = [] -jmespath = [] -jsonschema = [] -jupyter-book = [] -jupyter-cache = [] -jupyter-client = [] -jupyter-core = [] -jupyter-server = [] -jupyter-server-mathjax = [] -jupyter-sphinx = [] -jupyterlab-widgets = [] -jupytext = [] -latexcodec = [] -linkify-it-py = [] -lxml = [] -mako = [] -markdown-it-py = [] -markupsafe = [] -matplotlib-inline = [] -mdit-py-plugins = [] -mistune = [] -mypy-extensions = [] -myst-nb = [] -myst-parser = [] -nbclassic = [] -nbclient = [] -nbconvert = [] -nbdime = [] -nbformat = [] -nest-asyncio = [] -notebook = [] -notebook-shim = [] -"org.webpki.json" = [] -packaging = [] -pandocfilters = [] -parsel = [] -parso = [] -pathspec = [] -pexpect = [] -pickleshare = [] -pkgutil-resolve-name = [] -platformdirs = [] -pluggy = [] -prometheus-client = [] -prompt-toolkit = [] -protego = [] -psutil = [] -ptyprocess = [] -pure-eval = [] -py = [] -pyasn1 = [] -pyasn1-modules = [] -pybtex = [] -pybtex-docutils = [] -pycparser = [] -pydata-sphinx-theme = [] -pydispatcher = [] -pyee = [] -pygments = [] -PyLD = [] -pyopenssl = [] -pyppeteer = [] -pypydispatcher = [] -pyrsistent = [] -pytest = [] -python-dateutil = [] -python-magic = [] -pytz = [] -pytz-deprecation-shim = [] -pywin32 = [] -pywinpty = [] -pyyaml = [] -pyzmq = [] -queuelib = [] -regex = [] -requests = [] -requests-file = [] -scrapy = [] -scrapyd = [] -send2trash = [] -service-identity = [] -shortuuid = [] -six = [] -smmap = [] -sniffio = [] -snowballstemmer = [] -sonormal = [] -soupsieve = [] -sphinx = [] -sphinx-book-theme = [] -sphinx-comments = [] -sphinx-copybutton = [] -sphinx-external-toc = [] -sphinx-jupyterbook-latex = [] -sphinx-multitoc-numbering = [] -sphinx-panels = [] -sphinx-thebe = [] -sphinx-togglebutton = [] -sphinxcontrib-applehelp = [] -sphinxcontrib-bibtex = [] -sphinxcontrib-devhelp = [] -sphinxcontrib-drawio = [] -sphinxcontrib-htmlhelp = [] -sphinxcontrib-jsmath = [] -sphinxcontrib-plantuml = [] -sphinxcontrib-qthelp = [] -sphinxcontrib-serializinghtml = [] -sqlalchemy = [] -stack-data = [] -terminado = [] -testpath = [] -tldextract = [] -toml = [] -tornado = [] -tqdm = [] -traitlets = [] -twisted = [] -twisted-iocpsupport = [] -typed-ast = [] -typing-extensions = [] -tzdata = [] -tzlocal = [] -uc-micro-py = [] -urllib3 = [] -uwsgi = [] -w3lib = [] -watchdog = [] -wcwidth = [] -webencodings = [] -websocket-client = [] -websockets = [] -werkzeug = [] -widgetsnbextension = [] -zipp = [] -"zope.interface" = [] +content-hash = "53c03407135b693d1b6d9306684db6165d9c951cdb768b8b3e3bc5758fd5563d" diff --git a/pyproject.toml b/pyproject.toml index 85b0471b..df930129 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,27 +17,34 @@ Scrapy = "^2.4.1" requests = "^2.25.0" python-magic = "^0.4.18" alembic = "^1.4.3" -uWSGI = "^2.0.19" "org.webpki.json" = {git = "https://github.com/datadavev/json-canonicalization.git", branch = "develop"} scrapyd = "^1.2.1" diskcache = "^5.2.1" Flask-Cors = "^3.0.10" flask_accept = "^0.0.6" -pyld = {git = "https://github.com/datadavev/pyld.git", tag = "2.0.4-dev_ddv-0.1"} +pyld = {git = "https://github.com/datadavev/pyld.git", tag = "ddv-2.1.0"} sonormal = {path = "../sonormal", develop=true } #pyjnius = "^1.3.0" +jinja2 = "<3.0" +markupsafe = "^2.0.1,<2.1" +itsdangerous = "^2.0.1,<2.1" +werkzeug = "^2.0.3,<2.1" +dataone-libclient = "^3.5.0" +pyshacl = "^0.22.2" +attrs = ">=21.3.0" [tool.poetry.dev-dependencies] pytest = "^6.1.2" black = {version = "^20.8b1", allow-prereleases = true} -jupyter-book = "^0.11.1" +#jupyter-book = "^0.11.1" # need to find a new option watchdog = "^2.1.3" argh = "^0.26.2" sphinxcontrib-plantuml = "^0.21" sphinxcontrib-drawio = "^0.0.13" [tool.poetry.scripts] +mnonboard="mnonboard.cli:main" opersist= "opersist.cli:main" curly="scripts.curly:main" From f63d7f569c2b2e640adfd6761cf90a186f28b2f3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 24 May 2023 21:36:14 +0000 Subject: [PATCH 176/301] fixing small name parsing bug --- mnonboard/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index cef652e6..46fe029b 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -296,7 +296,8 @@ def create_names_xml(loc, node_id, names): node_id = node_id.split(':')[-1] files = [] for id in names: - first, last = names[id].split() + namesplit = names[id].split() + first, last = namesplit[0], namesplit[-1] xst = NAMES_XML % (id, first, last) fn = os.path.join(loc, '%s_%s%s.xml' % (node_id, first[0], last)) L.debug('XML content:\n%s' % (xst)) From c84cf8ecf44781d7d239d8bbd102f9f53798c047 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 24 May 2023 21:37:05 +0000 Subject: [PATCH 177/301] modifying operation steps --- docs/operation.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/operation.md b/docs/operation.md index b2cddf8c..d2d61c27 100644 --- a/docs/operation.md +++ b/docs/operation.md @@ -9,10 +9,10 @@ Harvesting is implemented as a scrapy crawler[^scrapy]. Given a sitemap, crawls ## DataONE production and testing hosts - Test server: so.test.dataone.org - - Environment: ~vieglais - - Virtual env: mnlite + - Environment: `~mnlite` + - Virtual env: `mnlite` - Production server: sonode.dataone.org - - Environment: ``~mnlite` + - Environment: `~mnlite` - Virtual env: `mnlite` ## Testing @@ -25,7 +25,7 @@ Harvesting is implemented as a scrapy crawler[^scrapy]. Given a sitemap, crawls 1. Log in to sonode.dataone.org (or so.test.dataone.org for testing) 2. `sudo su - mnlite` -3. `workon mnlite` +3. `workon mnlite` (`conda activate mnlite` on the test node) 4. `cd WORK/mnlite` 5. Initialize a new repository: `opersist -f instance/nodes/HAKAI_IYS init` 6. Create a contact subject: `opersist -f instance/nodes/HAKAI_IYS sub -o create -n "Brett Johnson" -s "http://orcid.org/0000-0001-9317-0364"` From 4dcae2be6968e2d521a6c93ce1c5bf10b73532bc Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 25 May 2023 19:16:24 +0000 Subject: [PATCH 178/301] fixing imports for [tool.poetry.scripts] --- mnonboard/cli.py | 8 ++++---- mnonboard/utils.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 2b305005..0e82d195 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -1,10 +1,10 @@ import os, sys import getopt -import utils -import info_chx -import data_chx -from defs import CFG, HELP_TEXT, CN_SRVR, CN_SRVR_BASEURL +from mnonboard import utils +from mnonboard import info_chx +from mnonboard import data_chx +from mnonboard.defs import CFG, HELP_TEXT, CN_SRVR, CN_SRVR_BASEURL from mnonboard import default_json, L def run(cfg): diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 46fe029b..ddd813d0 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -2,7 +2,7 @@ import json import subprocess -from defs import SCHEDULES, NAMES_XML +from mnonboard.defs import SCHEDULES, NAMES_XML from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name From da439c399cca1480ea0fb053e02df177e951ca3d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 25 May 2023 19:18:15 +0000 Subject: [PATCH 179/301] fixing imports for [tool.poetry.scripts] --- mnonboard/info_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 1d58847f..a0031f0c 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -2,7 +2,7 @@ from d1_common.types import exceptions from os import environ -from defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX +from mnonboard.defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX from mnonboard import default_json, L from opersist.utils import JSON_TIME_FORMAT, dtnow from opersist.cli import getOpersistInstance From 215fa20b7bc7757e925b3a644fff6f4d41b01cd0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 25 May 2023 19:20:57 +0000 Subject: [PATCH 180/301] fixing scp call --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index ddd813d0..597a98a9 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -321,6 +321,6 @@ def upload_xml(files, server): subprocess.run(['ssh', server, 'mkdir -p ~/d1_xml/'], check=True) for fn in files: op = 'scp to remote server' - subprocess.run(['scp', fn, '%s:~/d1_xml/'], check=True) + subprocess.run(['scp', fn, '%s:~/d1_xml/' % server], check=True) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) From bfbf9298997d51189cb002f8d959c60d30aed517 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 25 May 2023 19:29:13 +0000 Subject: [PATCH 181/301] hopefully fixing xml upload --- mnonboard/cli.py | 4 ++-- mnonboard/utils.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 0e82d195..843ef2d9 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -55,9 +55,9 @@ def run(cfg): # now run tests data_chx.test_mdata(loc, num_tests=cfg['check_files']) # create xml to upload for validation (step 15) - utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) + names = utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) # uploading xml (proceed to step 14 and ssh to find xml in ~/d1_xml) - utils.upload_xml(loc, cfg['cn_url']) + utils.upload_xml(names, cfg['cn_url']) def main(): diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 597a98a9..a86f86bc 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -318,9 +318,9 @@ def upload_xml(files, server): L.info('Running "ssh %s \'mkdir -p ~/d1_xml/\'"' % (server)) try: op = 'mkdir on remote server' - subprocess.run(['ssh', server, 'mkdir -p ~/d1_xml/'], check=True) + subprocess.run(['ssh', server, "\'mkdir -p ~/d1_xml/\'"], check=True) for fn in files: op = 'scp to remote server' - subprocess.run(['scp', fn, '%s:~/d1_xml/' % server], check=True) + subprocess.run(['scp', fn, "\'%s:~/d1_xml/\'" % server], check=True) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) From 7aeb27a315e3e5d5e9b6c9ac3a44c0ef6b3ffed5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 25 May 2023 21:25:24 +0000 Subject: [PATCH 182/301] trying fix for ssh commands --- mnonboard/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index a86f86bc..5c1fcd01 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -318,9 +318,9 @@ def upload_xml(files, server): L.info('Running "ssh %s \'mkdir -p ~/d1_xml/\'"' % (server)) try: op = 'mkdir on remote server' - subprocess.run(['ssh', server, "\'mkdir -p ~/d1_xml/\'"], check=True) + subprocess.run(['ssh', server, "'mkdir -p ~/d1_xml/'"], check=True) for fn in files: op = 'scp to remote server' - subprocess.run(['scp', fn, "\'%s:~/d1_xml/\'" % server], check=True) + subprocess.run(['cat', fn, '|', 'ssh', server, "'cat >> ~/d1_xml/%s'" % fn], check=True) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) From 24a072a607bea46a6c857a314182fcb33392ff14 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 25 May 2023 21:26:40 +0000 Subject: [PATCH 183/301] trying fix for ssh command --- mnonboard/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 5c1fcd01..d146a796 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -318,9 +318,9 @@ def upload_xml(files, server): L.info('Running "ssh %s \'mkdir -p ~/d1_xml/\'"' % (server)) try: op = 'mkdir on remote server' - subprocess.run(['ssh', server, "'mkdir -p ~/d1_xml/'"], check=True) + subprocess.run(['ssh', server, "mkdir -p ~/d1_xml/"], check=True) for fn in files: op = 'scp to remote server' - subprocess.run(['cat', fn, '|', 'ssh', server, "'cat >> ~/d1_xml/%s'" % fn], check=True) + subprocess.run(['cat', fn, '|', 'ssh', server, "cat >> ~/d1_xml/%s" % fn], check=True) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) From bac99a458cdcd8109609211012aadc09dc27670f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 16:13:00 +0000 Subject: [PATCH 184/301] adding uwsgi requirement --- mnlite/xmnlite.ini | 44 +++++ poetry.lock | 472 ++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 3 files changed, 516 insertions(+), 1 deletion(-) create mode 100644 mnlite/xmnlite.ini diff --git a/mnlite/xmnlite.ini b/mnlite/xmnlite.ini new file mode 100644 index 00000000..dae672e6 --- /dev/null +++ b/mnlite/xmnlite.ini @@ -0,0 +1,44 @@ +#uWSGI configuration for mnlite +[uwsgi] +strict = true +master = true +processes = 5 +enable-threads = true +vacuum = true ; Delete sockets during shutdown +single-interpreter = true +die-on-term = true ; Shutdown when receiving SIGTERM (default is respawn) +need-app = true + +#disable-logging = true ; Disable built-in logging +#log-4xx = true ; but log 4xx's anyway +#log-5xx = true ; and 5xx's + +##harakiri = 60 ; forcefully kill workers after 60 seconds +#py-callos-afterfork = true ; allow workers to trap signals + +##max-requests = 1000 ; Restart workers after this many requests +##max-worker-lifetime = 3600 ; Restart workers after this many seconds +##reload-on-rss = 2048 ; Restart workers after this much resident memory +##worker-reload-mercy = 60 ; How long to wait before forcefully killing workers + +#cheaper-algo = busyness +#processes = 128 ; Maximum number of workers allowed +#cheaper = 8 ; Minimum number of workers allowed +#cheaper-initial = 16 ; Workers created at startup +#cheaper-overload = 1 ; Length of a cycle in seconds +#cheaper-step = 16 ; How many workers to spawn at a time +#cheaper-busyness-multiplier = 30 ; How many cycles to wait before killing workers +#cheaper-busyness-min = 20 ; Below this threshold, kill workers (if stable for multiplier cycles) +#cheaper-busyness-max = 70 ; Above this threshold, spawn new workers +##cheaper-busyness-backlog-alert = 16 ; Spawn emergency workers if more than this many requests are waiting in the queue +##cheaper-busyness-backlog-step = 2 ; How many emergency workers to create if there are too many requests in the queue + +##plugins = python +##virtualenv = /home/mnlite/miniconda3/envs/mnlite +module = mnlite:create_app() +socket = /home/mnlite/WORK/mnlite/mnlite/tmp/mnlite.sock +chmod-socket = 664 + +#stats = /tmp/stats.socket +##stats = 127.0.0.1:9191 +##stats-http = true diff --git a/poetry.lock b/poetry.lock index 250c4cf3..1f149248 100644 --- a/poetry.lock +++ b/poetry.lock @@ -124,6 +124,18 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" +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 = "alembic" version = "1.11.1" @@ -158,6 +170,18 @@ files = [ {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] +[[package]] +name = "argh" +version = "0.26.2" +description = "An unobtrusive argparse wrapper with natural syntax" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "argh-0.26.2-py2.py3-none-any.whl", hash = "sha256:a9b3aaa1904eeb78e32394cd46c6f37ac0fb4af6dc488daa58971bdc7d7fcaf3"}, + {file = "argh-0.26.2.tar.gz", hash = "sha256:e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65"}, +] + [[package]] name = "async-timeout" version = "4.0.2" @@ -170,6 +194,17 @@ files = [ {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] + [[package]] name = "attrs" version = "23.1.0" @@ -208,6 +243,21 @@ six = "*" [package.extras] visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] +[[package]] +name = "babel" +version = "2.12.1" +description = "Internationalization utilities" +category = "dev" +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 = "backports-zoneinfo" version = "0.2.1" @@ -237,6 +287,31 @@ files = [ [package.extras] tzdata = ["tzdata"] +[[package]] +name = "black" +version = "20.8b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.6,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + [[package]] name = "cachetools" version = "5.3.0" @@ -589,6 +664,18 @@ files = [ {file = "diskcache-5.6.1.tar.gz", hash = "sha256:e4c978532feff5814c4cc00fe1e11e40501985946643d73220d41ee7737c72c3"}, ] +[[package]] +name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] + [[package]] name = "dynaconf" version = "3.1.12" @@ -951,6 +1038,18 @@ 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" +category = "dev" +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-metadata" version = "6.6.0" @@ -1006,6 +1105,18 @@ files = [ mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"] scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + [[package]] name = "iso8601" version = "1.1.0" @@ -1381,6 +1492,18 @@ files = [ {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {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 = "org-webpki-json" version = "0.1.0" @@ -1443,6 +1566,34 @@ lxml = "*" packaging = "*" w3lib = ">=1.19.0" +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "prettytable" version = "2.5.0" @@ -1476,6 +1627,18 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + [[package]] name = "pyasn1" version = "0.5.0" @@ -1542,6 +1705,21 @@ files = [ {file = "pyee-8.2.2.tar.gz", hash = "sha256:5c7e60f8df95710dbe17550e16ce0153f83990c00ef744841b43f371ed53ebea"}, ] +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +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 = "pyjwt" version = "2.7.0" @@ -1679,6 +1857,31 @@ dev-type-checking = ["mypy (>=0.800,<0.900)", "mypy (>=0.900,<0.1000)", "platfor http = ["sanic (>=22.12,<23)", "sanic-cors (==2.2.0)", "sanic-ext (>=23.3,<23.6)"] js = ["pyduktape2 (>=0.4.2,<0.5.0)"] +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -2036,6 +2239,18 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +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 = "sonormal" version = "0.2.1" @@ -2063,6 +2278,163 @@ docs = [] type = "directory" url = "../sonormal" +[[package]] +name = "sphinx" +version = "5.1.1" +description = "Python documentation generator" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Sphinx-5.1.1-py3-none-any.whl", hash = "sha256:309a8da80cb6da9f4713438e5b55861877d5d7976b69d87e336733637ea12693"}, + {file = "Sphinx-5.1.1.tar.gz", hash = "sha256:ba3224a4e206e1fbdecf98a4fae4992ef9b24b85ebf7b584bb340156eaf08d89"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.20" +imagesize = "*" +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +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-bugbear", "flake8-comprehensions", "isort", "mypy (>=0.971)", "sphinx-lint", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest (>=4.6)", "typed-ast"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +category = "dev" +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." +category = "dev" +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-drawio" +version = "0.0.13" +description = "Sphinx Extension to include draw.io files" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-drawio-0.0.13.tar.gz", hash = "sha256:d54f44a1d9646b4ec21f936433a4dd12057af9691ff4405c4c6b8205ee182798"}, + {file = "sphinxcontrib_drawio-0.0.13-py3-none-any.whl", hash = "sha256:48858bf7d85a73c9383f0781eca45f5044b08608f8a1d01dcf8e2daded868373"}, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" +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" +category = "dev" +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-plantuml" +version = "0.21" +description = "Sphinx \"plantuml\" extension" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "sphinxcontrib-plantuml-0.21.tar.gz", hash = "sha256:53e1808dc2b1f3ec20c177fa3fa6d438d75ef572a25a489e330bb01130508d87"}, +] + +[package.dependencies] +Sphinx = ">=1.6" + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "dev" +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)." +category = "dev" +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 = "sqlalchemy" version = "1.4.48" @@ -2156,6 +2528,18 @@ idna = "*" requests = ">=2.1.0" requests-file = ">=1.4" +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tqdm" version = "4.65.0" @@ -2242,6 +2626,40 @@ files = [ {file = "twisted_iocpsupport-1.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3f39c41c0213a81a9ce0961e30d0d7650f371ad80f8d261007d15a2deb6d5be3"}, ] +[[package]] +name = "typed-ast" +version = "1.5.4" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, + {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, + {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, + {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, + {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, + {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, + {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, + {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, + {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, + {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, +] + [[package]] name = "typing-extensions" version = "4.6.0" @@ -2302,6 +2720,17 @@ 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)"] +[[package]] +name = "uwsgi" +version = "2.0.21" +description = "The uWSGI server" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "uwsgi-2.0.21.tar.gz", hash = "sha256:35a30d83791329429bc04fe44183ce4ab512fcf6968070a7bfba42fc5a0552a9"}, +] + [[package]] name = "w3lib" version = "2.1.1" @@ -2314,6 +2743,47 @@ files = [ {file = "w3lib-2.1.1.tar.gz", hash = "sha256:0e1198f1b745195b6b3dd1a4cd66011fbf82f30a4d9dabaee1f9e5c86f020274"}, ] +[[package]] +name = "watchdog" +version = "2.3.1" +description = "Filesystem events monitoring" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"}, + {file = "watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"}, + {file = "watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"}, + {file = "watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"}, + {file = "watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"}, + {file = "watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"}, + {file = "watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"}, + {file = "watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"}, + {file = "watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"}, + {file = "watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "wcwidth" version = "0.2.6" @@ -2598,4 +3068,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "53c03407135b693d1b6d9306684db6165d9c951cdb768b8b3e3bc5758fd5563d" +content-hash = "febe0c9fbf71cacb78a734ce8dbafa9f2a21d0c58abd7d7f13ed6983ccebeb76" diff --git a/pyproject.toml b/pyproject.toml index df930129..0e1d9253 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ werkzeug = "^2.0.3,<2.1" dataone-libclient = "^3.5.0" pyshacl = "^0.22.2" attrs = ">=21.3.0" +uwsgi = "^2.0.21" [tool.poetry.dev-dependencies] pytest = "^6.1.2" From 960496f6841011d237ee6eefc82984a7d27a4cb1 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 16:21:54 +0000 Subject: [PATCH 185/301] adding paramiko and scp --- poetry.lock | 101 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 2 + 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 1f149248..a623bab5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -287,6 +287,41 @@ files = [ [package.extras] tzdata = ["tzdata"] +[[package]] +name = "bcrypt" +version = "4.0.1" +description = "Modern password hashing for your software and your servers" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + [[package]] name = "black" version = "20.8b1" @@ -1547,6 +1582,28 @@ files = [ {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] +[[package]] +name = "paramiko" +version = "3.2.0" +description = "SSH2 protocol library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "paramiko-3.2.0-py3-none-any.whl", hash = "sha256:df0f9dd8903bc50f2e10580af687f3015bf592a377cd438d2ec9546467a14eb8"}, + {file = "paramiko-3.2.0.tar.gz", hash = "sha256:93cdce625a8a1dc12204439d45033f3261bdb2c201648cfcdc06f9fd0f94ec29"}, +] + +[package.dependencies] +bcrypt = ">=3.2" +cryptography = ">=3.3" +pynacl = ">=1.5" + +[package.extras] +all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +invoke = ["invoke (>=2.0)"] + [[package]] name = "parsel" version = "1.8.1" @@ -1765,6 +1822,33 @@ url = "https://github.com/datadavev/pyld.git" reference = "ddv-2.1.0" resolved_reference = "f5711b40d40d2fe43e0e68cb17005cf198757771" +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + [[package]] name = "pyopenssl" version = "23.1.1" @@ -2117,6 +2201,21 @@ files = [ [package.dependencies] requests = ">=2.0.1,<3.0.0" +[[package]] +name = "scp" +version = "0.14.5" +description = "scp module for paramiko" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "scp-0.14.5-py2.py3-none-any.whl", hash = "sha256:d224535dd8ed00294f52b0e0e18fde7a6fb7a3d06b97ede9e3f750fa7bf75c09"}, + {file = "scp-0.14.5.tar.gz", hash = "sha256:64f0015899b3d212cb8088e7d40ebaf0686889ff0e243d5c1242efe8b50f053e"}, +] + +[package.dependencies] +paramiko = "*" + [[package]] name = "scrapy" version = "2.9.0" @@ -3068,4 +3167,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "febe0c9fbf71cacb78a734ce8dbafa9f2a21d0c58abd7d7f13ed6983ccebeb76" +content-hash = "a36d4e84fd83129bea17e3e150ea2c3b8504787a8037a3191a30ca3435e5590d" diff --git a/pyproject.toml b/pyproject.toml index 0e1d9253..af9870b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,8 @@ dataone-libclient = "^3.5.0" pyshacl = "^0.22.2" attrs = ">=21.3.0" uwsgi = "^2.0.21" +paramiko = "^3.2.0" +scp = "^0.14.5" [tool.poetry.dev-dependencies] pytest = "^6.1.2" From 28e38649fbbb1691984b4716a63d5e3b720e5241 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 20:37:47 +0000 Subject: [PATCH 186/301] fix bug in xml creation --- mnonboard/defs.py | 17 +++++++++-------- mnonboard/utils.py | 14 ++++++++++---- pyproject.toml | 1 + 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 3fcd17ad..6910a43d 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -140,11 +140,12 @@ } } -NAMES_XML = """ - - %s - %s - %s - false - -""" +NAMES_DICT = { + 'ns2:person': { + '@xmlns:ns2': 'http://ns.dataone.org/service/types/v1', + 'subject': '', + 'givenName': '', + 'familyName': '', + 'verified': 'false' + } +} diff --git a/mnonboard/utils.py b/mnonboard/utils.py index d146a796..2aa70b4b 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -1,8 +1,9 @@ import os import json import subprocess +import xmltodict -from mnonboard.defs import SCHEDULES, NAMES_XML +from mnonboard.defs import SCHEDULES, NAMES_DICT from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name @@ -298,10 +299,15 @@ def create_names_xml(loc, node_id, names): for id in names: namesplit = names[id].split() first, last = namesplit[0], namesplit[-1] - xst = NAMES_XML % (id, first, last) + xd = NAMES_DICT + xd['ns2:person']['subject'] = id + xd['ns2:person']['givenName'] = first + xd['ns2:person']['familyName'] = last + xm = xmltodict.unparse(xd) fn = os.path.join(loc, '%s_%s%s.xml' % (node_id, first[0], last)) - L.debug('XML content:\n%s' % (xst)) - save_xml(fn, xst) + L.debug('XML path: %s' % fn) + L.debug('XML content:\n%s' % (xm)) + save_xml(fn, xm) files.append(fn) return files diff --git a/pyproject.toml b/pyproject.toml index af9870b7..ad859556 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,7 @@ attrs = ">=21.3.0" uwsgi = "^2.0.21" paramiko = "^3.2.0" scp = "^0.14.5" +xmltodict = "^0.13.0" [tool.poetry.dev-dependencies] pytest = "^6.1.2" From cad9685f906b198e01299511b388542eca7dae62 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 20:39:27 +0000 Subject: [PATCH 187/301] fixing indentation --- mnonboard/defs.py | 64 +++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 6910a43d..81b0660f 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -106,38 +106,38 @@ } SHACL_ERRORS = { - 'essential': { - # load errors - 'ShapeLoadError': 'Shape graph must load correctly', - 'JSONDecodeError': 'Metadata files must be properly formatted json-ld', - # science-on-schema.org violations - 'soso:IDShape': 'Dataset must have an ID', - # schema.org violations - 'SO:Dataset-description': 'Dataset must have a description', - 'SO:Dataset-identifier': 'Dataset identifiers must be a URL, Text or PropertyValue', - 'SO:Dataset-name': 'Name is required for a Dataset', - 'SO:Dataset-url': 'Dataset requires a URL for the location of a page describing the dataset', - }, - 'optional': { - # science-on-schema.org violations - 'soso:DatasetNS1Shape': 'Expecting SO namespace of not ', - 'soso:DatasetNS2Shape': 'Expecting SO namespace of not ', - 'soso:DatasetNS3Shape': 'Expecting SO namespace of not ', - # schema.org violations - 'SO:Dataset-isAccessibleForFree': 'It is recommended that a Dataset indicates accessibility for free or otherwise', - 'SO:Dataset-keywords': 'A Dataset should include descriptive keywords as literals or DefinedTerm', - 'SO:Dataset-sameAs': 'It is recommended that a Dataset includes a sameAs URL', - 'SO:Dataset-version': 'Dataset must have a version as Literal or Number', - # SO coordinates - 'schema:GeoCoordinates-longitude': 'It is recommended that a Dataset has a longitude coordinate in WGS-84 format', - 'schema:GeoCoordinates-latitude': 'It is recommended that a Dataset has a latitude coordinate in WGS-84 format', - }, - 'internal': { - # errors we at NCEAS had testing data - 'ConstraintLoadError': 'Constraints must load correctly', - 'ReportableRuntimeError': 'No errors can occur at runtime', - 'FileNotFoundError': 'Files must exist in the location specified', - } + 'essential': { + # load errors + 'ShapeLoadError': 'Shape graph must load correctly', + 'JSONDecodeError': 'Metadata files must be properly formatted json-ld', + # science-on-schema.org violations + 'soso:IDShape': 'Dataset must have an ID', + # schema.org violations + 'SO:Dataset-description': 'Dataset must have a description', + 'SO:Dataset-identifier': 'Dataset identifiers must be a URL, Text or PropertyValue', + 'SO:Dataset-name': 'Name is required for a Dataset', + 'SO:Dataset-url': 'Dataset requires a URL for the location of a page describing the dataset', + }, + 'optional': { + # science-on-schema.org violations + 'soso:DatasetNS1Shape': 'Expecting SO namespace of not ', + 'soso:DatasetNS2Shape': 'Expecting SO namespace of not ', + 'soso:DatasetNS3Shape': 'Expecting SO namespace of not ', + # schema.org violations + 'SO:Dataset-isAccessibleForFree': 'It is recommended that a Dataset indicates accessibility for free or otherwise', + 'SO:Dataset-keywords': 'A Dataset should include descriptive keywords as literals or DefinedTerm', + 'SO:Dataset-sameAs': 'It is recommended that a Dataset includes a sameAs URL', + 'SO:Dataset-version': 'Dataset must have a version as Literal or Number', + # SO coordinates + 'schema:GeoCoordinates-longitude': 'It is recommended that a Dataset has a longitude coordinate in WGS-84 format', + 'schema:GeoCoordinates-latitude': 'It is recommended that a Dataset has a latitude coordinate in WGS-84 format', + }, + 'internal': { + # errors we at NCEAS had testing data + 'ConstraintLoadError': 'Constraints must load correctly', + 'ReportableRuntimeError': 'No errors can occur at runtime', + 'FileNotFoundError': 'Files must exist in the location specified', + } } NAMES_DICT = { From 0f9bfa91abee8f120dddb1932ba661bcc704d291 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 20:47:56 +0000 Subject: [PATCH 188/301] adding new file upload and CN integration framework --- mnonboard/cli.py | 7 ++++--- mnonboard/utils.py | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 843ef2d9..b77b9c24 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -55,10 +55,11 @@ def run(cfg): # now run tests data_chx.test_mdata(loc, num_tests=cfg['check_files']) # create xml to upload for validation (step 15) - names = utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) + files = utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) # uploading xml (proceed to step 14 and ssh to find xml in ~/d1_xml) - utils.upload_xml(names, cfg['cn_url']) - + ssh = utils.upload_xml(files=files, server=cfg['cn_url']) + # close connection + ssh.close() def main(): """ diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 2aa70b4b..7a1a52d7 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -311,7 +311,7 @@ def create_names_xml(loc, node_id, names): files.append(fn) return files -def upload_xml(files, server): +def upload_xml(files: list, server: str): """ Format subject XML documents and return list of names. @@ -321,12 +321,21 @@ def upload_xml(files, server): """ op = '' server = server.split('https://')[1].split('/')[0] - L.info('Running "ssh %s \'mkdir -p ~/d1_xml/\'"' % (server)) + mkdir_dir = '~/d1_xml/' + mkdir_cmd = 'mkdir -p %s' % mkdir_dir + L.info('Running "%s" on %s' % (mkdir_cmd, server)) try: op = 'mkdir on remote server' - subprocess.run(['ssh', server, "mkdir -p ~/d1_xml/"], check=True) - for fn in files: + ssh = SSHClient() + ssh.load_system_host_keys() + ssh.connect(server) + ssh.exec_command(mkdir_cmd) + with SCPClient(ssh.get_transport()) as scp: op = 'scp to remote server' - subprocess.run(['cat', fn, '|', 'ssh', server, "cat >> ~/d1_xml/%s" % fn], check=True) + L.info('Copying files to %s:%s : %s' % (server, mkdir_dir, files)) + scp.put(files=files, remote_path='~/d1_xml/') + return ssh except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) + exit(1) + From 0fb73777f8ecbec80897cc9341a0a116cf7c9cd6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 23:21:03 +0000 Subject: [PATCH 189/301] adding xmltodict --- poetry.lock | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index a623bab5..fb32d98a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3001,6 +3001,18 @@ files = [ [package.extras] watchdog = ["watchdog"] +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +category = "main" +optional = false +python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] + [[package]] name = "yarl" version = "1.9.2" @@ -3167,4 +3179,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "a36d4e84fd83129bea17e3e150ea2c3b8504787a8037a3191a30ca3435e5590d" +content-hash = "e8636553583eddd301440f14f03e93c84d58f454ea9de8f87796c3cda180d398" From 53bf84b7901b03e66efc14272693cae237f754a3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 23:26:56 +0000 Subject: [PATCH 190/301] adding remote cn server actions --- mnonboard/cli.py | 12 +++++-- mnonboard/defs.py | 7 ++++ mnonboard/utils.py | 86 +++++++++++++++++++++++++++++++++++++++------- 3 files changed, 91 insertions(+), 14 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index b77b9c24..687c9bfa 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -4,7 +4,7 @@ from mnonboard import utils from mnonboard import info_chx from mnonboard import data_chx -from mnonboard.defs import CFG, HELP_TEXT, CN_SRVR, CN_SRVR_BASEURL +from mnonboard.defs import CFG, HELP_TEXT, SO_SRVR, CN_SRVR, CN_SRVR_BASEURL, CN_CERT_LOC, APPROVE_SCRIPT_LOC from mnonboard import default_json, L def run(cfg): @@ -57,7 +57,15 @@ def run(cfg): # create xml to upload for validation (step 15) files = utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) # uploading xml (proceed to step 14 and ssh to find xml in ~/d1_xml) - ssh = utils.upload_xml(files=files, server=cfg['cn_url']) + ssh, work_dir = utils.start_ssh(server=cfg['cn_url'], node_id=fields['node']['node_id']) + utils.upload_xml(ssh=ssh, files=files, target_dir=work_dir) + # create and validate the subject in the accounts service (step 16) + utils.create_subj_in_acct_svc(ssh=ssh, cert=CN_CERT_LOC, files=files, cn=cfg['cn_url']) + utils.validate_subj_in_acct_svc(ssh=ssh, cert=CN_CERT_LOC, names=names, cn=cfg['cn_url']) + # download the node capabilities and register the node + node_filename = utils.dl_node_capabilities(ssh=ssh, baseurl=SO_SRVR[cfg['mode']], node_id=fields['node']['node_id']) + utils.register_node(ssh=ssh, cert=CN_CERT_LOC, node_filename=node_filename, cn=cfg['cn_url']) + #utils.approve_node(ssh=ssh, script_loc=APPROVE_SCRIPT_LOC) # close connection ssh.close() diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 81b0660f..a446e0e9 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -13,6 +13,10 @@ 'local': False, } +SO_SRVR = { + 'production': 'sonode.dataone.org', + 'testing': 'so.test.dataone.org' +} CN_SRVR = { 'production': 'cn.dataone.org', 'testing': 'cn-stage.test.dataone.org' @@ -20,6 +24,9 @@ CN_SRVR_BASEURL = 'https://%s/cn' +CN_CERT_LOC = '/etc/dataone/client/private/urn_node_cnStageUCSB1.pem' +APPROVE_SCRIPT_LOC = '/usr/local/bin/dataone-approve-node' + HELP_TEXT = """DataONE member node onboard script %s NCEAS/Ian Nesbitt diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 7a1a52d7..3923bc98 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -1,6 +1,9 @@ import os import json import subprocess +from paramiko import SSHClient +from scp import SCPClient +import urllib.parse as urlparse import xmltodict from mnonboard.defs import SCHEDULES, NAMES_DICT @@ -311,7 +314,29 @@ def create_names_xml(loc, node_id, names): files.append(fn) return files -def upload_xml(files: list, server: str): +def start_ssh(server: str, node_id): + """ + """ + server = server.split('https://')[1].split('/')[0] + xml_dir = '~/d1_xml/%s' % node_id + mkdir_cmd = 'mkdir -p %s' % xml_dir + cd_cmd = 'cd %s' % xml_dir + try: + ssh = SSHClient() + ssh.load_system_host_keys() + ssh.connect(server) + L.info('Running "%s" on %s' % (mkdir_cmd, server)) + op = 'mkdir on remote server' + ssh.exec_command(mkdir_cmd) + L.info('Running "%s" on %s' % (cd_cmd, server)) + op = 'cd on remote server' + ssh.exec_command(cd_cmd) + return ssh, xml_dir + except Exception as e: + L.error('%s running %s. Details: %s' % (repr(e), op, e)) + exit(1) + +def upload_xml(ssh: SSHClient, files: list, server: str, target_dir: str): """ Format subject XML documents and return list of names. @@ -320,22 +345,59 @@ def upload_xml(files: list, server: str): server (str): Location of CN server to upload to. """ op = '' - server = server.split('https://')[1].split('/')[0] - mkdir_dir = '~/d1_xml/' - mkdir_cmd = 'mkdir -p %s' % mkdir_dir - L.info('Running "%s" on %s' % (mkdir_cmd, server)) try: op = 'mkdir on remote server' - ssh = SSHClient() - ssh.load_system_host_keys() - ssh.connect(server) - ssh.exec_command(mkdir_cmd) with SCPClient(ssh.get_transport()) as scp: op = 'scp to remote server' - L.info('Copying files to %s:%s : %s' % (server, mkdir_dir, files)) - scp.put(files=files, remote_path='~/d1_xml/') - return ssh + L.info('Copying files to %s:%s : %s' % (server, target_dir, files)) + scp.put(files=files, remote_path=target_dir) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) exit(1) +def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str): + """ + """ + for f in files: + f = os.path.split(f)[1] + command = 'curl -s --cert %s -F person=@%s -X POST https://%s/cn/v2/accounts' % ( + cert, f, cn + ) + L.info('Creating subject: %s' % (command)) + ssh.exec_command(command) + +def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str): + """ + """ + for n in names: + orcid_urlenc = urlparse.quote(n) + command = 'curl -s --cert %s -X PUT https://%s/cn/v2/accounts/verification/%s' % ( + cert, cn, orcid_urlenc + ) + L.info('Validating subject: %s' % (command)) + ssh.exec_command(command) + +def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_id: str): + """ + """ + node_filename = '%s-node.xml' % (node_id) + command = 'curl "https://%s/v2/node" > %s' % (baseurl, node_filename) + L.info('Downloading node capabilities: %s' % (command)) + ssh.exec_command(command) + return node_filename + +def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str): + """ + """ + command = """sudo curl --cert %s -X post -F 'node=@%s' "https://%s/cn/v2/node" """ % ( + cert, node_filename, cn + ) + L.info('Registering node: %s' % (command)) + ssh.exec_command(command) + +def approve_node(ssh: SSHClient, script_loc: str): + """ + """ + command = 'sudo %s' % script_loc + L.info('Starting approval script: %s' % (command)) + ssh.exec_command(command) From d15be7b8597841b592bdee812137fdef87d555c5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 26 May 2023 23:32:48 +0000 Subject: [PATCH 191/301] fixing missing positional arg --- mnonboard/utils.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 3923bc98..75a7aaf8 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -336,20 +336,19 @@ def start_ssh(server: str, node_id): L.error('%s running %s. Details: %s' % (repr(e), op, e)) exit(1) -def upload_xml(ssh: SSHClient, files: list, server: str, target_dir: str): +def upload_xml(ssh: SSHClient, files: list, target_dir: str): """ Format subject XML documents and return list of names. Args: files (list): List of files to upload. - server (str): Location of CN server to upload to. """ op = '' try: op = 'mkdir on remote server' with SCPClient(ssh.get_transport()) as scp: op = 'scp to remote server' - L.info('Copying files to %s:%s : %s' % (server, target_dir, files)) + L.info('Copying files to remote %s : %s' % (target_dir, files)) scp.put(files=files, remote_path=target_dir) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) From 2631e67543028b2a1c2db3624e83bb5531bc9c40 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 30 May 2023 18:44:52 +0000 Subject: [PATCH 192/301] adding sleep --- mnonboard/cli.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 687c9bfa..122ef4c1 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -1,5 +1,6 @@ import os, sys import getopt +import time from mnonboard import utils from mnonboard import info_chx @@ -57,7 +58,7 @@ def run(cfg): # create xml to upload for validation (step 15) files = utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) # uploading xml (proceed to step 14 and ssh to find xml in ~/d1_xml) - ssh, work_dir = utils.start_ssh(server=cfg['cn_url'], node_id=fields['node']['node_id']) + time.sleep(0.5) utils.upload_xml(ssh=ssh, files=files, target_dir=work_dir) # create and validate the subject in the accounts service (step 16) utils.create_subj_in_acct_svc(ssh=ssh, cert=CN_CERT_LOC, files=files, cn=cfg['cn_url']) From 1cce2e1d0750b00e168ca4f8bb30c4826172287b Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 30 May 2023 18:47:10 +0000 Subject: [PATCH 193/301] adding node id return to ssh function --- mnonboard/cli.py | 1 + mnonboard/utils.py | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 122ef4c1..d275cd89 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -58,6 +58,7 @@ def run(cfg): # create xml to upload for validation (step 15) files = utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) # uploading xml (proceed to step 14 and ssh to find xml in ~/d1_xml) + ssh, work_dir, node_id = utils.start_ssh(server=cfg['cn_url'], node_id=fields['node']['node_id']) time.sleep(0.5) utils.upload_xml(ssh=ssh, files=files, target_dir=work_dir) # create and validate the subject in the accounts service (step 16) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 75a7aaf8..bcad64a0 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -318,8 +318,9 @@ def start_ssh(server: str, node_id): """ """ server = server.split('https://')[1].split('/')[0] - xml_dir = '~/d1_xml/%s' % node_id - mkdir_cmd = 'mkdir -p %s' % xml_dir + node_id = node_id.split(':')[-1] + xml_dir = '~/d1_xml/%s' % (node_id) + mkdir_cmd = 'mkdir -p %s' % (xml_dir) cd_cmd = 'cd %s' % xml_dir try: ssh = SSHClient() @@ -331,7 +332,7 @@ def start_ssh(server: str, node_id): L.info('Running "%s" on %s' % (cd_cmd, server)) op = 'cd on remote server' ssh.exec_command(cd_cmd) - return ssh, xml_dir + return ssh, xml_dir, node_id except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) exit(1) From 9b1daeafd6cb05525c06f8f9b63189e837f4d7d7 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 30 May 2023 18:48:02 +0000 Subject: [PATCH 194/301] adding node id to node capabilities function --- mnonboard/cli.py | 2 +- mnonboard/utils.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index d275cd89..27b9f787 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -65,7 +65,7 @@ def run(cfg): utils.create_subj_in_acct_svc(ssh=ssh, cert=CN_CERT_LOC, files=files, cn=cfg['cn_url']) utils.validate_subj_in_acct_svc(ssh=ssh, cert=CN_CERT_LOC, names=names, cn=cfg['cn_url']) # download the node capabilities and register the node - node_filename = utils.dl_node_capabilities(ssh=ssh, baseurl=SO_SRVR[cfg['mode']], node_id=fields['node']['node_id']) + node_filename = utils.dl_node_capabilities(ssh=ssh, baseurl=SO_SRVR[cfg['mode']], node_dir=work_dir, node_id=node_id) utils.register_node(ssh=ssh, cert=CN_CERT_LOC, node_filename=node_filename, cn=cfg['cn_url']) #utils.approve_node(ssh=ssh, script_loc=APPROVE_SCRIPT_LOC) # close connection diff --git a/mnonboard/utils.py b/mnonboard/utils.py index bcad64a0..31d889d5 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -377,10 +377,10 @@ def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str): L.info('Validating subject: %s' % (command)) ssh.exec_command(command) -def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_id: str): +def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_dir: str, node_id: str): """ """ - node_filename = '%s-node.xml' % (node_id) + node_filename = '%s/%s-node.xml' % (node_dir, node_id) command = 'curl "https://%s/v2/node" > %s' % (baseurl, node_filename) L.info('Downloading node capabilities: %s' % (command)) ssh.exec_command(command) From 9e2af4c570ec7c7b5b5e5d5edb2136ce64404bbf Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 30 May 2023 18:48:53 +0000 Subject: [PATCH 195/301] adding parentheses to a string format --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 31d889d5..f3123d7b 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -398,6 +398,6 @@ def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str): def approve_node(ssh: SSHClient, script_loc: str): """ """ - command = 'sudo %s' % script_loc + command = 'sudo %s' % (script_loc) L.info('Starting approval script: %s' % (command)) ssh.exec_command(command) From f5da68849d8d41c6dd662a7bb8dd796cc1238b62 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 1 Jun 2023 17:56:38 +0000 Subject: [PATCH 196/301] addressing #25 --- mnonboard/utils.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index f3123d7b..ab8b2c6e 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -306,11 +306,9 @@ def create_names_xml(loc, node_id, names): xd['ns2:person']['subject'] = id xd['ns2:person']['givenName'] = first xd['ns2:person']['familyName'] = last - xm = xmltodict.unparse(xd) fn = os.path.join(loc, '%s_%s%s.xml' % (node_id, first[0], last)) + xmltodict.unparse(xd, output=fn) L.debug('XML path: %s' % fn) - L.debug('XML content:\n%s' % (xm)) - save_xml(fn, xm) files.append(fn) return files @@ -360,7 +358,7 @@ def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str): """ for f in files: f = os.path.split(f)[1] - command = 'curl -s --cert %s -F person=@%s -X POST https://%s/cn/v2/accounts' % ( + command = 'curl -s --cert %s -F person=@%s -X POST %s/v2/accounts' % ( cert, f, cn ) L.info('Creating subject: %s' % (command)) @@ -371,7 +369,7 @@ def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str): """ for n in names: orcid_urlenc = urlparse.quote(n) - command = 'curl -s --cert %s -X PUT https://%s/cn/v2/accounts/verification/%s' % ( + command = 'curl -s --cert %s -X PUT %s/v2/accounts/verification/%s' % ( cert, cn, orcid_urlenc ) L.info('Validating subject: %s' % (command)) From 1775d4ef5f0a96a5a34c956c65a32c1431b6d1a2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 1 Jun 2023 18:10:58 +0000 Subject: [PATCH 197/301] removing save_xml function (#25) --- mnonboard/utils.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index ab8b2c6e..b692710c 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -57,27 +57,6 @@ def save_json(loc, jf): L.error('Error: %s' % e) exit(1) -def save_xml(loc, xst): - """ - Output XML string to file. - - Args: - loc (str): File location where the XML file is to be written. - xst (str): XML-formatted string to be written to file. - - Returns: - (No variable is returned) - """ - L.info('Writing XML to %s' % loc) - try: - with open(loc, 'w+') as f: - json.dump(xst, f, indent=4) - L.info('File written to %s' % loc) - return - except Exception as e: - L.error('Error: %s' % e) - exit(1) - def save_report(rep_str, loc, format='.csv'): """ Output a validation report for a set of metadata. From 15e64deb7049d69032fcfd0a1c753fd63dc35df6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 1 Jun 2023 19:52:13 +0000 Subject: [PATCH 198/301] adding partial fix for #24 --- mnonboard/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index b692710c..0ebe124b 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -337,7 +337,7 @@ def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str): """ for f in files: f = os.path.split(f)[1] - command = 'curl -s --cert %s -F person=@%s -X POST %s/v2/accounts' % ( + command = 'sudo curl -s --cert %s -F person=@%s -X POST %s/v2/accounts' % ( cert, f, cn ) L.info('Creating subject: %s' % (command)) @@ -348,7 +348,7 @@ def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str): """ for n in names: orcid_urlenc = urlparse.quote(n) - command = 'curl -s --cert %s -X PUT %s/v2/accounts/verification/%s' % ( + command = 'sudo curl -s --cert %s -X PUT %s/v2/accounts/verification/%s' % ( cert, cn, orcid_urlenc ) L.info('Validating subject: %s' % (command)) @@ -358,7 +358,7 @@ def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_dir: str, node_id: s """ """ node_filename = '%s/%s-node.xml' % (node_dir, node_id) - command = 'curl "https://%s/v2/node" > %s' % (baseurl, node_filename) + command = 'sudo curl "https://%s/v2/node" > %s' % (baseurl, node_filename) L.info('Downloading node capabilities: %s' % (command)) ssh.exec_command(command) return node_filename From 0bcb07da353b50c98a92b157c20b820400897a0f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 5 Jun 2023 21:04:26 +0000 Subject: [PATCH 199/301] remove `/` from safe chars (#25) --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0ebe124b..a397f29d 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -347,7 +347,7 @@ def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str): """ """ for n in names: - orcid_urlenc = urlparse.quote(n) + orcid_urlenc = urlparse.quote(n, safe='-') command = 'sudo curl -s --cert %s -X PUT %s/v2/accounts/verification/%s' % ( cert, cn, orcid_urlenc ) From 00ff9b5bc0ea76fe98e79d1dcc9185f5c23c09bb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 5 Jun 2023 21:04:47 +0000 Subject: [PATCH 200/301] addressing #25 --- mnonboard/utils.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index a397f29d..e8b5673d 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -5,6 +5,7 @@ from scp import SCPClient import urllib.parse as urlparse import xmltodict +from pathlib import Path from mnonboard.defs import SCHEDULES, NAMES_DICT from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L @@ -286,7 +287,8 @@ def create_names_xml(loc, node_id, names): xd['ns2:person']['givenName'] = first xd['ns2:person']['familyName'] = last fn = os.path.join(loc, '%s_%s%s.xml' % (node_id, first[0], last)) - xmltodict.unparse(xd, output=fn) + with open(fn, 'w') as f: + xmltodict.unparse(xd, output=f) L.debug('XML path: %s' % fn) files.append(fn) return files @@ -366,8 +368,10 @@ def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_dir: str, node_id: s def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str): """ """ - command = """sudo curl --cert %s -X post -F 'node=@%s' "https://%s/cn/v2/node" """ % ( - cert, node_filename, cn + node_filename = os.path.split(node_filename)[1] + mn = node_filename.split('-')[0] + command = """sudo curl --cert %s -X post -F 'node=@%s' "%s/%s/v2/node" """ % ( + cert, node_filename, cn, mn ) L.info('Registering node: %s' % (command)) ssh.exec_command(command) From 84c5b710bafd9f242309b8a8abefef7d4f034540 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 6 Jun 2023 18:53:42 +0000 Subject: [PATCH 201/301] adding dataone-common --- poetry.lock | 30 +++++++++++++++++++++--------- pyproject.toml | 1 + 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index fb32d98a..3ff06e65 100644 --- a/poetry.lock +++ b/poetry.lock @@ -628,22 +628,22 @@ files = [ [[package]] name = "dataone-common" -version = "3.5.0" +version = "3.5.2" description = "Contains functionality common to projects that interact with the DataONE infrastructure via Python" category = "main" optional = false python-versions = "*" files = [ - {file = "dataone.common-3.5.0-py3-none-any.whl", hash = "sha256:4a7e5b0c737fb418d46780b8cd4fdfba0ece9c0ee9bf2fc8d2d4ded04ba60952"}, + {file = "dataone.common-3.5.2-py3-none-any.whl", hash = "sha256:8cbe7fe282f09fcf7846fa3131814db9fefdff15da29a0910086201cd45226f6"}, ] [package.dependencies] -cryptography = ">=3.0" -iso8601 = ">=0.1.12" -pyasn1 = ">=0.4.8" -PyJWT = ">=1.7.1" -pyxb = ">=1.2.6" -rdflib = ">=5.0.0" +cryptography = ">=40.0.2" +iso8601 = ">=1.1.0" +pyasn1 = ">=0.5.0" +PyJWT = ">=2.7.0" +pyxb-x = ">=1.2.6.1" +rdflib = ">=6.3.2" zipstream = ">=1.1.4" [[package]] @@ -2016,6 +2016,18 @@ files = [ {file = "PyXB-1.2.6.tar.gz", hash = "sha256:2a00f38dd1d87b88f92d79bc5a09718d730419b88e814545f472bbd5a3bf27b4"}, ] +[[package]] +name = "pyxb-x" +version = "1.2.6.1" +description = "PyXB-X (\"pixbix\") is a pure Python package that generates Python source code for classes that correspond to data structures defined by XMLSchema." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PyXB-X-1.2.6.1.tar.gz", hash = "sha256:60e908d2555882c81aff54a24f27ed097c5feec61ac97ebdf6684cdf6aa6f209"}, + {file = "PyXB_X-1.2.6.1-py3-none-any.whl", hash = "sha256:09a12a8c3b82f3ef8f9b3fd460b435236500b65270c6f39a0dc47a11231b3667"}, +] + [[package]] name = "queuelib" version = "1.6.2" @@ -3179,4 +3191,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e8636553583eddd301440f14f03e93c84d58f454ea9de8f87796c3cda180d398" +content-hash = "f1a9232f97baeaf304dc183b87a967dbbc4d261cf8301d29c9b0bea828f2c9ca" diff --git a/pyproject.toml b/pyproject.toml index ad859556..53811fa1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,6 +37,7 @@ uwsgi = "^2.0.21" paramiko = "^3.2.0" scp = "^0.14.5" xmltodict = "^0.13.0" +dataone-common = "^3.5.2" [tool.poetry.dev-dependencies] pytest = "^6.1.2" From 6b7f7a133e78808bf629bfe5dce2f8e4c3a6e0e1 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 14 Aug 2023 17:44:29 +0000 Subject: [PATCH 202/301] move node settings write before subject reg --- mnonboard/cli.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 27b9f787..dc1f793b 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -39,15 +39,15 @@ def run(cfg): name = utils.get_or_create_subj(loc=loc, value=val, cn_url=cfg['cn_url'], title=f) # store this for a few steps later names[val] = name - # add node as a subject (step 7) - utils.get_or_create_subj(loc=loc, value=fields['node']['node_id'], - cn_url=cfg['cn_url'], - name=end_node_subj) # set the update schedule and set the state to up fields['node']['schedule'] = utils.set_schedule() fields['node']['state'] = 'up' # okay, now overwrite the default node.json with our new one (step 8) utils.save_json(loc=os.path.join(loc, 'node.json'), jf=fields) + # add node as a subject (step 7) + utils.get_or_create_subj(loc=loc, value=fields['node']['node_id'], + cn_url=cfg['cn_url'], + name=end_node_subj) # restart the mnlite process to pick up the new node.json (step 9) utils.restart_mnlite() # run scrapy to harvest metadata (step 10) From e457c0fa5fcd28867c0d7289d9a5c30bfe604afb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 14 Aug 2023 18:11:44 +0000 Subject: [PATCH 203/301] adding `d1_python.cnclient` operations (#26) --- mnonboard/cli.py | 8 ++++++++ mnonboard/cn.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ mnonboard/defs.py | 1 + 3 files changed, 55 insertions(+) create mode 100644 mnonboard/cn.py diff --git a/mnonboard/cli.py b/mnonboard/cli.py index dc1f793b..1b09eb93 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -5,6 +5,7 @@ from mnonboard import utils from mnonboard import info_chx from mnonboard import data_chx +from mnonboard import cn from mnonboard.defs import CFG, HELP_TEXT, SO_SRVR, CN_SRVR, CN_SRVR_BASEURL, CN_CERT_LOC, APPROVE_SCRIPT_LOC from mnonboard import default_json, L @@ -16,6 +17,13 @@ def run(cfg): Args: cfg (dict): Dict containing config variables. """ + # auth + if not cfg['token']: + cfg['token'] = os.environ.get('D1_AUTH_TOKEN') + if not cfg['token']: + print('Your DataONE auth token is missing. Please enter it here and/or store it in the env variable "D1_AUTH_TOKEN".') + cfg['token'] = info_chx.req_input('Please enter your DataONE authentication token: ') + DC = cn.init_client(cn_url=cfg['cn_url'], auth_token=cfg['token']) if cfg['info'] == 'user': # do the full user-driven info gathering process ufields = info_chx.user_input() diff --git a/mnonboard/cn.py b/mnonboard/cn.py new file mode 100644 index 00000000..5820af79 --- /dev/null +++ b/mnonboard/cn.py @@ -0,0 +1,46 @@ +from os import environ +from d1_client.cnclient import CoordinatingNodeClient +from d1_common.types.dataoneTypes import Subject, person + +from . import defs + +def init_client(cn_url: str, auth_token: str): + """ + Initialize a d1_client.cnclient.CoordinatingNodeClient instance. + + :param str cn_url: The URL + """ + options: dict = {"headers": {"Authorization": "Bearer " + auth_token}} + return CoordinatingNodeClient(cn_url, **options) + +def get_subjects(client: CoordinatingNodeClient, orcid: str): + """ + """ + return client.getSubjectInfo(orcid) + +def get_first_subject(client: CoordinatingNodeClient, orcid: str): + """ + """ + try: + return get_subjects(client=client, orcid=orcid)[0] + except IndexError: + return None + +def get_subject_name(subject: Subject): + """ + """ + first, last = subject.content()[0].content()[1], subject.content()[0].content()[2] + return "%s %s" % (first, last) + +def node_list(client: CoordinatingNodeClient): + """ + """ + nodes = client.listNodes() + for node in nodes.content(): + print(node.name) + return nodes + +def register_user(client: CoordinatingNodeClient, orcid: str, name: str, email: str=None): + """ + """ + diff --git a/mnonboard/defs.py b/mnonboard/defs.py index a446e0e9..94149e7d 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -9,6 +9,7 @@ 'json_file': 'node.json', 'cn_url': 'https://cn-stage.test.dataone.org/cn', 'mode': 'testing', + 'token': None, 'check_files': 5, 'local': False, } From c34a51c3f144d1e02e0a9b33635e4eff428d16fe Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 15 Aug 2023 16:48:27 +0000 Subject: [PATCH 204/301] fixing node document download (#24) --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index e8b5673d..9a0df8d0 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -360,7 +360,7 @@ def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_dir: str, node_id: s """ """ node_filename = '%s/%s-node.xml' % (node_dir, node_id) - command = 'sudo curl "https://%s/v2/node" > %s' % (baseurl, node_filename) + command = 'sudo curl "https://%s/%s/v2/node" > %s' % (baseurl, node_id, node_filename) L.info('Downloading node capabilities: %s' % (command)) ssh.exec_command(command) return node_filename From a12faec8f837ed0b84a821eec94decba5cb990b5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 15 Aug 2023 17:11:38 +0000 Subject: [PATCH 205/301] correction under #24 --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 9a0df8d0..42706c21 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -370,7 +370,7 @@ def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str): """ node_filename = os.path.split(node_filename)[1] mn = node_filename.split('-')[0] - command = """sudo curl --cert %s -X post -F 'node=@%s' "%s/%s/v2/node" """ % ( + command = """sudo curl --cert %s -X POST -F 'node=@%s' "%s/v2/node" """ % ( cert, node_filename, cn, mn ) L.info('Registering node: %s' % (command)) From 581a1b10e196622105bce4aa766a7fecb715875f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 23 Aug 2023 18:36:27 +0000 Subject: [PATCH 206/301] addressing #27 --- mnonboard/info_chx.py | 19 +++++++++++++++++++ mnonboard/utils.py | 6 +++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index a0031f0c..67b46f7a 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -267,6 +267,25 @@ def local_subj_lookup(subj, loc): L.info('No subject found.') return False +def set_role(loc, title, value): + """ + Set the subject's role in the opersist database accordingly. + This should be done before harvest time in order for mnlite to be able to + populate this information when requested by the web front-end or API. + + :param str loc: The location of the opersist database parent folder + :param str title: ``default_submitter`` or ``default_owner`` + """ + L.info('Setting %s as "%s" in sqlite database at %s' % (value, title, loc)) + op = getOpersistInstance(loc) + rec = op.getSubject(subj=value) + if title in 'default_submitter': + op.setDefaultSubmitter(rec) + if title in 'default_owner': + op.setDefaultOwner(rec) + op.close() + L.info('OPersist record set.') + def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 42706c21..c831e8a5 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -9,7 +9,7 @@ from mnonboard.defs import SCHEDULES, NAMES_DICT from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L -from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name +from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name, set_role def load_json(loc): """ @@ -145,6 +145,7 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal loc (str): Location of the opersist instance. value (str): Subject value (unique subject id, such as orcid or member node id). cn_url (str): The base URL of the rest API with which to search for the given subject. + title (str): The subject's role in relation to the database. name (str or bool): Subject name (human readable). """ create = False @@ -166,6 +167,9 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal if create: # finally, use opersist to create the subject (sloppy, could create it directly, but this does the same thing) new_subj(loc, name, value) + # then use opersist to set the subject's role + if title in ('default_owner', 'default_submitter'): + set_role(loc=loc, title=title, value=value) return name def set_schedule(): From f9437b3073bf40c35a91efb45db18e8d518434e7 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 23 Aug 2023 20:16:37 +0000 Subject: [PATCH 207/301] working bugs out for #27 --- mnonboard/info_chx.py | 22 ++++++++++++---------- mnonboard/utils.py | 20 +++++++------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 67b46f7a..6067b3ad 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -244,28 +244,29 @@ def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): L.error('Unspecified error from %s:\n%s' % (cn_url, e)) exit(1) -def local_subj_lookup(subj, loc): +def local_subj_lookup(subj, name, loc, retn=False): """ Use the local opersist instance to look up a subject. Args: subj (str): Subject id (unique). loc (str): Location of the opersist instance. + name (str): Name of subject. + retn (bool): Whether to return the record. Returns: (str or False): Returns subject name or False if not found. """ L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) - rec = op.getSubject(subj=subj) + rec = op.getSubject(subj=subj, name=name, create_if_missing=True) op.close() - if rec: + if retn: rec = rec.asJsonDict() - L.info('Found record: %s' % (rec)) + L.info('Record: %s' % (rec)) return rec['name'] else: - L.info('No subject found.') - return False + return def set_role(loc, title, value): """ @@ -279,10 +280,11 @@ def set_role(loc, title, value): L.info('Setting %s as "%s" in sqlite database at %s' % (value, title, loc)) op = getOpersistInstance(loc) rec = op.getSubject(subj=value) - if title in 'default_submitter': - op.setDefaultSubmitter(rec) - if title in 'default_owner': - op.setDefaultOwner(rec) + if rec: + if title in 'default_submitter': + op.setDefaultSubmitter(value) + if title in 'default_owner': + op.setDefaultOwner(value) op.close() L.info('OPersist record set.') diff --git a/mnonboard/utils.py b/mnonboard/utils.py index c831e8a5..3c839d4a 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -135,7 +135,7 @@ def new_subj(loc, name, value): L.error('opersist subject creation command failed for %s (%s): %s' % (name, value, e)) exit(1) -def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=False): +def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=None): """ Get an existing subject using their ORCiD or create a new one with the specified values. Search is conducted first at the given coordinating node URL, then locally. @@ -148,28 +148,22 @@ def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=Fal title (str): The subject's role in relation to the database. name (str or bool): Subject name (human readable). """ - create = False if name: # we are probably creating a node record L.info('Creating a node subject.') - create = True else: # name was not given. look up the orcid record in the database name = cn_subj_lookup(subj=value, cn_url=cn_url) - if not name: - name = local_subj_lookup(subj=value, loc=loc) if not name: # if the name is not in either database, we will create it; else it's already there and we ignore it - L.info('%s does not exist either locally or at %s. Will create a record. Need a name first...' % (value, cn_url)) + L.info('%s does not exist at %s. Need a name for local record creation...' % (value, cn_url)) # ask the user for a name with the associated position and ORCiD record name = orcid_name(value, title) - create = True - if create: - # finally, use opersist to create the subject (sloppy, could create it directly, but this does the same thing) - new_subj(loc, name, value) - # then use opersist to set the subject's role - if title in ('default_owner', 'default_submitter'): - set_role(loc=loc, title=title, value=value) + # finally, use opersist to create the subject + local_subj_lookup(loc=loc, subj=value, name=name) + # then use opersist to set the subject's role + if title in ('default_owner', 'default_submitter'): + set_role(loc=loc, title=title, value=value) return name def set_schedule(): From b474866ecf34205c566c4523e72cdcf700396fd4 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 23 Aug 2023 20:32:54 +0000 Subject: [PATCH 208/301] fixing node registration command --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 3c839d4a..707bb549 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -369,7 +369,7 @@ def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str): node_filename = os.path.split(node_filename)[1] mn = node_filename.split('-')[0] command = """sudo curl --cert %s -X POST -F 'node=@%s' "%s/v2/node" """ % ( - cert, node_filename, cn, mn + cert, node_filename, cn ) L.info('Registering node: %s' % (command)) ssh.exec_command(command) From 948e329cde57cc3a62958c2a5abba33943ce5879 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 23 Aug 2023 20:33:42 +0000 Subject: [PATCH 209/301] adding some cn/d1_python logic --- mnonboard/cn.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mnonboard/cn.py b/mnonboard/cn.py index 5820af79..7de8f88a 100644 --- a/mnonboard/cn.py +++ b/mnonboard/cn.py @@ -1,6 +1,7 @@ from os import environ from d1_client.cnclient import CoordinatingNodeClient from d1_common.types.dataoneTypes import Subject, person +import d1_admin_tools as d1np from . import defs @@ -44,3 +45,6 @@ def register_user(client: CoordinatingNodeClient, orcid: str, name: str, email: """ """ +def set_nodes_properties(nodes_properties: dict, con=None): + """ + """ From 447d83d65ab3c4115ca5d4d148c875fc636a989b Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 25 Aug 2023 17:43:15 +0000 Subject: [PATCH 210/301] autothrottle for scrape and sitemap crawl (#23) --- soscan/settings.py | 18 +++++++++--------- soscan/settings_sitemap.py | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/soscan/settings.py b/soscan/settings.py index 38d82028..0824c51b 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -79,21 +79,21 @@ # Enable and configure the AutoThrottle extension (disabled by default) # See https://docs.scrapy.org/en/latest/topics/autothrottle.html -# AUTOTHROTTLE_ENABLED = True +AUTOTHROTTLE_ENABLED = True # The initial download delay -# AUTOTHROTTLE_START_DELAY = 5 +AUTOTHROTTLE_START_DELAY = 2 # The maximum download delay to be set in case of high latencies -# AUTOTHROTTLE_MAX_DELAY = 60 +AUTOTHROTTLE_MAX_DELAY = 60 # The average number of requests Scrapy should be sending in parallel to # each remote server -# AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 +AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 # Enable showing throttling stats for every response received: -# AUTOTHROTTLE_DEBUG = False +AUTOTHROTTLE_DEBUG = True # Enable and configure HTTP caching (disabled by default) # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings -# HTTPCACHE_ENABLED = True -# HTTPCACHE_EXPIRATION_SECS = 0 -# HTTPCACHE_DIR = 'httpcache' -# HTTPCACHE_IGNORE_HTTP_CODES = [] +HTTPCACHE_ENABLED = True +HTTPCACHE_EXPIRATION_SECS = 60 +HTTPCACHE_DIR = 'httpcache' +HTTPCACHE_IGNORE_HTTP_CODES = [500, 501, 502, 503, 510] # HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' diff --git a/soscan/settings_sitemap.py b/soscan/settings_sitemap.py index 6f4c0bcd..4dcb0a80 100644 --- a/soscan/settings_sitemap.py +++ b/soscan/settings_sitemap.py @@ -7,7 +7,7 @@ NEWSPIDER_MODULE = "soscan.spiders" # Crawl responsibly by identifying yourself (and your website) on the user-agent -# USER_AGENT = 'soscan (+http://www.yourdomain.com)' +USER_AGENT = 'soscan_sitemap (+http://dataone.org/)' # Obey robots.txt rules ROBOTSTXT_OBEY = True @@ -65,21 +65,21 @@ # Enable and configure the AutoThrottle extension (disabled by default) # See https://docs.scrapy.org/en/latest/topics/autothrottle.html -# AUTOTHROTTLE_ENABLED = True +AUTOTHROTTLE_ENABLED = True # The initial download delay -# AUTOTHROTTLE_START_DELAY = 5 +AUTOTHROTTLE_START_DELAY = 2 # The maximum download delay to be set in case of high latencies -# AUTOTHROTTLE_MAX_DELAY = 60 +AUTOTHROTTLE_MAX_DELAY = 60 # The average number of requests Scrapy should be sending in parallel to # each remote server -# AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 +AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 # Enable showing throttling stats for every response received: -# AUTOTHROTTLE_DEBUG = False +AUTOTHROTTLE_DEBUG = True # Enable and configure HTTP caching (disabled by default) # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings -# HTTPCACHE_ENABLED = True -# HTTPCACHE_EXPIRATION_SECS = 0 -# HTTPCACHE_DIR = 'httpcache' -# HTTPCACHE_IGNORE_HTTP_CODES = [] +HTTPCACHE_ENABLED = True +HTTPCACHE_EXPIRATION_SECS = 60 +HTTPCACHE_DIR = 'httpcache' +HTTPCACHE_IGNORE_HTTP_CODES = [500, 501, 502, 503, 510] # HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' From 836136b33a793b5355b911411c169ec6d486c6b4 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 5 Sep 2023 10:20:06 -0700 Subject: [PATCH 211/301] removing uwsgi from poetry req's (build fails) --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 53811fa1..26dbf606 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,6 @@ werkzeug = "^2.0.3,<2.1" dataone-libclient = "^3.5.0" pyshacl = "^0.22.2" attrs = ">=21.3.0" -uwsgi = "^2.0.21" paramiko = "^3.2.0" scp = "^0.14.5" xmltodict = "^0.13.0" From 058c4be5111a734657fcfc433bff2ab87a72971a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 5 Sep 2023 10:21:49 -0700 Subject: [PATCH 212/301] removing cache and increasing concurrency target --- soscan/settings.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/soscan/settings.py b/soscan/settings.py index 0824c51b..7bb91a49 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -86,14 +86,14 @@ AUTOTHROTTLE_MAX_DELAY = 60 # The average number of requests Scrapy should be sending in parallel to # each remote server -AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 +AUTOTHROTTLE_TARGET_CONCURRENCY = 2.0 # Enable showing throttling stats for every response received: AUTOTHROTTLE_DEBUG = True # Enable and configure HTTP caching (disabled by default) # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings -HTTPCACHE_ENABLED = True -HTTPCACHE_EXPIRATION_SECS = 60 -HTTPCACHE_DIR = 'httpcache' -HTTPCACHE_IGNORE_HTTP_CODES = [500, 501, 502, 503, 510] +# HTTPCACHE_ENABLED = True +# HTTPCACHE_EXPIRATION_SECS = 60 +# HTTPCACHE_DIR = 'httpcache' +# HTTPCACHE_IGNORE_HTTP_CODES = [500, 501, 502, 503, 510] # HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' From a7cff467cc36239ae676108b98ddc48185295521 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 5 Sep 2023 10:22:31 -0700 Subject: [PATCH 213/301] adding restart prompt for non-admin user --- mnonboard/utils.py | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 707bb549..7ef7039f 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -181,24 +181,32 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ - L.info('Restarting mnlite systemctl service...') - try: - subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) - L.info('Done.') - except subprocess.CalledProcessError as e: - L.error('Error restarting mnlite system service. Is it installed on your system? Error text:\n%s' % (e)) - while True: - print('mnlite was not restarted.') - i = input('Do you wish to continue? (Y/n) ') - if i.lower() == 'n': - L.info('User has chosen to abort setup after mnlite restart failed.') - exit(1) - elif i.lower() in ['y', '']: - L.info('User has chosen to continue after mnlite restart failed.') - break - else: - L.error('Invalid input at mnlite failure continue prompt: %s' % (i)) - print('You have selected an invalid option.') + i = input('Do you wish to restart the mnlite service? (Y/n) ') + while True: + if i.lower() == 'n': + break + elif i.lower() in ['y', '']: + L.info('Restarting mnlite systemctl service...') + try: + subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) + L.info('Done.') + except subprocess.CalledProcessError as e: + L.error('Error restarting mnlite system service. Is it installed on your system? Error text:\n%s' % (e)) + print('mnlite was not restarted.') + i = input('Do you wish to continue? (Y/n) ') + if i.lower() == 'n': + L.info('User has chosen to abort setup after mnlite restart failed.') + exit(1) + elif i.lower() in ['y', '']: + L.info('User has chosen to continue after mnlite restart failed.') + break + else: + L.error('Invalid input at mnlite failure continue prompt: %s' % (i)) + print('You have selected an invalid option.') + else: + L.error('Invalid input at mnlite prompt: %s' % (i)) + print('You have selected an invalid option.') + def harvest_data(loc, mn_name): """ From 33c6ac184d69ec63b00be6ddc91cf4e22d2758a8 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 5 Sep 2023 10:23:08 -0700 Subject: [PATCH 214/301] adding hourly option to scheduing presets --- mnonboard/defs.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 94149e7d..8cfde4e1 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -82,7 +82,7 @@ SCHEDULES = { # monthly on the 1st at 00:30 - 1: { + 0: { "hour": "0", "day": "1", "min": "30", @@ -91,11 +91,21 @@ "wday": "?", "year": "*" }, - # daily at 00:10 - 2: { + # daily at 00:20 + 1: { "hour": "0", "day": "*", - "min": "10", + "min": "20", + "mon": "*", + "sec": "0", + "wday": "?", + "year": "*" + }, + # hourly at :01 + 2: { + "hour": "*", + "day": "*", + "min": "1", "mon": "*", "sec": "0", "wday": "?", From f934859670d07336d9bc282503820c545f6259d6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 5 Sep 2023 10:23:30 -0700 Subject: [PATCH 215/301] removing admin tools from requirements --- mnonboard/cn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/cn.py b/mnonboard/cn.py index 7de8f88a..ac799ba7 100644 --- a/mnonboard/cn.py +++ b/mnonboard/cn.py @@ -1,7 +1,7 @@ from os import environ from d1_client.cnclient import CoordinatingNodeClient from d1_common.types.dataoneTypes import Subject, person -import d1_admin_tools as d1np +#import d1_admin_tools as d1np from . import defs From 7062565570160953d93acca467225d395e904be2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 5 Sep 2023 10:23:57 -0700 Subject: [PATCH 216/301] changing url prefix behavior to be more forgiving --- mnonboard/info_chx.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 6067b3ad..b28c5184 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -123,11 +123,11 @@ def valid_url_prefix(url, prefix, f): if prefix not in url: L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field "%s"' % (ORCID_PREFIX, f)) - exit(1) + return False if url[-1] in '/': L.error('ORCiD number in "%s" field has a trailing slash.') print('Please remove the trailing slash (/) from the end of the ORCiD number in field "%s"' % f) - exit(1) + return False return True def sitemap_urls(num_urls): @@ -159,10 +159,11 @@ def enter_schedule(): (int): User-entered integer indicating schedule choice. """ p = 'Select a starting frequency with which to scrape data from this member node.\n' \ - '1: Monthly\n' \ - '2: Daily\n' \ + '0: Monthly\n' \ + '1: Daily\n' \ + '2: Hourly\n' \ '3: Every 3 minutes\n' \ - 'Enter 1/2/3: ' + 'Enter 0/1/2/3: ' while True: i = input(p) et = 'Please enter a choice of the frequency options above.' @@ -479,8 +480,17 @@ def input_test(fields): raise ValueError('Value in field "%s" is an empty string.' % (f)) if f in ['default_owner', 'default_submitter']: # test orcid records while we're here - assert valid_url_prefix(fields[f], ORCID_PREFIX, f) - assert valid_orcid(fields[f].split('/')[-1]) + if valid_url_prefix(fields[f], NODE_ID_PREFIX, f): + L.info('%s looks like a valid nodeid') + # could test for uniqueness as well? + elif valid_url_prefix(fields[f], ORCID_PREFIX, f): + L.info('%s has a valid ORCiD url prefix') + if valid_orcid(fields[f].split('/')[-1]): + L.info('%s is a valid ORCiD') + else: + raise ValueError('Invalid ORCiD number "%s" in field %s' % (fields[f], f)) + else: + raise ValueError('Invalid value "%s" in field %s (must either be ORCiD number or "urn:node:NODE_NAME")' % (fields[f], f)) except KeyError as e: L.error('No "%s" field found in json.' % f) print('Please add the "%s" field to the json you loaded and re-run the script.') @@ -491,7 +501,8 @@ def input_test(fields): exit(1) except ValueError as e: L.error(e) - print('Please add a value in field "%s" and re-run the script.' % (f)) + print('Please add a supported value in field "%s" and re-run the script.' % (f)) + exit(1) # nest level 2 nf = '' try: @@ -502,7 +513,7 @@ def input_test(fields): if 'contact_subject' in nf: # test orcid record assert valid_url_prefix(fields[f][nf], ORCID_PREFIX, nf) - assert valid_orcid(fields[f][nf].split('/')[-1]) + assert valid_orcid(fields[f][nf].split('/')[-1]), 'Invalid ORCiD number %s in field "%s > %s"' % (fields[f][nf], f, nf) if 'node_id' in nf: # check that the node_id is valid and prompt user to change if it's not fields[f][nf] = enter_nodeid(id=fields[f][nf]) @@ -511,7 +522,7 @@ def input_test(fields): print('Please add the "%s > %s" field to the json you loaded and re-run the script.' % (f, nf)) exit(1) except AssertionError as e: - L.error('Invalid ORCiD number %s in field "%s > %s"' % (fields[f][nf], f, nf)) + L.error() print('Please correct the ORCiD number in field "%s > %s"' % (f, nf)) exit(1) except ValueError as e: From 9446d55e9dccefa8aa0d61836d1ea811e1d1e62d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 6 Sep 2023 21:51:49 +0000 Subject: [PATCH 217/301] updating dependencies --- poetry.lock | 2533 ++++++++++++++++++++++++++++++++++++++---------- pyproject.toml | 2 +- 2 files changed, 2040 insertions(+), 495 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2871245c..2386324f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. + [[package]] name = "alabaster" version = "0.7.13" @@ -5,14 +7,22 @@ description = "A configurable sidebar-enabled Sphinx theme" category = "dev" 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 = "alembic" -version = "1.10.2" +version = "1.12.0" description = "A database migration tool for SQLAlchemy." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "alembic-1.12.0-py3-none-any.whl", hash = "sha256:03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f"}, + {file = "alembic-1.12.0.tar.gz", hash = "sha256:8e7645c32e4f200675e69f0745415335eb59a3663f5feb487abfa0b30c45888b"}, +] [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} @@ -26,20 +36,25 @@ tz = ["python-dateutil"] [[package]] name = "anyio" -version = "3.6.2" +version = "4.0.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.8" +files = [ + {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, + {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, +] [package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.22)"] [[package]] name = "appdirs" @@ -48,6 +63,10 @@ description = "A small Python module for determining appropriate platform-specif category = "main" optional = false python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] [[package]] name = "appnope" @@ -56,6 +75,10 @@ description = "Disable App Nap on macOS >= 10.9" category = "dev" optional = false python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] [[package]] name = "argh" @@ -64,22 +87,31 @@ description = "An unobtrusive argparse wrapper with natural syntax" category = "dev" optional = false python-versions = "*" +files = [ + {file = "argh-0.26.2-py2.py3-none-any.whl", hash = "sha256:a9b3aaa1904eeb78e32394cd46c6f37ac0fb4af6dc488daa58971bdc7d7fcaf3"}, + {file = "argh-0.26.2.tar.gz", hash = "sha256:e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65"}, +] [[package]] name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." +version = "23.1.0" +description = "Argon2 for Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] -docs = ["sphinx", "sphinx-notfound-page", "furo"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] [[package]] name = "argon2-cffi-bindings" @@ -88,24 +120,51 @@ description = "Low-level CFFI bindings for Argon2" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] [package.dependencies] cffi = ">=1.0.1" [package.extras] -dev = ["pytest", "cogapp", "pre-commit", "wheel"] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] tests = ["pytest"] [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.0" description = "Annotate AST trees with source code positions" category = "dev" optional = false python-versions = "*" +files = [ + {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, + {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, +] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] test = ["astroid", "pytest"] @@ -117,6 +176,9 @@ description = "Atomic file writes." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" @@ -125,12 +187,16 @@ description = "Classes Without Boilerplate" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pympler", "pytest (>=4.3.0)", "six", "sphinx", "zope.interface"] docs = ["furo", "sphinx", "zope.interface"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +tests-no-zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] [[package]] name = "automat" @@ -139,13 +205,17 @@ description = "Self-service finite-state machines for the programmer on the go." category = "main" optional = false python-versions = "*" +files = [ + {file = "Automat-22.10.0-py2.py3-none-any.whl", hash = "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180"}, + {file = "Automat-22.10.0.tar.gz", hash = "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e"}, +] [package.dependencies] attrs = ">=19.2.0" six = "*" [package.extras] -visualize = ["graphviz (>0.5.1)", "Twisted (>=16.1.1)"] +visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] [[package]] name = "babel" @@ -154,6 +224,10 @@ description = "Internationalization utilities" category = "dev" 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\""} @@ -165,25 +239,51 @@ description = "Specifications for callback functions passed in to an API" category = "dev" optional = false python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] [[package]] -name = "backports.zoneinfo" +name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, +] [package.extras] tzdata = ["tzdata"] [[package]] name = "beautifulsoup4" -version = "4.12.0" +version = "4.12.2" description = "Screen-scraping library" category = "dev" 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" @@ -199,6 +299,9 @@ description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] [package.dependencies] appdirs = "*" @@ -221,6 +324,10 @@ description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, +] [package.dependencies] six = ">=1.9.0" @@ -231,19 +338,27 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] [[package]] name = "cachetools" -version = "5.3.0" +version = "5.3.1" description = "Extensible memoizing collections and decorators" category = "main" optional = false -python-versions = "~=3.7" +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, + {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, +] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] [[package]] name = "cffi" @@ -252,17 +367,160 @@ description = "Foreign Function Interface for Python calling C code." category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] [[package]] name = "click" @@ -271,6 +529,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -282,20 +544,28 @@ 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 = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "comm" -version = "0.1.3" +version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, +] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] -lint = ["black (>=22.6.0)", "mdformat-gfm (>=0.3.5)", "mdformat (>0.7)", "ruff (>=0.0.156)"] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] typing = ["mypy (>=0.990)"] @@ -306,27 +576,56 @@ description = "Symbolic constants in Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, + {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, +] [[package]] name = "cryptography" -version = "40.0.0" +version = "41.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, + {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, + {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, + {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, +] [package.dependencies] cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "ruff", "mypy", "check-manifest"] -sdist = ["setuptools-rust (>=0.11.4)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-shard (>=0.1.2)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -tox = ["tox"] [[package]] name = "cssselect" @@ -335,6 +634,10 @@ description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] [[package]] name = "dateparser" @@ -343,6 +646,10 @@ description = "Date parsing library designed to parse dates from HTML pages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "dateparser-1.1.8-py2.py3-none-any.whl", hash = "sha256:070b29b5bbf4b1ec2cd51c96ea040dc68a614de703910a91ad1abba18f9f379f"}, + {file = "dateparser-1.1.8.tar.gz", hash = "sha256:86b8b7517efcc558f085a142cdb7620f0921543fcabdb538c8a4c4001d8178e3"}, +] [package.dependencies] python-dateutil = "*" @@ -351,17 +658,37 @@ regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27" tzlocal = "*" [package.extras] -calendars = ["hijri-converter", "convertdate"] +calendars = ["convertdate", "hijri-converter"] fasttext = ["fasttext"] langdetect = ["langdetect"] [[package]] name = "debugpy" -version = "1.6.6" +version = "1.6.7.post1" description = "An implementation of the Debug Adapter Protocol for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, + {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, + {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, +] [[package]] name = "decorator" @@ -370,6 +697,10 @@ description = "Decorators for Humans" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] [[package]] name = "defusedxml" @@ -378,14 +709,22 @@ description = "XML bomb protection for Python stdlib modules" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] [[package]] name = "diskcache" -version = "5.4.0" +version = "5.6.3" description = "Disk Cache -- Disk and file backed persistent cache." category = "main" optional = false python-versions = ">=3" +files = [ + {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, + {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, +] [[package]] name = "docutils" @@ -394,21 +733,29 @@ description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, + {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, +] [[package]] name = "dynaconf" -version = "3.1.12" +version = "3.2.2" description = "The dynamic configurator for your Python Project" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "dynaconf-3.2.2-py2.py3-none-any.whl", hash = "sha256:0d62e51af6e9971e8e45cabee487ec70467d6c5065a9f070beac973bedaf1d54"}, + {file = "dynaconf-3.2.2.tar.gz", hash = "sha256:2f98ec85a2b8edb767b3ed0f82c6d605d30af116ce4622932a719ba70ff152fc"}, +] [package.extras] -all = ["redis", "ruamel.yaml", "configobj", "hvac"] +all = ["configobj", "hvac", "redis", "ruamel.yaml"] configobj = ["configobj"] ini = ["configobj"] redis = ["redis"] -test = ["pytest", "pytest-cov", "pytest-xdist", "pytest-mock", "flake8", "pep8-naming", "flake8-debugger", "flake8-print", "flake8-todo", "radon", "flask (>=0.12)", "django", "python-dotenv", "toml", "codecov", "redis", "hvac", "configobj"] +test = ["configobj", "django", "flake8", "flake8-debugger", "flake8-print", "flake8-todo", "flask (>=0.12)", "hvac", "pep8-naming", "pytest", "pytest-cov", "pytest-mock", "pytest-xdist", "python-dotenv", "radon", "redis", "toml"] toml = ["toml"] vault = ["hvac"] yaml = ["ruamel.yaml"] @@ -420,6 +767,25 @@ description = "Discover and load entry points from installed packages." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] [[package]] name = "executing" @@ -428,32 +794,47 @@ description = "Get the currently executing AST node of a frame, and other inform category = "dev" optional = false python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] [package.extras] -tests = ["asttokens", "pytest", "littleutils", "rich"] +tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" -version = "2.16.3" +version = "2.18.0" description = "Fastest Python implementation of JSON schema" category = "dev" optional = false python-versions = "*" +files = [ + {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, + {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, +] [package.extras] -devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] [[package]] name = "filelock" -version = "3.10.4" +version = "3.12.3" description = "A platform independent file lock." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, + {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)", "pytest (>=7.2.2)"] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] [[package]] name = "flask" @@ -462,6 +843,10 @@ description = "A simple framework for building complex web applications." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Flask-1.1.2-py2.py3-none-any.whl", hash = "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557"}, + {file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"}, +] [package.dependencies] click = ">=5.1" @@ -470,8 +855,8 @@ Jinja2 = ">=2.10.1" Werkzeug = ">=0.15" [package.extras] -dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] -docs = ["sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] +docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] dotenv = ["python-dotenv"] [[package]] @@ -481,6 +866,10 @@ description = "Custom Accept header routing support for Flask" category = "main" optional = false python-versions = "*" +files = [ + {file = "flask_accept-0.0.6-py3-none-any.whl", hash = "sha256:4be4c34aa0a13bb56427e45426297858e3d189bebac415b88694e6489f61d1e0"}, + {file = "flask_accept-0.0.6.tar.gz", hash = "sha256:be48f7d805f1a9dadeabce0fd166404eda92da8d2cf1945237aff278238f4c70"}, +] [package.dependencies] flask = "*" @@ -492,6 +881,10 @@ description = "A Flask extension adding a decorator for CORS support" category = "main" optional = false python-versions = "*" +files = [ + {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, + {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, +] [package.dependencies] Flask = ">=0.9" @@ -504,6 +897,10 @@ description = "Adds SQLAlchemy support to your Flask application." category = "main" optional = false python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" +files = [ + {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, + {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, +] [package.dependencies] Flask = ">=0.10" @@ -511,11 +908,50 @@ SQLAlchemy = ">=0.8.0" [[package]] name = "frozendict" -version = "2.3.6" +version = "2.3.8" description = "A simple immutable dictionary" category = "main" optional = false python-versions = ">=3.6" +files = [ + {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]] name = "gitdb" @@ -524,17 +960,25 @@ description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.31" +version = "3.1.34" description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.34-py3-none-any.whl", hash = "sha256:5d3802b98a3bae1c2b8ae0e1ff2e4aa16bcdf02c145da34d092324f599f01395"}, + {file = "GitPython-3.1.34.tar.gz", hash = "sha256:85f7d365d1f6bf677ae51039c1ef67ca59091c7ebd5a3509aa399d4eda02d6dd"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" @@ -546,9 +990,71 @@ description = "Lightweight in-process concurrent programming" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] [package.extras] -docs = ["sphinx", "docutils (<0.18)"] +docs = ["Sphinx", "docutils (<0.18)"] test = ["objgraph", "psutil"] [[package]] @@ -558,6 +1064,10 @@ description = "A featureful, immutable, and correct URL for Python." category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, + {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, +] [package.dependencies] idna = ">=2.5" @@ -569,6 +1079,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "imagesize" @@ -577,37 +1091,49 @@ description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" 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-metadata" -version = "6.1.0" +version = "6.8.0" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.0.1" description = "Read resources from Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "incremental" @@ -616,9 +1142,13 @@ description = "\"A small library that versions your Python projects.\"" category = "main" optional = false python-versions = "*" +files = [ + {file = "incremental-22.10.0-py2.py3-none-any.whl", hash = "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51"}, + {file = "incremental-22.10.0.tar.gz", hash = "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0"}, +] [package.extras] -mypy = ["click (>=6.0)", "twisted (>=16.4.0)", "mypy (==0.812)"] +mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"] scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] [[package]] @@ -628,14 +1158,22 @@ description = "brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "ipykernel" -version = "6.22.0" +version = "6.25.2" description = "IPython Kernel for Jupyter" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.25.2-py3-none-any.whl", hash = "sha256:2e2ee359baba19f10251b99415bb39de1e97d04e1fab385646f24f0596510b77"}, + {file = "ipykernel-6.25.2.tar.gz", hash = "sha256:f468ddd1f17acb48c8ce67fcfa49ba6d46d4f9ac0438c1f441be7c3d1372230b"}, +] [package.dependencies] appnope = {version = "*", markers = "platform_system == \"Darwin\""} @@ -653,19 +1191,23 @@ tornado = ">=6.1" traitlets = ">=5.4.0" [package.extras] -cov = ["coverage", "curio", "matplotlib", "pytest-cov", "trio"] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest-asyncio", "pytest-cov", "pytest-timeout", "pytest (>=7.0)"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.11.0" +version = "8.12.2" description = "IPython: Productive Interactive Computing" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, + {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, +] [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} @@ -680,11 +1222,12 @@ prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.21)", "pandas", "trio"] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] @@ -692,7 +1235,7 @@ notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "trio"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] [[package]] name = "ipython-genutils" @@ -701,40 +1244,57 @@ description = "Vestigial utilities from IPython" category = "dev" optional = false python-versions = "*" +files = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] [[package]] name = "ipywidgets" -version = "7.7.4" +version = "7.8.0" description = "IPython HTML widgets for Jupyter" category = "dev" optional = false python-versions = "*" +files = [ + {file = "ipywidgets-7.8.0-py2.py3-none-any.whl", hash = "sha256:47e5d57c2f73f6464ea422978106a119ab2721d88e2d4982282ebb54eb59a88e"}, + {file = "ipywidgets-7.8.0.tar.gz", hash = "sha256:6412eb61d1ccde049f731084266b3c946117b3e8c2769923fc20ea35633ef77c"}, +] [package.dependencies] +comm = ">=0.1.3" ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} ipython-genutils = ">=0.2.0,<0.3.0" jupyterlab-widgets = {version = ">=1.0.0,<3", markers = "python_version >= \"3.6\""} traitlets = ">=4.3.1" -widgetsnbextension = ">=3.6.0,<3.7.0" +widgetsnbextension = ">=3.6.5,<3.7.0" [package.extras] -test = ["pytest (>=3.6.0)", "pytest-cov", "ipykernel", "mock"] +test = ["ipykernel", "mock", "pytest (>=3.6.0)", "pytest-cov"] [[package]] name = "itemadapter" -version = "0.7.0" +version = "0.8.0" description = "Common interface for data container classes" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "itemadapter-0.8.0-py3-none-any.whl", hash = "sha256:2ac1fbcc363b789a18639935ca322e50a65a0a7dfdd8d973c34e2c468e6c0f94"}, + {file = "itemadapter-0.8.0.tar.gz", hash = "sha256:77758485fb0ac10730d4b131363e37d65cb8db2450bfec7a57c3f3271f4a48a9"}, +] [[package]] name = "itemloaders" -version = "1.0.6" +version = "1.1.0" description = "Base library for scrapy's ItemLoader" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "itemloaders-1.1.0-py3-none-any.whl", hash = "sha256:c8c82fe0c11fc4cdd08ec04df0b3c43f3cb7190002edb517e02d55de8efc2aeb"}, + {file = "itemloaders-1.1.0.tar.gz", hash = "sha256:21d81c61da6a08b48e5996288cdf3031c0f92e5d0075920a0242527523e14a48"}, +] [package.dependencies] itemadapter = ">=0.1.0" @@ -749,21 +1309,29 @@ description = "Safely pass data to untrusted environments and back." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, +] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx-rtd-theme (==0.4.3)", "sphinx (==1.8.5)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] @@ -773,6 +1341,10 @@ description = "A very fast and expressive template engine." category = "main" 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" @@ -787,6 +1359,10 @@ description = "JSON Matching Expressions" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] [[package]] name = "jsonschema" @@ -795,6 +1371,10 @@ description = "An implementation of JSON Schema validation for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] [package.dependencies] attrs = ">=17.4.0" @@ -813,6 +1393,10 @@ description = "Jupyter Book: Create an online book with Jupyter Notebooks" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jupyter-book-0.11.3.tar.gz", hash = "sha256:09acfc33cdd35e46f870f3508184261836bd8230c8a2072dc24a0d8fd82b5261"}, + {file = "jupyter_book-0.11.3-py3-none-any.whl", hash = "sha256:9b002f2a380b7784d603803eb4a97b2462b190a5761224caac55e7bda4c44451"}, +] [package.dependencies] click = "*" @@ -835,7 +1419,7 @@ sphinx-togglebutton = "*" sphinxcontrib-bibtex = ">=2.2.0,<2.3.0" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=2.12,<3.0)"] pdfhtml = ["pyppeteer"] sphinx = ["altair", "bokeh", "folium", "ipywidgets", "matplotlib", "nbclient", "numpy", "pandas", "plotly", "sphinx-click", "sphinx-inline-tabs", "sphinxext-rediraffe (>=0.2.3,<0.3.0)", "sympy"] testing = ["altair", "beautifulsoup4", "cookiecutter", "coverage", "matplotlib", "pyppeteer", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "pytest-timeout", "pytest-xdist", "sphinx-click", "sphinx-tabs", "texsoup"] @@ -847,6 +1431,10 @@ description = "A defined interface for working with a cache of jupyter notebooks category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jupyter-cache-0.4.3.tar.gz", hash = "sha256:4c9b5431b1d320bc68440c21fa0a155bbeb29c5b979bef72222e244a7bcd54fc"}, + {file = "jupyter_cache-0.4.3-py3-none-any.whl", hash = "sha256:6d5d662d81f565d18009e8dcfd3a56fb876af47eafead2a19ef0045aba8ffe3b"}, +] [package.dependencies] attrs = "*" @@ -856,18 +1444,22 @@ nbformat = "*" sqlalchemy = ">=1.3.12,<1.5" [package.extras] -cli = ["click", "click-completion", "click-log", "tabulate", "pyyaml"] -code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] -rtd = ["myst-nb (>=0.7,<1.0)", "sphinx-copybutton", "pydata-sphinx-theme"] -testing = ["ipykernel", "coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "matplotlib", "numpy", "sympy", "pandas", "nbformat (>=5.1)"] +cli = ["click", "click-completion", "click-log", "pyyaml", "tabulate"] +code-style = ["black", "flake8 (>=3.7.0,<3.8.0)", "pre-commit (==1.17.0)"] +rtd = ["myst-nb (>=0.7,<1.0)", "pydata-sphinx-theme", "sphinx-copybutton"] +testing = ["coverage", "ipykernel", "matplotlib", "nbformat (>=5.1)", "numpy", "pandas", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "sympy"] [[package]] name = "jupyter-client" -version = "8.1.0" +version = "8.3.1" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.3.1-py3-none-any.whl", hash = "sha256:5eb9f55eb0650e81de6b7e34308d8b92d04fe4ec41cd8193a913979e33d8e1a5"}, + {file = "jupyter_client-8.3.1.tar.gz", hash = "sha256:60294b2d5b869356c893f57b1a877ea6510d60d45cf4b38057f1672d85699ac9"}, +] [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} @@ -878,16 +1470,20 @@ tornado = ">=6.2" traitlets = ">=5.3" [package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinx (>=4)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["codecov", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "5.3.0" +version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, + {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, +] [package.dependencies] platformdirs = ">=2.5" @@ -905,6 +1501,10 @@ description = "The backend—i.e. core services, APIs, and REST endpoints—to J category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jupyter_server-1.15.6-py3-none-any.whl", hash = "sha256:e393934c19fcc324a7fca77f811eacd91201440f04c6fbb15c959c463baaa9c5"}, + {file = "jupyter_server-1.15.6.tar.gz", hash = "sha256:56bd6f580d1f46b62294990e8e78651025729f5d3fc798f10f2c03f0cdcbf28d"}, +] [package.dependencies] anyio = ">=3.1.0" @@ -925,7 +1525,7 @@ traitlets = ">=5" websocket-client = "*" [package.extras] -test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "pytest-timeout", "requests", "pytest-tornasync", "pytest-console-scripts", "ipykernel"] +test = ["coverage", "ipykernel", "pytest (>=6.0)", "pytest-console-scripts", "pytest-cov", "pytest-mock", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "jupyter-server-mathjax" @@ -934,12 +1534,16 @@ description = "MathJax resources as a Jupyter Server Extension." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jupyter_server_mathjax-0.2.6-py3-none-any.whl", hash = "sha256:416389dde2010df46d5fbbb7adb087a5607111070af65a1445391040f2babb5e"}, + {file = "jupyter_server_mathjax-0.2.6.tar.gz", hash = "sha256:bb1e6b6dc0686c1fe386a22b5886163db548893a99c2810c36399e9c4ca23943"}, +] [package.dependencies] jupyter-server = ">=1.1" [package.extras] -test = ["jupyter-server", "pytest"] +test = ["jupyter-server[test]", "pytest"] [[package]] name = "jupyter-sphinx" @@ -948,6 +1552,10 @@ description = "Jupyter Sphinx Extensions" category = "dev" optional = false python-versions = ">= 3.6" +files = [ + {file = "jupyter_sphinx-0.3.2-py3-none-any.whl", hash = "sha256:301e36d0fb3007bb5802f6b65b60c24990eb99c983332a2ab6eecff385207dc9"}, + {file = "jupyter_sphinx-0.3.2.tar.gz", hash = "sha256:37fc9408385c45326ac79ca0452fbd7ae2bf0e97842d626d2844d4830e30aaf2"}, +] [package.dependencies] IPython = "*" @@ -958,11 +1566,15 @@ Sphinx = ">=2" [[package]] name = "jupyterlab-widgets" -version = "1.1.3" +version = "1.1.5" description = "A JupyterLab extension." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jupyterlab_widgets-1.1.5-py3-none-any.whl", hash = "sha256:7bc9a5642f6741945e873183695c28b02665a7f075aa36f7cca8b52ab984e581"}, + {file = "jupyterlab_widgets-1.1.5.tar.gz", hash = "sha256:18565a93d88ade31cc69307ebd47edf6be774bc4772c1bf1a688d807f464e2a1"}, +] [[package]] name = "jupytext" @@ -971,6 +1583,10 @@ description = "Jupyter notebooks as Markdown documents, Julia, Python or R scrip category = "dev" optional = false python-versions = "~=3.6" +files = [ + {file = "jupytext-1.10.3-py3-none-any.whl", hash = "sha256:8b123b1c0151a1813948f55da06fa22e181c54c2b3a137bb6de3c69c10f0a7ed"}, + {file = "jupytext-1.10.3.tar.gz", hash = "sha256:bd54cf44c587d580c848fd4f677c1887797747385dde81c1ea9ae06687cac025"}, +] [package.dependencies] markdown-it-py = ">=0.6.0,<0.7.0" @@ -989,6 +1605,10 @@ description = "A lexer and codec to work with LaTeX code in Python." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, + {file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a"}, +] [package.dependencies] six = ">=1.4.1" @@ -1000,29 +1620,127 @@ description = "Links recognition library with FULL unicode support." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "linkify-it-py-1.0.3.tar.gz", hash = "sha256:2b3f168d5ce75e3a425e34b341a6b73e116b5d9ed8dbbbf5dc7456843b7ce2ee"}, + {file = "linkify_it_py-1.0.3-py3-none-any.whl", hash = "sha256:11e29f00150cddaa8f434153f103c14716e7e097a8fd372d9eb1ed06ed91524d"}, +] [package.dependencies] uc-micro-py = "*" [package.extras] benchmark = ["pytest", "pytest-benchmark"] -dev = ["pre-commit", "isort", "flake8", "black"] -doc = ["sphinx", "sphinx-book-theme", "myst-parser"] +dev = ["black", "flake8", "isort", "pre-commit"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] test = ["coverage", "pytest", "pytest-cov"] [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.3" 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 = [ + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, +] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] -source = ["Cython (>=0.29.7)"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.35)"] [[package]] name = "mako" @@ -1031,12 +1749,16 @@ description = "A super-fast templating language that borrows the best ideas from category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] [package.dependencies] MarkupSafe = ">=0.9.2" [package.extras] -babel = ["babel"] +babel = ["Babel"] lingua = ["lingua"] testing = ["pytest"] @@ -1047,25 +1769,81 @@ description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false python-versions = "~=3.6" +files = [ + {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, + {file = "markdown_it_py-0.6.2-py3-none-any.whl", hash = "sha256:30b3e9f8198dc82a5df0dcb73fd31d56cd9a43bf8a747feb10b2ba74f962bcb1"}, +] [package.dependencies] attrs = ">=19,<21" mdit-py-plugins = ">=0.2.1,<0.3.0" [package.extras] -code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistune (>=0.8.4,<0.9.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "panflute (>=1.12,<2.0)"] +code-style = ["pre-commit (==2.6)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["myst-nb (>=0.11.1,<0.12.0)", "sphinx-book-theme", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-copybutton", "sphinx (>=2,<4)", "pyyaml"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "pytest-benchmark (>=3.2,<4.0)", "psutil"] +rtd = ["myst-nb (>=0.11.1,<0.12.0)", "pyyaml", "sphinx (>=2,<4)", "sphinx-book-theme", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)"] +testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.2" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "main" 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 = "matplotlib-inline" @@ -1074,6 +1852,10 @@ description = "Inline Matplotlib backend for Jupyter" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] [package.dependencies] traitlets = "*" @@ -1085,12 +1867,16 @@ description = "Collection of plugins for markdown-it-py" category = "dev" optional = false python-versions = "~=3.6" +files = [ + {file = "mdit-py-plugins-0.2.6.tar.gz", hash = "sha256:1e467ca2ea056e8065cbd5d6c61e5052bb50826bde84c40f6a5ed77e82125710"}, + {file = "mdit_py_plugins-0.2.6-py3-none-any.whl", hash = "sha256:77fd75dad81109ee91f30eb49146196f79afbbae041f298ae4886c8c2b5e23d7"}, +] [package.dependencies] markdown-it-py = ">=0.5.8,<2.0.0" [package.extras] -code_style = ["pre-commit (==2.6)"] +code-style = ["pre-commit (==2.6)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] @@ -1100,6 +1886,10 @@ description = "The fastest markdown parser in pure Python" category = "dev" optional = false python-versions = "*" +files = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] [[package]] name = "mypy-extensions" @@ -1108,6 +1898,10 @@ description = "Type system extensions for programs checked with the mypy type ch category = "dev" optional = false python-versions = ">=3.5" +files = [ + {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 = "myst-nb" @@ -1116,6 +1910,10 @@ description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdow category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "myst-nb-0.12.3.tar.gz", hash = "sha256:4666039f538abf32d6489f4caf912d505e8798a2709bcf7a7936823ca6b15810"}, + {file = "myst_nb-0.12.3-py3-none-any.whl", hash = "sha256:3bc5191494720748419b8247e9ffc92d39b4ea7689f92d937e65110b346403fd"}, +] [package.dependencies] docutils = ">=0.15" @@ -1132,7 +1930,7 @@ sphinx = ">=2,<4" sphinx-togglebutton = ">=0.2.2,<0.3.0" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=2.12,<3.0)"] rtd = ["alabaster", "altair", "bokeh", "coconut (>=1.4.3,<1.5.0)", "ipywidgets", "jupytext (>=1.8.0,<1.9.0)", "matplotlib", "numpy", "pandas", "plotly", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-copybutton", "sphinx-panels (>=0.4.1,<0.5.0)", "sphinxcontrib-bibtex", "sympy"] testing = ["coverage (<5.0)", "jupytext (>=1.8.0,<1.9.0)", "matplotlib (>=3.3.0,<3.4.0)", "numpy", "pandas", "pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions", "sympy"] @@ -1143,6 +1941,10 @@ description = "An extended commonmark compliant parser, with bridges to docutils category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "myst-parser-0.13.7.tar.gz", hash = "sha256:e4bc99e43e19f70d22e528de8e7cce59f7e8e7c4c34dcba203de92de7a7c7c85"}, + {file = "myst_parser-0.13.7-py3-none-any.whl", hash = "sha256:260355b4da8e8865fe080b0638d7f1ab1791dc4bed02a7a48630b6bad4249219"}, +] [package.dependencies] docutils = ">=0.15,<0.18" @@ -1153,18 +1955,22 @@ pyyaml = "*" sphinx = ">=2.1,<4" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=2.12,<3.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)"] testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] name = "nbclassic" -version = "0.5.3" +version = "1.0.0" description = "Jupyter Notebook as a Jupyter Server extension." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "nbclassic-1.0.0-py3-none-any.whl", hash = "sha256:f99e4769b4750076cd4235c044b61232110733322384a94a63791d2e7beacc66"}, + {file = "nbclassic-1.0.0.tar.gz", hash = "sha256:0ae11eb2319455d805596bf320336cda9554b41d99ab9a3c31bf8180bffa30e3"}, +] [package.dependencies] argon2-cffi = "*" @@ -1177,7 +1983,7 @@ jupyter-server = ">=1.8" nbconvert = ">=5" nbformat = "*" nest-asyncio = ">=1.5" -notebook-shim = ">=0.1.0" +notebook-shim = ">=0.2.3" prometheus-client = "*" pyzmq = ">=17" Send2Trash = ">=1.8.0" @@ -1186,9 +1992,9 @@ tornado = ">=6.1" traitlets = ">=4.2.1" [package.extras] -docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] +docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] json-logging = ["json-logging"] -test = ["pytest", "coverage", "requests", "testpath", "nbval", "pytest-playwright", "pytest-cov", "pytest-jupyter", "pytest-tornasync", "requests-unixsocket"] +test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-playwright", "pytest-tornasync", "requests", "requests-unixsocket", "testpath"] [[package]] name = "nbclient" @@ -1197,6 +2003,10 @@ description = "A client library for executing notebooks. Formerly nbconvert's Ex category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "nbclient-0.5.13-py3-none-any.whl", hash = "sha256:47ac905af59379913c1f8f541098d2550153cf8dc58553cbe18c702b181518b0"}, + {file = "nbclient-0.5.13.tar.gz", hash = "sha256:40c52c9b5e3c31faecaee69f202b3f53e38d7c1c563de0fadde9d7eda0fdafe8"}, +] [package.dependencies] jupyter-client = ">=6.1.5" @@ -1205,8 +2015,8 @@ nest-asyncio = "*" traitlets = ">=5.0.0" [package.extras] -sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] -test = ["ipython (<8.0.0)", "ipykernel", "ipywidgets (<8.0.0)", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "xmltodict", "black", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)"] +sphinx = ["Sphinx (>=1.7)", "mock", "moto", "myst-parser", "sphinx-book-theme"] +test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "ipywidgets (<8.0.0)", "mypy", "pip (>=18.1)", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "wheel (>=0.31.0)", "xmltodict"] [[package]] name = "nbconvert" @@ -1215,6 +2025,10 @@ description = "Converting Jupyter Notebooks" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "nbconvert-5.6.1-py2.py3-none-any.whl", hash = "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee"}, + {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, +] [package.dependencies] bleach = "*" @@ -1230,19 +2044,23 @@ testpath = "*" traitlets = ">=4.2" [package.extras] -all = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "mock"] -docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "jupyter-client (>=5.3.1)"] +all = ["ipykernel", "ipython", "ipywidgets (>=7)", "jupyter-client (>=5.3.1)", "mock", "nbsphinx (>=0.2.12)", "pebble", "pytest", "pytest-cov", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "sphinxcontrib-github-alt", "tornado (>=4.0)"] +docs = ["ipython", "jupyter-client (>=5.3.1)", "nbsphinx (>=0.2.12)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] execute = ["jupyter-client (>=5.3.1)"] serve = ["tornado (>=4.0)"] -test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "mock"] +test = ["ipykernel", "ipywidgets (>=7)", "jupyter-client (>=5.3.1)", "mock", "pebble", "pytest", "pytest-cov"] [[package]] name = "nbdime" -version = "3.1.1" +version = "3.2.1" description = "Diff and merge of Jupyter Notebooks" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "nbdime-3.2.1-py2.py3-none-any.whl", hash = "sha256:a99fed2399fd939e2e577db4bb6e957aac860af4cf583044b723cc9a448c644e"}, + {file = "nbdime-3.2.1.tar.gz", hash = "sha256:31409a30f848ffc6b32540697e82d5a0a1b84dcc32716ca74e78bcc4b457c453"}, +] [package.dependencies] colorama = "*" @@ -1256,16 +2074,20 @@ requests = "*" tornado = "*" [package.extras] -docs = ["sphinx", "recommonmark", "sphinx-rtd-theme"] -test = ["pytest (>=3.6)", "pytest-cov", "pytest-timeout", "pytest-tornado", "jupyter-server", "jsonschema", "mock", "notebook", "requests", "tabulate"] +docs = ["recommonmark", "sphinx", "sphinx-rtd-theme"] +test = ["jsonschema", "jupyter-server[test]", "notebook", "pytest (>=3.6)", "pytest-cov", "pytest-timeout", "pytest-tornado", "requests", "tabulate"] [[package]] name = "nbformat" -version = "5.8.0" +version = "5.9.2" description = "The Jupyter Notebook format" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, +] [package.dependencies] fastjsonschema = "*" @@ -1279,19 +2101,27 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.7" description = "Patch asyncio to allow nested event loops" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, + {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, +] [[package]] name = "notebook" -version = "6.5.3" +version = "6.5.4" description = "A web-based notebook environment for interactive computing" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "notebook-6.5.4-py3-none-any.whl", hash = "sha256:dd17e78aefe64c768737b32bf171c1c766666a21cc79a44d37a1700771cab56f"}, + {file = "notebook-6.5.4.tar.gz", hash = "sha256:517209568bd47261e2def27a140e97d49070602eea0d226a696f42a7f16c9a4e"}, +] [package.dependencies] argon2-cffi = "*" @@ -1312,31 +2142,36 @@ tornado = ">=6.1" traitlets = ">=4.2.1" [package.extras] -docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] +docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] json-logging = ["json-logging"] -test = ["pytest", "coverage", "requests", "testpath", "nbval", "selenium (==4.1.5)", "pytest-cov", "requests-unixsocket"] +test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixsocket", "selenium (==4.1.5)", "testpath"] [[package]] name = "notebook-shim" -version = "0.2.2" +version = "0.2.3" description = "A shim layer for notebook traits and config" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, + {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, +] [package.dependencies] jupyter-server = ">=1.8,<3" [package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-tornasync"] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] [[package]] -name = "org.webpki.json" +name = "org-webpki-json" version = "0.1.0" description = "rfc8785 JSON canonicalization" category = "main" optional = false python-versions = "^3.6" +files = [] develop = false [package.source] @@ -1347,11 +2182,15 @@ resolved_reference = "3d7ef90bf7c740841473877537302feddd229a3e" [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "pandocfilters" @@ -1360,17 +2199,26 @@ description = "Utilities for writing pandoc filters in python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] [[package]] name = "parsel" -version = "1.7.0" +version = "1.8.1" description = "Parsel is a library to extract data from HTML and XML using XPath and CSS selectors" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "parsel-1.8.1-py2.py3-none-any.whl", hash = "sha256:2708fc74daeeb4ce471e2c2e9089b650ec940c7a218053e57421e69b5b00f82c"}, + {file = "parsel-1.8.1.tar.gz", hash = "sha256:aff28e68c9b3f1a901db2a4e3f158d8480a38724d7328ee751c1a4e1c1801e39"}, +] [package.dependencies] cssselect = ">=0.9" +jmespath = "*" lxml = "*" packaging = "*" w3lib = ">=1.19.0" @@ -1382,6 +2230,10 @@ description = "A Python Parser" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] [package.extras] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] @@ -1389,11 +2241,15 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] [[package]] name = "pexpect" @@ -1402,6 +2258,10 @@ description = "Pexpect allows easy control of interactive console applications." category = "dev" optional = false python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" @@ -1413,6 +2273,10 @@ description = "Tiny 'shelve'-like database with concurrency support" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] [[package]] name = "pkgutil-resolve-name" @@ -1421,26 +2285,38 @@ description = "Resolve a name to an object." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] [[package]] name = "platformdirs" -version = "3.1.1" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2.1)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -1448,47 +2324,72 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prometheus-client" -version = "0.16.0" +version = "0.17.1" description = "Python client for the Prometheus monitoring system." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, + {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, +] [package.extras] twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.38" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, +] [package.dependencies] wcwidth = "*" [[package]] name = "protego" -version = "0.2.1" +version = "0.3.0" description = "Pure-Python robots.txt parser with support for modern conventions" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -six = "*" +python-versions = ">=3.7" +files = [ + {file = "Protego-0.3.0-py2.py3-none-any.whl", hash = "sha256:db38f6a945839d8162a4034031a21490469566a2726afb51d668497c457fb0aa"}, + {file = "Protego-0.3.0.tar.gz", hash = "sha256:04228bffde4c6bcba31cf6529ba2cfd6e1b70808fdc1d2cb4301be6b28d6c568"}, +] [[package]] name = "psutil" -version = "5.9.4" +version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +] [package.extras] -test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "ptyprocess" @@ -1497,6 +2398,10 @@ description = "Run a subprocess in a pseudo terminal" category = "dev" optional = false python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] [[package]] name = "pure-eval" @@ -1505,6 +2410,10 @@ description = "Safely evaluate AST nodes without side effects" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] [package.extras] tests = ["pytest"] @@ -1516,25 +2425,37 @@ description = "library with cross-python path, ini-parsing, io, code, log facili category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" category = "main" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" category = "main" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] [package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" +pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pybtex" @@ -1543,6 +2464,10 @@ description = "A BibTeX-compatible bibliography processor in Python" category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f"}, + {file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755"}, +] [package.dependencies] latexcodec = ">=1.0.4" @@ -1554,14 +2479,18 @@ test = ["pytest"] [[package]] name = "pybtex-docutils" -version = "1.0.2" +version = "1.0.3" description = "A docutils backend for pybtex." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b"}, + {file = "pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9"}, +] [package.dependencies] -docutils = ">=0.8" +docutils = ">=0.14" pybtex = ">=0.16" [[package]] @@ -1571,6 +2500,10 @@ description = "C parser in Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pydata-sphinx-theme" @@ -1579,6 +2512,10 @@ description = "Bootstrap-based Sphinx theme from the PyData community" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "pydata-sphinx-theme-0.7.2.tar.gz", hash = "sha256:671df35fcdd290eafbd23d0595e6d359dbe90b2e64e6c3f4dc88276eed4a065e"}, + {file = "pydata_sphinx_theme-0.7.2-py3-none-any.whl", hash = "sha256:bc1abc45e103b254c6c7a8f2ddabbaf8aa1f0817d85cae65dd163dd554c52700"}, +] [package.dependencies] beautifulsoup4 = "*" @@ -1586,8 +2523,8 @@ docutils = "!=0.17.0" sphinx = "*" [package.extras] -coverage = ["pytest-cov", "codecov", "sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "sphinx-sitemap", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] -test = ["sphinx", "numpydoc", "recommonmark", "pandas", "pytest", "pytest-regressions", "beautifulsoup4", "sphinx-sitemap", "jupyter-sphinx", "plotly", "numpy", "xarray", "docutils (==0.16)"] +coverage = ["beautifulsoup4", "codecov", "docutils (==0.16)", "jupyter-sphinx", "numpy", "numpydoc", "pandas", "plotly", "pytest", "pytest-cov", "pytest-regressions", "recommonmark", "sphinx", "sphinx-sitemap", "xarray"] +test = ["beautifulsoup4", "docutils (==0.16)", "jupyter-sphinx", "numpy", "numpydoc", "pandas", "plotly", "pytest", "pytest-regressions", "recommonmark", "sphinx", "sphinx-sitemap", "xarray"] [[package]] name = "pydispatcher" @@ -1596,6 +2533,10 @@ description = "Multi-producer multi-consumer in-memory signal dispatch system" category = "main" optional = false python-versions = "*" +files = [ + {file = "PyDispatcher-2.0.7-py3-none-any.whl", hash = "sha256:96543bea04115ffde08f851e1d45cacbfd1ee866ac42127d9b476dc5aefa7de0"}, + {file = "PyDispatcher-2.0.7.tar.gz", hash = "sha256:b777c6ad080dc1bad74a4c29d6a46914fa6701ac70f94b0d66fbcfde62f5be31"}, +] [package.extras] dev = ["tox"] @@ -1607,25 +2548,34 @@ description = "A port of node.js's EventEmitter to python." category = "main" optional = false python-versions = "*" +files = [ + {file = "pyee-8.2.2-py2.py3-none-any.whl", hash = "sha256:c09f56e36eb10bf23aa2aacf145f690ded75b990a3d9523fd478b005940303d2"}, + {file = "pyee-8.2.2.tar.gz", hash = "sha256:5c7e60f8df95710dbe17550e16ce0153f83990c00ef744841b43f371ed53ebea"}, +] [[package]] name = "pygments" -version = "2.14.0" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] [package.extras] plugins = ["importlib-metadata"] [[package]] name = "PyLD" -version = "2.0.4.dev0" +version = "2.1.0" description = "Python implementation of the JSON-LD API" category = "main" optional = false python-versions = "*" +files = [] develop = false [package.dependencies] @@ -1642,19 +2592,23 @@ requests = ["requests"] [package.source] type = "git" url = "https://github.com/datadavev/pyld.git" -reference = "2.0.4-dev_ddv-0.1" -resolved_reference = "db1bb4a80171aa621c7f2b1bdadb74e41351360e" +reference = "ddv-2.1.0" +resolved_reference = "f5711b40d40d2fe43e0e68cb17005cf198757771" [[package]] name = "pyopenssl" -version = "23.1.0" +version = "23.2.0" description = "Python wrapper module around the OpenSSL library" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, + {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, +] [package.dependencies] -cryptography = ">=38.0.0,<41" +cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] @@ -1667,6 +2621,10 @@ description = "Headless chrome/chromium automation library (unofficial port of p category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "pyppeteer-1.0.2-py3-none-any.whl", hash = "sha256:11a734d8f02c6b128035aba8faf32748f2016310a6a1cbc6aa5b1e2580742e8f"}, + {file = "pyppeteer-1.0.2.tar.gz", hash = "sha256:ddb0d15cb644720160d49abb1ad0d97e87a55581febf1b7531be9e983aad7742"}, +] [package.dependencies] appdirs = ">=1.4.3,<2.0.0" @@ -1684,6 +2642,9 @@ description = "Multi-producer-multi-consumer signal dispatching mechanism" category = "main" optional = false python-versions = "*" +files = [ + {file = "PyPyDispatcher-2.1.2.tar.gz", hash = "sha256:b6bec5dfcff9d2535bca2b23c80eae367b1ac250a645106948d315fcfa9130f2"}, +] [[package]] name = "pyrsistent" @@ -1692,6 +2653,35 @@ description = "Persistent/Functional/Immutable data structures" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] [[package]] name = "pytest" @@ -1700,6 +2690,10 @@ description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -1721,6 +2715,10 @@ description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -1732,58 +2730,214 @@ description = "File type identification using libmagic" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, + {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, +] [[package]] name = "pytz" -version = "2022.7.1" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" - -[[package]] -name = "pytz-deprecation-shim" -version = "0.1.0.post0" -description = "Shims to make deprecation of pytz easier" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} -tzdata = {version = "*", markers = "python_version >= \"3.6\""} +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] [[package]] name = "pywin32" -version = "305" +version = "306" description = "Python for Window Extensions" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] [[package]] name = "pywinpty" -version = "2.0.10" +version = "2.0.11" description = "Pseudo terminal support for Windows from Python." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.11-cp310-none-win_amd64.whl", hash = "sha256:452f10ac9ff8ab9151aa8cea9e491a9612a12250b1899278c6a56bc184afb47f"}, + {file = "pywinpty-2.0.11-cp311-none-win_amd64.whl", hash = "sha256:6701867d42aec1239bc0fedf49a336570eb60eb886e81763db77ea2b6c533cc3"}, + {file = "pywinpty-2.0.11-cp38-none-win_amd64.whl", hash = "sha256:0ffd287751ad871141dc9724de70ea21f7fc2ff1af50861e0d232cf70739d8c4"}, + {file = "pywinpty-2.0.11-cp39-none-win_amd64.whl", hash = "sha256:e4e7f023c28ca7aa8e1313e53ba80a4d10171fe27857b7e02f99882dfe3e8638"}, + {file = "pywinpty-2.0.11.tar.gz", hash = "sha256:e244cffe29a894876e2cd251306efd0d8d64abd5ada0a46150a4a71c0b9ad5c5"}, +] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] [[package]] name = "pyzmq" -version = "25.0.2" +version = "25.1.1" description = "Python bindings for 0MQ" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, +] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} @@ -1795,32 +2949,130 @@ description = "Collection of persistent (disk-based) and non-persistent (memory- category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "queuelib-1.6.2-py2.py3-none-any.whl", hash = "sha256:4b96d48f650a814c6fb2fd11b968f9c46178b683aad96d68f930fe13a8574d19"}, + {file = "queuelib-1.6.2.tar.gz", hash = "sha256:4b207267f2642a8699a1f806045c56eb7ad1a85a10c0e249884580d139c2fcd2"}, +] [[package]] name = "regex" -version = "2023.3.23" +version = "2023.8.8" description = "Alternative regular expression module, to replace re." category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" +files = [ + {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, + {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, + {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, + {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, + {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, + {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, + {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, + {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, + {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, + {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, + {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, + {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, + {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, + {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, + {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, + {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, +] [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {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)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-file" @@ -1829,6 +3081,10 @@ description = "File transport adapter for Requests" category = "main" optional = false python-versions = "*" +files = [ + {file = "requests-file-1.5.1.tar.gz", hash = "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e"}, + {file = "requests_file-1.5.1-py2.py3-none-any.whl", hash = "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953"}, +] [package.dependencies] requests = ">=1.0.0" @@ -1836,18 +3092,22 @@ six = "*" [[package]] name = "scrapy" -version = "2.8.0" +version = "2.10.1" description = "A high-level Web Crawling and Web Scraping framework" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "Scrapy-2.10.1-py2.py3-none-any.whl", hash = "sha256:0b2f99d297f32112ae7979f50b9942a5f55b09b821f1c3afb0bed950f6a1f5a7"}, + {file = "Scrapy-2.10.1.tar.gz", hash = "sha256:91d67875fbb537607b07e31363445718a3532b544e6e2b4baf8a042b21a1d10f"}, +] [package.dependencies] -cryptography = ">=3.4.6" +cryptography = ">=36.0.0" cssselect = ">=0.9.1" itemadapter = ">=0.1.0" itemloaders = ">=1.0.1" -lxml = ">=4.3.0" +lxml = ">=4.4.1" packaging = "*" parsel = ">=1.5.0" protego = ">=0.1.15" @@ -1856,22 +3116,28 @@ pyOpenSSL = ">=21.0.0" PyPyDispatcher = {version = ">=2.1.0", markers = "platform_python_implementation == \"PyPy\""} queuelib = ">=1.4.2" service-identity = ">=18.1.0" +setuptools = "*" tldextract = "*" -Twisted = ">=18.9.0" +Twisted = ">=18.9.0,<23.8.0" w3lib = ">=1.17.0" "zope.interface" = ">=5.1.0" [[package]] name = "scrapyd" -version = "1.4.1" +version = "1.4.2" description = "A service for running Scrapy spiders, with an HTTP API" category = "main" optional = false python-versions = "*" +files = [ + {file = "scrapyd-1.4.2-py2.py3-none-any.whl", hash = "sha256:2f030bfa1cb04309406c6a96f7ec236706ea04a988fda88e39c07d1890eb7ca9"}, + {file = "scrapyd-1.4.2.tar.gz", hash = "sha256:fd10df9ba9a2a147cc8015bf15a47a2949e02ea8dee9dcb12e3bc98c2ff50615"}, +] [package.dependencies] packaging = "*" scrapy = ">=2.0.0" +setuptools = "*" twisted = ">=17.9" w3lib = "*" "zope.interface" = "*" @@ -1882,38 +3148,63 @@ test = ["pytest", "pytest-cov", "requests"] [[package]] name = "send2trash" -version = "1.8.0" -description = "Send file to trash natively under Mac OS X, Windows and Linux." +version = "1.8.2" +description = "Send file to trash natively under Mac OS X, Windows and Linux" category = "dev" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, + {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, +] [package.extras] -nativelib = ["pyobjc-framework-cocoa", "pywin32"] -objc = ["pyobjc-framework-cocoa"] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] win32 = ["pywin32"] [[package]] name = "service-identity" -version = "21.1.0" +version = "23.1.0" description = "Service identity verification for pyOpenSSL & cryptography." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "service_identity-23.1.0-py3-none-any.whl", hash = "sha256:87415a691d52fcad954a500cb81f424d0273f8e7e3ee7d766128f4575080f383"}, + {file = "service_identity-23.1.0.tar.gz", hash = "sha256:ecb33cd96307755041e978ab14f8b14e13b40f1fbd525a4dc78f46d2b986431d"}, +] [package.dependencies] attrs = ">=19.1.0" cryptography = "*" pyasn1 = "*" pyasn1-modules = "*" -six = "*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "pytest", "sphinx", "furo", "idna", "pyopenssl"] -docs = ["sphinx", "furo"] +dev = ["pyopenssl", "service-identity[docs,idna,mypy,tests]"] +docs = ["furo", "myst-parser", "pyopenssl", "sphinx", "sphinx-notfound-page"] idna = ["idna"] +mypy = ["idna", "mypy", "types-pyopenssl"] tests = ["coverage[toml] (>=5.0.2)", "pytest"] +[[package]] +name = "setuptools" +version = "68.1.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, + {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "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-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "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]] name = "shortuuid" version = "1.0.11" @@ -1921,6 +3212,10 @@ description = "A generator library for concise, unambiguous and URL-safe UUIDs." category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "shortuuid-1.0.11-py3-none-any.whl", hash = "sha256:27ea8f28b1bd0bf8f15057a3ece57275d2059d2b0bb02854f02189962c13b6aa"}, + {file = "shortuuid-1.0.11.tar.gz", hash = "sha256:fc75f2615914815a8e4cb1501b3a513745cb66ef0fd5fc6fb9f8c3fa3481f789"}, +] [[package]] name = "six" @@ -1929,6 +3224,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" @@ -1937,6 +3236,10 @@ description = "A pure Python implementation of a sliding window memory map manag category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] [[package]] name = "sniffio" @@ -1945,6 +3248,10 @@ description = "Sniff out which async library your code is running under" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] [[package]] name = "snowballstemmer" @@ -1953,6 +3260,10 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "dev" 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 = "sonormal" @@ -1961,6 +3272,7 @@ description = "Schema.org normalization service" category = "main" optional = false python-versions = "^3.8" +files = [] develop = true [package.dependencies] @@ -1968,7 +3280,7 @@ click = "^8.1.3" dateparser = "^1.1.1" diskcache = "^5.4.0" dynaconf = "^3.1.9" -pyld = {git = "https://github.com/datadavev/pyld.git", tag = "2.0.4-dev_ddv-0.1"} +pyld = {git = "https://github.com/datadavev/pyld.git", tag = "ddv-2.1.0"} pyppeteer = "^1.0.2" requests = "^2.28.1" shortuuid = "^1.0.9" @@ -1982,11 +3294,15 @@ url = "../sonormal" [[package]] name = "soupsieve" -version = "2.4" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] [[package]] name = "sphinx" @@ -1995,6 +3311,10 @@ description = "Python documentation generator" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"}, + {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" @@ -2006,6 +3326,7 @@ Jinja2 = ">=2.3" packaging = "*" Pygments = ">=2.0" requests = ">=2.5.0" +setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -2016,8 +3337,8 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.800)"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] name = "sphinx-book-theme" @@ -2026,6 +3347,10 @@ description = "A clean book theme for scientific explanations and documentation category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "sphinx-book-theme-0.1.10.tar.gz", hash = "sha256:c74d7deb36e6fea4bcb3a979d162d9fd80e93b7ea4da78ebf8286da4b898582a"}, + {file = "sphinx_book_theme-0.1.10-py3-none-any.whl", hash = "sha256:1722b60c8ac87aa53758f4403912972cb28d0c253196446339859124e92f686f"}, +] [package.dependencies] beautifulsoup4 = ">=4.6.1,<5" @@ -2035,9 +3360,9 @@ pyyaml = "*" sphinx = ">=3,<5" [package.extras] -code_style = ["pre-commit (>=2.7.0,<2.8.0)"] +code-style = ["pre-commit (>=2.7.0,<2.8.0)"] live-dev = ["sphinx-autobuild", "web-compile (>=0.2.1,<0.3.0)"] -sphinx = ["ablog (>=0.10.13,<0.11.0)", "ipywidgets", "folium", "numpy", "matplotlib", "myst-nb (>=0.13,<1.0)", "nbclient", "pandas", "plotly", "sphinx (>=4.0,<5.0)", "sphinx-design", "sphinx-copybutton", "sphinx-togglebutton (>=0.2.1)", "sphinx-thebe", "sphinxcontrib-bibtex (>=2.2,<3.0)", "sphinxext-opengraph"] +sphinx = ["ablog (>=0.10.13,<0.11.0)", "folium", "ipywidgets", "matplotlib", "myst-nb (>=0.13,<1.0)", "nbclient", "numpy", "pandas", "plotly", "sphinx (>=4.0,<5.0)", "sphinx-copybutton", "sphinx-design", "sphinx-thebe", "sphinx-togglebutton (>=0.2.1)", "sphinxcontrib-bibtex (>=2.2,<3.0)", "sphinxext-opengraph"] testing = ["coverage", "myst-nb (>=0.13,<1.0)", "pytest (>=6.0.1,<6.1.0)", "pytest-cov", "pytest-regressions (>=2.0.1,<2.1.0)", "sphinx-thebe"] [[package]] @@ -2047,29 +3372,37 @@ description = "Add comments and annotation to your documentation." category = "dev" optional = false python-versions = "*" +files = [ + {file = "sphinx-comments-0.0.3.tar.gz", hash = "sha256:00170afff27019fad08e421da1ae49c681831fb2759786f07c826e89ac94cf21"}, + {file = "sphinx_comments-0.0.3-py3-none-any.whl", hash = "sha256:1e879b4e9bfa641467f83e3441ac4629225fc57c29995177d043252530c21d00"}, +] [package.dependencies] sphinx = ">=1.8" [package.extras] -code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] -sphinx = ["sphinx (>=2)", "sphinx-book-theme", "myst-parser"] +code-style = ["black", "flake8 (>=3.7.0,<3.8.0)", "pre-commit (==1.17.0)"] +sphinx = ["myst-parser", "sphinx (>=2)", "sphinx-book-theme"] testing = ["beautifulsoup4", "myst-parser", "pytest", "pytest-regressions", "sphinx (>=2)", "sphinx-book-theme"] [[package]] name = "sphinx-copybutton" -version = "0.5.1" +version = "0.5.2" description = "Add a copy button to each of your code cells." category = "dev" 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 = ["sphinx", "ipython", "myst-nb", "sphinx-book-theme", "sphinx-examples"] +code-style = ["pre-commit (==2.12.1)"] +rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] [[package]] name = "sphinx-external-toc" @@ -2078,6 +3411,10 @@ description = "A sphinx extension that allows the site-map to be defined in a si category = "dev" optional = false python-versions = "~=3.6" +files = [ + {file = "sphinx_external_toc-0.2.4-py3-none-any.whl", hash = "sha256:f7906620e74fbef50f0c3b8adf943da03000ab955ffe957ae4760d6cd5a09717"}, + {file = "sphinx_external_toc-0.2.4.tar.gz", hash = "sha256:f073c482d959a166f844ca8caadd13e24fa43153750cc120646ded37ff622018"}, +] [package.dependencies] attrs = ">=20.3,<22" @@ -2086,7 +3423,7 @@ pyyaml = "*" sphinx = ">=3,<5" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=2.12,<3.0)"] rtd = ["myst-parser (>=0.15.0,<0.16.0)", "sphinx-book-theme (>=0.0.36)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] @@ -2097,13 +3434,17 @@ description = "Latex specific features for jupyter book" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "sphinx_jupyterbook_latex-0.4.7-py3-none-any.whl", hash = "sha256:616990de4e5680879bede70260dd4f3821586c4c0f36d1b1a1ebb736020a7f92"}, + {file = "sphinx_jupyterbook_latex-0.4.7.tar.gz", hash = "sha256:288640a8d5476e75bc4d88c7b2446d2af385adf8c57e45e6ec27cd3345806b07"}, +] [package.dependencies] importlib-resources = {version = "*", markers = "python_version < \"3.9\""} sphinx = ">=3,<5" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=2.12,<3.0)"] myst = ["myst-nb (>=0.13,<0.14)"] rtd = ["myst-parser", "sphinx-book-theme", "sphinx-design", "sphinx-jupyterbook-latex"] testing = ["coverage (<5.0)", "myst-nb (>=0.13,<0.14)", "pytest (>=3.6,<4)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions", "sphinx-external-toc (>=0.1.0,<0.3.0)", "sphinxcontrib-bibtex (>=2.2.1,<2.3.0)", "texsoup"] @@ -2115,14 +3456,18 @@ description = "Supporting continuous HTML section numbering" category = "dev" optional = false python-versions = "*" +files = [ + {file = "sphinx-multitoc-numbering-0.1.3.tar.gz", hash = "sha256:c9607671ac511236fa5d61a7491c1031e700e8d498c9d2418e6c61d1251209ae"}, + {file = "sphinx_multitoc_numbering-0.1.3-py3-none-any.whl", hash = "sha256:33d2e707a9b2b8ad636b3d4302e658a008025106fe0474046c651144c26d8514"}, +] [package.dependencies] sphinx = ">=3" [package.extras] -code_style = ["flake8 (>=3.7.0,<3.8.0)", "black", "pre-commit (==1.17.0)"] -rtd = ["sphinx (>=3.0)", "sphinx-book-theme", "myst-parser"] -testing = ["pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "coverage (<5.0)", "pytest-regressions", "jupyter-book"] +code-style = ["black", "flake8 (>=3.7.0,<3.8.0)", "pre-commit (==1.17.0)"] +rtd = ["myst-parser", "sphinx (>=3.0)", "sphinx-book-theme"] +testing = ["coverage (<5.0)", "jupyter-book", "pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions"] [[package]] name = "sphinx-panels" @@ -2131,16 +3476,20 @@ description = "A sphinx extension for creating panels in a grid layout." category = "dev" optional = false python-versions = "*" +files = [ + {file = "sphinx-panels-0.5.2.tar.gz", hash = "sha256:b7b3faa05f37b7318fd14cd85c4effa1ab905dfc8bed236a63978565ea461ae4"}, + {file = "sphinx_panels-0.5.2-py3-none-any.whl", hash = "sha256:2b2e18448b0494e7a232d6c7dfb9aa3982e7aeb92aeea7d1b146e34e9261d2f1"}, +] [package.dependencies] docutils = "*" sphinx = ">=2,<4" [package.extras] -code_style = ["pre-commit (>=2.7.0,<2.8.0)"] +code-style = ["pre-commit (>=2.7.0,<2.8.0)"] live-dev = ["sphinx-autobuild", "web-compile (>=0.2.0,<0.3.0)"] testing = ["pytest (>=6.0.1,<6.1.0)", "pytest-regressions (>=2.0.1,<2.1.0)"] -themes = ["sphinx-rtd-theme", "pydata-sphinx-theme (>=0.4.0,<0.5.0)", "sphinx-book-theme (>=0.0.36,<0.1.0)", "myst-parser (>=0.12.9,<0.13.0)"] +themes = ["myst-parser (>=0.12.9,<0.13.0)", "pydata-sphinx-theme (>=0.4.0,<0.5.0)", "sphinx-book-theme (>=0.0.36,<0.1.0)", "sphinx-rtd-theme"] [[package]] name = "sphinx-thebe" @@ -2149,13 +3498,17 @@ description = "Integrate interactive code blocks into your documentation with Th category = "dev" optional = false python-versions = "*" +files = [ + {file = "sphinx-thebe-0.0.10.tar.gz", hash = "sha256:b51ed38e0974c891319aed1554212598597ae12226c7916f2215becc382ae8d7"}, + {file = "sphinx_thebe-0.0.10-py3-none-any.whl", hash = "sha256:4e349204eab2f059d037be423b93bfe138fa8feceedd5eae7f358f1e82403968"}, +] [package.dependencies] sphinx = ">=3.5,<5" [package.extras] -sphinx = ["myst-parser", "sphinx-book-theme", "jupyter-sphinx", "sphinx-panels"] -testing = ["pytest", "pytest-regressions", "beautifulsoup4"] +sphinx = ["jupyter-sphinx", "myst-parser[sphinx]", "sphinx-book-theme", "sphinx-panels"] +testing = ["beautifulsoup4", "pytest", "pytest-regressions"] [[package]] name = "sphinx-togglebutton" @@ -2164,10 +3517,16 @@ description = "Toggle page content and collapse admonitions in Sphinx." category = "dev" optional = false python-versions = "*" +files = [ + {file = "sphinx-togglebutton-0.2.3.tar.gz", hash = "sha256:41cbe2f87459eade8dc5718bb56146e8e113a05fb97459b90472470f0d357b55"}, + {file = "sphinx_togglebutton-0.2.3-py3-none-any.whl", hash = "sha256:8a3707154b1b3480a7918f189f43b7eee0d34ffa552895af77bb273476b8d5e0"}, +] [package.dependencies] docutils = "*" +setuptools = "*" sphinx = "*" +wheel = "*" [package.extras] sphinx = ["myst-nb", "sphinx-book-theme"] @@ -2179,9 +3538,13 @@ description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple category = "dev" 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 = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -2191,6 +3554,10 @@ description = "Sphinx extension for BibTeX style citations." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-bibtex-2.2.1.tar.gz", hash = "sha256:00d474092e04b1d941e645cf6c027632a975cd0b9337cf47d379f63a5928f334"}, + {file = "sphinxcontrib_bibtex-2.2.1-py3-none-any.whl", hash = "sha256:38e8e9e1d450b50f33b2e42855da66e7c71e7ea533ca2a381b6d8d6314975a36"}, +] [package.dependencies] docutils = ">=0.8" @@ -2205,9 +3572,13 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp category = "dev" 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 = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -2217,6 +3588,10 @@ description = "Sphinx Extension to include draw.io files" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-drawio-0.0.13.tar.gz", hash = "sha256:d54f44a1d9646b4ec21f936433a4dd12057af9691ff4405c4c6b8205ee182798"}, + {file = "sphinxcontrib_drawio-0.0.13-py3-none-any.whl", hash = "sha256:48858bf7d85a73c9383f0781eca45f5044b08608f8a1d01dcf8e2daded868373"}, +] [[package]] name = "sphinxcontrib-htmlhelp" @@ -2225,10 +3600,14 @@ description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML h category = "dev" 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 = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" @@ -2237,9 +3616,13 @@ description = "A sphinx extension which renders display math in HTML via JavaScr category = "dev" 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 = ["pytest", "flake8", "mypy"] +test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-plantuml" @@ -2248,6 +3631,9 @@ description = "Sphinx \"plantuml\" extension" category = "dev" optional = false python-versions = "*" +files = [ + {file = "sphinxcontrib-plantuml-0.21.tar.gz", hash = "sha256:53e1808dc2b1f3ec20c177fa3fa6d438d75ef572a25a489e330bb01130508d87"}, +] [package.dependencies] Sphinx = ">=1.6" @@ -2259,9 +3645,13 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d category = "dev" 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 = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -2271,41 +3661,85 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs category = "dev" 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 = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.4.47" +version = "1.4.49" description = "Database Abstraction Library" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, + {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, +] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} [package.extras] -aiomysql = ["greenlet (!=0.4.17)", "aiomysql"] -aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"] -mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] mssql = ["pyodbc"] -mssql_pymssql = ["pymssql"] -mssql_pyodbc = ["pyodbc"] -mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"] -mysql_connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"] -postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] -postgresql_psycopg2binary = ["psycopg2-binary"] -postgresql_psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1)", "pymysql"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] sqlcipher = ["sqlcipher3-binary"] [[package]] @@ -2315,6 +3749,10 @@ description = "Extract data from python stack frames and tracebacks for informat category = "dev" optional = false python-versions = "*" +files = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] [package.dependencies] asttokens = ">=2.1.0" @@ -2322,7 +3760,7 @@ executing = ">=1.2.0" pure-eval = "*" [package.extras] -tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "terminado" @@ -2331,6 +3769,10 @@ description = "Tornado websocket backend for the Xterm.js Javascript terminal em category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, + {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, +] [package.dependencies] ptyprocess = {version = "*", markers = "os_name != \"nt\""} @@ -2339,7 +3781,7 @@ tornado = ">=6.1.0" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest-timeout", "pytest (>=7.0)"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] [[package]] name = "testpath" @@ -2348,17 +3790,25 @@ description = "Test utilities for code working with files and commands" category = "dev" optional = false python-versions = ">= 3.5" +files = [ + {file = "testpath-0.6.0-py3-none-any.whl", hash = "sha256:8ada9f80a2ac6fb0391aa7cdb1a7d11cfa8429f693eda83f74dde570fe6fa639"}, + {file = "testpath-0.6.0.tar.gz", hash = "sha256:2f1b97e6442c02681ebe01bd84f531028a7caea1af3825000f52345c30285e0f"}, +] [package.extras] test = ["pytest"] [[package]] name = "tldextract" -version = "3.4.0" +version = "3.4.4" description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tldextract-3.4.4-py3-none-any.whl", hash = "sha256:581e7dbefc90e7bb857bb6f768d25c811a3c5f0892ed56a9a2999ddb7b1b70c2"}, + {file = "tldextract-3.4.4.tar.gz", hash = "sha256:5fe3210c577463545191d45ad522d3d5e78d55218ce97215e82004dcae1e1234"}, +] [package.dependencies] filelock = ">=3.0.8" @@ -2373,28 +3823,49 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tornado" -version = "6.2" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "dev" optional = false -python-versions = ">= 3.7" +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -2406,6 +3877,10 @@ description = "Traitlets Python configuration system" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] @@ -2418,6 +3893,10 @@ description = "An asynchronous networking framework written in Python" category = "main" optional = false python-versions = ">=3.7.1" +files = [ + {file = "Twisted-22.10.0-py3-none-any.whl", hash = "sha256:86c55f712cc5ab6f6d64e02503352464f0400f66d4f079096d744080afcccbd0"}, + {file = "Twisted-22.10.0.tar.gz", hash = "sha256:32acbd40a94f5f46e7b42c109bfae2b302250945561783a8b7a059048f2d4d31"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -2430,109 +3909,199 @@ typing-extensions = ">=3.6.5" "zope.interface" = ">=4.4.2" [package.extras] -all_non_platform = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] -conch = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)"] -conch_nacl = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pynacl"] +all-non-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] +conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] +conch-nacl = ["PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] contextvars = ["contextvars (>=2.4,<3)"] -dev = ["towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "python-subunit (>=1.4,<2.0)"] -dev_release = ["towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)"] -gtk_platform = ["pygobject", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +dev = ["coverage (>=6b1,<7)", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "python-subunit (>=1.4,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)"] +dev-release = ["pydoctor (>=22.9.0,<22.10.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)"] +gtk-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pygobject", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] http2 = ["h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)"] -macos_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] -mypy = ["mypy (==0.930)", "mypy-zope (==0.3.4)", "types-setuptools", "types-pyopenssl", "towncrier (>=22.8,<23.0)", "pydoctor (>=22.9.0,<22.10.0)", "sphinx-rtd-theme (>=1.0,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pynacl", "pywin32 (!=226)", "python-subunit (>=1.4,<2.0)", "contextvars (>=2.4,<3)"] -osx_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +macos-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] +mypy = ["PyHamcrest (>=1.9.0)", "PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "coverage (>=6b1,<7)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "mypy (==0.930)", "mypy-zope (==0.3.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "service-identity (>=18.1.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)", "types-pyOpenSSL", "types-setuptools"] +osx-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] -test = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)"] -tls = ["pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)"] -windows_platform = ["pywin32 (!=226)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "hypothesis (>=6.0,<7.0)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +test = ["PyHamcrest (>=1.9.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.0,<7.0)"] +tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] +windows-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] [[package]] name = "twisted-iocpsupport" -version = "1.0.2" +version = "1.0.4" description = "An extension for use in the twisted I/O Completion Ports reactor." category = "main" optional = false python-versions = "*" +files = [ + {file = "twisted-iocpsupport-1.0.4.tar.gz", hash = "sha256:858096c0d15e33f15ac157f455d8f86f2f2cdd223963e58c0f682a3af8362d89"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win32.whl", hash = "sha256:afa2b630797f9ed2f27f3d9f55e3f72b4244911e45a8c82756f44babbf0b243e"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:0058c963c8957bcd3deda62122e89953c9de1e867a274facc9b15dde1a9f31e8"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win32.whl", hash = "sha256:196f7c7ccad4ba4d1783b1c4e1d1b22d93c04275cd780bf7498d16c77319ad6e"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:4e5f97bcbabdd79cbaa969b63439b89801ea560f11d42b0a387634275c633623"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win32.whl", hash = "sha256:6081bd7c2f4fcf9b383dcdb3b3385d75a26a7c9d2be25b6950c3d8ea652d2d2d"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:76f7e67cec1f1d097d1f4ed7de41be3d74546e1a4ede0c7d56e775c4dce5dfb0"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:3d306fc4d88a6bcf61ce9d572c738b918578121bfd72891625fab314549024b5"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:391ac4d6002a80e15f35adc4ad6056f4fe1c17ceb0d1f98ba01b0f4f917adfd7"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:0c1b5cf37f0b2d96cc3c9bc86fff16613b9f5d0ca565c96cf1f1fb8cfca4b81c"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:3c5dc11d72519e55f727320e3cee535feedfaee09c0f0765ed1ca7badff1ab3c"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win32.whl", hash = "sha256:cc86c2ef598c15d824a243c2541c29459881c67fc3c0adb6efe2242f8f0ec3af"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c27985e949b9b1a1fb4c20c71d315c10ea0f93fdf3ccdd4a8c158b5926edd8c8"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win32.whl", hash = "sha256:e311dfcb470696e3c077249615893cada598e62fa7c4e4ca090167bd2b7d331f"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4574eef1f3bb81501fb02f911298af3c02fe8179c31a33b361dd49180c3e644d"}, + {file = "twisted_iocpsupport-1.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:872747a3b64e2909aee59c803ccd0bceb9b75bf27915520ebd32d69687040fa2"}, + {file = "twisted_iocpsupport-1.0.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c2712b778bacf1db434e3e065adfed3db300754186a29aecac1efae9ef4bcaff"}, + {file = "twisted_iocpsupport-1.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7c66fa0aa4236b27b3c61cb488662d85dae746a6d1c7b0d91cf7aae118445adf"}, + {file = "twisted_iocpsupport-1.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:300437af17396a945a58dcfffd77863303a8b6d9e65c6e81f1d2eed55b50d444"}, +] [[package]] name = "typed-ast" -version = "1.5.4" +version = "1.5.5" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, +] [[package]] name = "typing-extensions" -version = "4.5.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] [[package]] name = "tzdata" -version = "2023.2" +version = "2023.3" description = "Provider of IANA time zone data" category = "main" optional = false python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] [[package]] name = "tzlocal" -version = "4.3" +version = "5.0.1" description = "tzinfo object for the local timezone" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, + {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, +] [package.dependencies] "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -pytz-deprecation-shim = "*" tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest-cov", "pytest-mock (>=3.3)", "pytest (>=4.3)", "zest.releaser"] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] [[package]] name = "uc-micro-py" -version = "1.0.1" +version = "1.0.2" description = "Micro subset of unicode data files for linkify-it-py projects." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, + {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, +] [package.extras] test = ["coverage", "pytest", "pytest-cov"] [[package]] name = "urllib3" -version = "1.26.15" +version = "1.26.16" 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 = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] +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)"] [[package]] name = "uwsgi" -version = "2.0.21" +version = "2.0.22" description = "The uWSGI server" category = "main" optional = false python-versions = "*" +files = [ + {file = "uwsgi-2.0.22.tar.gz", hash = "sha256:4cc4727258671ac5fa17ab422155e9aaef8a2008ebb86e4404b66deaae965db2"}, +] [[package]] name = "w3lib" -version = "2.1.1" +version = "2.1.2" description = "Library of web-related functions" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "w3lib-2.1.2-py3-none-any.whl", hash = "sha256:c4432926e739caa8e3f49f5de783f336df563d9490416aebd5d39fb896d264e7"}, + {file = "w3lib-2.1.2.tar.gz", hash = "sha256:ed5b74e997eea2abe3c1321f916e344144ee8e9072a6f33463ee8e57f858a4b1"}, +] [[package]] name = "watchdog" @@ -2541,6 +4110,36 @@ description = "Filesystem events monitoring" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"}, + {file = "watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"}, + {file = "watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"}, + {file = "watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"}, + {file = "watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"}, + {file = "watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"}, + {file = "watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"}, + {file = "watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"}, + {file = "watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"}, + {file = "watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"}, +] [package.extras] watchmedo = ["PyYAML (>=3.10)"] @@ -2552,6 +4151,10 @@ description = "Measures the displayed width of unicode strings in a terminal" category = "dev" optional = false python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] [[package]] name = "webencodings" @@ -2560,17 +4163,25 @@ description = "Character encoding aliases for legacy web content" category = "dev" optional = false python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "websocket-client" -version = "1.5.1" +version = "1.6.2" description = "WebSocket client for Python with low level API options" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "websocket-client-1.6.2.tar.gz", hash = "sha256:53e95c826bf800c4c465f50093a8c4ff091c7327023b10bfaff40cf1ef170eaa"}, + {file = "websocket_client-1.6.2-py3-none-any.whl", hash = "sha256:ce54f419dfae71f4bdba69ebe65bf7f0a93fe71bc009ad3a010aacc3eebad537"}, +] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] @@ -2581,257 +4192,191 @@ description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, + {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, + {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, + {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, + {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, + {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, + {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, + {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, + {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, + {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, + {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, + {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, + {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, + {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, + {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, + {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, + {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, + {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, + {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, + {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, + {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, + {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, + {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, + {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, +] [[package]] name = "werkzeug" -version = "2.2.3" +version = "2.3.7" description = "The comprehensive WSGI web application library." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "werkzeug-2.3.7-py3-none-any.whl", hash = "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528"}, + {file = "werkzeug-2.3.7.tar.gz", hash = "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8"}, +] [package.dependencies] MarkupSafe = ">=2.1.1" [package.extras] -watchdog = ["watchdog"] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wheel" +version = "0.41.2" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.41.2-py3-none-any.whl", hash = "sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8"}, + {file = "wheel-0.41.2.tar.gz", hash = "sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "widgetsnbextension" -version = "3.6.3" +version = "3.6.5" description = "IPython HTML widgets for Jupyter" category = "dev" optional = false python-versions = "*" +files = [ + {file = "widgetsnbextension-3.6.5-py2.py3-none-any.whl", hash = "sha256:a5ae5e8ac0a85b9c527bee8ecb60b3e4b9ce499ed2900c9335b4d94e59f2e086"}, + {file = "widgetsnbextension-3.6.5.tar.gz", hash = "sha256:601352aa4df7b15717fc57ab59fd9f2795003e53c477dca0d53171c4ee933b35"}, +] [package.dependencies] notebook = ">=4.4.1" [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, +] [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] -name = "zope.interface" +name = "zope-interface" version = "6.0" description = "Interfaces for Python" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" [package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface"] +docs = ["Sphinx", "repoze.sphinx.autointerface"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.8" -content-hash = "d9995c629c47a3dfba384bac0744b20da958ae7a66637d42086f1a3ce43a247d" - -[metadata.files] -alabaster = [] -alembic = [] -anyio = [] -appdirs = [] -appnope = [] -argh = [] -argon2-cffi = [] -argon2-cffi-bindings = [] -asttokens = [] -atomicwrites = [] -attrs = [] -automat = [] -babel = [] -backcall = [] -"backports.zoneinfo" = [] -beautifulsoup4 = [] -black = [] -bleach = [] -cachetools = [] -certifi = [] -cffi = [] -charset-normalizer = [] -click = [] -colorama = [] -comm = [] -constantly = [] -cryptography = [] -cssselect = [] -dateparser = [] -debugpy = [] -decorator = [] -defusedxml = [] -diskcache = [] -docutils = [] -dynaconf = [] -entrypoints = [] -executing = [] -fastjsonschema = [] -filelock = [] -flask = [] -flask-accept = [] -flask-cors = [] -flask-sqlalchemy = [] -frozendict = [] -gitdb = [] -gitpython = [] -greenlet = [] -hyperlink = [] -idna = [] -imagesize = [] -importlib-metadata = [] -importlib-resources = [] -incremental = [] -iniconfig = [] -ipykernel = [] -ipython = [] -ipython-genutils = [] -ipywidgets = [] -itemadapter = [] -itemloaders = [] -itsdangerous = [] -jedi = [] -jinja2 = [] -jmespath = [] -jsonschema = [] -jupyter-book = [] -jupyter-cache = [] -jupyter-client = [] -jupyter-core = [] -jupyter-server = [] -jupyter-server-mathjax = [] -jupyter-sphinx = [] -jupyterlab-widgets = [] -jupytext = [] -latexcodec = [] -linkify-it-py = [] -lxml = [] -mako = [] -markdown-it-py = [] -markupsafe = [] -matplotlib-inline = [] -mdit-py-plugins = [] -mistune = [] -mypy-extensions = [] -myst-nb = [] -myst-parser = [] -nbclassic = [] -nbclient = [] -nbconvert = [] -nbdime = [] -nbformat = [] -nest-asyncio = [] -notebook = [] -notebook-shim = [] -"org.webpki.json" = [] -packaging = [] -pandocfilters = [] -parsel = [] -parso = [] -pathspec = [] -pexpect = [] -pickleshare = [] -pkgutil-resolve-name = [] -platformdirs = [] -pluggy = [] -prometheus-client = [] -prompt-toolkit = [] -protego = [] -psutil = [] -ptyprocess = [] -pure-eval = [] -py = [] -pyasn1 = [] -pyasn1-modules = [] -pybtex = [] -pybtex-docutils = [] -pycparser = [] -pydata-sphinx-theme = [] -pydispatcher = [] -pyee = [] -pygments = [] -PyLD = [] -pyopenssl = [] -pyppeteer = [] -pypydispatcher = [] -pyrsistent = [] -pytest = [] -python-dateutil = [] -python-magic = [] -pytz = [] -pytz-deprecation-shim = [] -pywin32 = [] -pywinpty = [] -pyyaml = [] -pyzmq = [] -queuelib = [] -regex = [] -requests = [] -requests-file = [] -scrapy = [] -scrapyd = [] -send2trash = [] -service-identity = [] -shortuuid = [] -six = [] -smmap = [] -sniffio = [] -snowballstemmer = [] -sonormal = [] -soupsieve = [] -sphinx = [] -sphinx-book-theme = [] -sphinx-comments = [] -sphinx-copybutton = [] -sphinx-external-toc = [] -sphinx-jupyterbook-latex = [] -sphinx-multitoc-numbering = [] -sphinx-panels = [] -sphinx-thebe = [] -sphinx-togglebutton = [] -sphinxcontrib-applehelp = [] -sphinxcontrib-bibtex = [] -sphinxcontrib-devhelp = [] -sphinxcontrib-drawio = [] -sphinxcontrib-htmlhelp = [] -sphinxcontrib-jsmath = [] -sphinxcontrib-plantuml = [] -sphinxcontrib-qthelp = [] -sphinxcontrib-serializinghtml = [] -sqlalchemy = [] -stack-data = [] -terminado = [] -testpath = [] -tldextract = [] -toml = [] -tornado = [] -tqdm = [] -traitlets = [] -twisted = [] -twisted-iocpsupport = [] -typed-ast = [] -typing-extensions = [] -tzdata = [] -tzlocal = [] -uc-micro-py = [] -urllib3 = [] -uwsgi = [] -w3lib = [] -watchdog = [] -wcwidth = [] -webencodings = [] -websocket-client = [] -websockets = [] -werkzeug = [] -widgetsnbextension = [] -zipp = [] -"zope.interface" = [] +content-hash = "4949649e36714f7fc13fbeabb8d939006eb0c7fdcbb2abc3e6c60b40841eef05" diff --git a/pyproject.toml b/pyproject.toml index 85b0471b..56fbdc0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ scrapyd = "^1.2.1" diskcache = "^5.2.1" Flask-Cors = "^3.0.10" flask_accept = "^0.0.6" -pyld = {git = "https://github.com/datadavev/pyld.git", tag = "2.0.4-dev_ddv-0.1"} +pyld = {git = "https://github.com/datadavev/pyld.git", tag = "ddv-2.1.0"} sonormal = {path = "../sonormal", develop=true } #pyjnius = "^1.3.0" From dde116c6f4dbce6a71820f7d42fe71d4e3936040 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 8 Sep 2023 14:49:08 -0400 Subject: [PATCH 218/301] updating dependencies again --- poetry.lock | 1459 ++++++++++++++++++++++-------------------------- pyproject.toml | 1 + 2 files changed, 672 insertions(+), 788 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3ff06e65..197f91a3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,100 +1,99 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.8.5" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, ] [package.dependencies] @@ -113,7 +112,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +126,6 @@ frozenlist = ">=1.1.0" name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -138,14 +135,13 @@ files = [ [[package]] name = "alembic" -version = "1.11.1" +version = "1.12.0" description = "A database migration tool for SQLAlchemy." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "alembic-1.11.1-py3-none-any.whl", hash = "sha256:dc871798a601fab38332e38d6ddb38d5e734f60034baeb8e2db5b642fccd8ab8"}, - {file = "alembic-1.11.1.tar.gz", hash = "sha256:6a810a6b012c88b33458fceb869aef09ac75d6ace5291915ba7fae44de372c01"}, + {file = "alembic-1.12.0-py3-none-any.whl", hash = "sha256:03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f"}, + {file = "alembic-1.12.0.tar.gz", hash = "sha256:8e7645c32e4f200675e69f0745415335eb59a3663f5feb487abfa0b30c45888b"}, ] [package.dependencies] @@ -162,7 +158,6 @@ tz = ["python-dateutil"] name = "appdirs" version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = "*" files = [ @@ -174,7 +169,6 @@ files = [ name = "argh" version = "0.26.2" description = "An unobtrusive argparse wrapper with natural syntax" -category = "dev" optional = false python-versions = "*" files = [ @@ -184,21 +178,19 @@ files = [ [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "atomicwrites" version = "1.4.1" description = "Atomic file writes." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -209,7 +201,6 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -228,7 +219,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "automat" version = "22.10.0" description = "Self-service finite-state machines for the programmer on the go." -category = "main" optional = false python-versions = "*" files = [ @@ -247,7 +237,6 @@ visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -262,7 +251,6 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -291,7 +279,6 @@ tzdata = ["tzdata"] name = "bcrypt" version = "4.0.1" description = "Modern password hashing for your software and your servers" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -326,7 +313,6 @@ typecheck = ["mypy"] name = "black" version = "20.8b1" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -349,33 +335,30 @@ d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] name = "cachetools" -version = "5.3.0" +version = "5.3.1" description = "Extensible memoizing collections and decorators" -category = "main" 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 = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -450,94 +433,92 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false 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"}, + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] [[package]] name = "click" version = "8.1.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -552,7 +533,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 = [ @@ -564,7 +544,6 @@ files = [ name = "constantly" version = "15.1.0" description = "Symbolic constants in Python" -category = "main" optional = false python-versions = "*" files = [ @@ -574,31 +553,34 @@ files = [ [[package]] name = "cryptography" -version = "40.0.2" +version = "41.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, - {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, - {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, - {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, + {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, + {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, + {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, ] [package.dependencies] @@ -607,18 +589,17 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff"] -sdist = ["setuptools-rust (>=0.11.4)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -tox = ["tox"] [[package]] name = "cssselect" version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -630,7 +611,6 @@ files = [ name = "dataone-common" version = "3.5.2" description = "Contains functionality common to projects that interact with the DataONE infrastructure via Python" -category = "main" optional = false python-versions = "*" files = [ @@ -648,27 +628,25 @@ zipstream = ">=1.1.4" [[package]] name = "dataone-libclient" -version = "3.5.0" +version = "3.5.2" description = "A DataONE client library for Python" -category = "main" optional = false python-versions = "*" files = [ - {file = "dataone.libclient-3.5.0-py3-none-any.whl", hash = "sha256:1bb026f400dacd476866f9c86f029780af7df866f0d10dc474bb14da5a9a09a2"}, + {file = "dataone.libclient-3.5.2-py3-none-any.whl", hash = "sha256:b5e684be133f526baf3193b02dc428f15138251fa774a573e803adec2dbac76d"}, ] [package.dependencies] -aiohttp = ">=3.6.2" -"dataone.common" = ">=3.5.0" -pyxb = ">=1.2.6" -requests = {version = ">=2.24.0", extras = ["security"]} -requests-toolbelt = ">=0.9.1" +aiohttp = ">=3.8.4" +"dataone.common" = ">=3.5.2" +pyxb-x = ">=1.2.6.1" +requests = {version = ">=2.31.0", extras = ["security"]} +requests-toolbelt = ">=1.0.0" [[package]] name = "dateparser" version = "1.1.8" description = "Date parsing library designed to parse dates from HTML pages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -689,21 +667,19 @@ langdetect = ["langdetect"] [[package]] name = "diskcache" -version = "5.6.1" +version = "5.6.3" description = "Disk Cache -- Disk and file backed persistent cache." -category = "main" optional = false python-versions = ">=3" files = [ - {file = "diskcache-5.6.1-py3-none-any.whl", hash = "sha256:558c6a2d5d7c721bb00e40711803d6804850c9f76c426ed81ecc627fe9d2ce2d"}, - {file = "diskcache-5.6.1.tar.gz", hash = "sha256:e4c978532feff5814c4cc00fe1e11e40501985946643d73220d41ee7737c72c3"}, + {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, + {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, ] [[package]] name = "docutils" version = "0.19" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -713,14 +689,13 @@ files = [ [[package]] name = "dynaconf" -version = "3.1.12" +version = "3.2.2" description = "The dynamic configurator for your Python Project" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "dynaconf-3.1.12-py2.py3-none-any.whl", hash = "sha256:a79d7b3ad4a35af9b576c49f11cd3b23a1b04b87b63a4e9f92cc82f2b0cafeeb"}, - {file = "dynaconf-3.1.12.tar.gz", hash = "sha256:11a60bcd735f82b8a47b288f99e4ffbbd08c6c130a7be93c5d03e93fc260a5e1"}, + {file = "dynaconf-3.2.2-py2.py3-none-any.whl", hash = "sha256:0d62e51af6e9971e8e45cabee487ec70467d6c5065a9f070beac973bedaf1d54"}, + {file = "dynaconf-3.2.2.tar.gz", hash = "sha256:2f98ec85a2b8edb767b3ed0f82c6d605d30af116ce4622932a719ba70ff152fc"}, ] [package.extras] @@ -728,32 +703,33 @@ all = ["configobj", "hvac", "redis", "ruamel.yaml"] configobj = ["configobj"] ini = ["configobj"] redis = ["redis"] -test = ["codecov", "configobj", "django", "flake8", "flake8-debugger", "flake8-print", "flake8-todo", "flask (>=0.12)", "hvac", "pep8-naming", "pytest", "pytest-cov", "pytest-mock", "pytest-xdist", "python-dotenv", "radon", "redis", "toml"] +test = ["configobj", "django", "flake8", "flake8-debugger", "flake8-print", "flake8-todo", "flask (>=0.12)", "hvac", "pep8-naming", "pytest", "pytest-cov", "pytest-mock", "pytest-xdist", "python-dotenv", "radon", "redis", "toml"] toml = ["toml"] vault = ["hvac"] yaml = ["ruamel.yaml"] [[package]] name = "filelock" -version = "3.12.0" +version = "3.12.3" description = "A platform independent file lock." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, - {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, + {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, + {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} + [package.extras] -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)"] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] [[package]] name = "flask" version = "1.1.2" description = "A simple framework for building complex web applications." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -776,7 +752,6 @@ dotenv = ["python-dotenv"] name = "flask-accept" version = "0.0.6" description = "Custom Accept header routing support for Flask" -category = "main" optional = false python-versions = "*" files = [ @@ -791,7 +766,6 @@ flask = "*" name = "flask-cors" version = "3.0.10" description = "A Flask extension adding a decorator for CORS support" -category = "main" optional = false python-versions = "*" files = [ @@ -807,7 +781,6 @@ Six = "*" name = "flask-sqlalchemy" version = "2.5.1" description = "Adds SQLAlchemy support to your Flask application." -category = "main" optional = false python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" files = [ @@ -823,7 +796,6 @@ SQLAlchemy = ">=0.8.0" name = "frozendict" version = "2.3.8" description = "A simple immutable dictionary" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -868,93 +840,78 @@ files = [ [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, ] [[package]] name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -963,6 +920,7 @@ files = [ {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, @@ -971,6 +929,7 @@ files = [ {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, @@ -1000,6 +959,7 @@ files = [ {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, @@ -1008,6 +968,7 @@ files = [ {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, @@ -1028,7 +989,6 @@ test = ["objgraph", "psutil"] 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 = [ @@ -1050,7 +1010,6 @@ lxml = ["lxml"] name = "hyperlink" version = "21.0.0" description = "A featureful, immutable, and correct URL for Python." -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1065,7 +1024,6 @@ idna = ">=2.5" name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1077,7 +1035,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1087,14 +1044,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.6.0" +version = "6.8.0" description = "Read metadata from Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] @@ -1103,32 +1059,30 @@ 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)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.0.1" description = "Read resources from Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "incremental" version = "22.10.0" description = "\"A small library that versions your Python projects.\"" -category = "main" optional = false python-versions = "*" files = [ @@ -1144,7 +1098,6 @@ scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1154,21 +1107,19 @@ files = [ [[package]] name = "iso8601" -version = "1.1.0" +version = "2.0.0" description = "Simple module to parse ISO 8601 dates" -category = "main" optional = false -python-versions = ">=3.6.2,<4.0" +python-versions = ">=3.7,<4.0" files = [ - {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, - {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, + {file = "iso8601-2.0.0-py3-none-any.whl", hash = "sha256:ebe10061b932edb8a8e33cc635d661926c59b9c3bed7a4f4edca8c62d400af10"}, + {file = "iso8601-2.0.0.tar.gz", hash = "sha256:739960d37c74c77bd9bd546a76562ccb581fe3d4820ff5c3141eb49c839fda8f"}, ] [[package]] name = "isodate" version = "0.6.1" description = "An ISO 8601 date/time/duration parser and formatter" -category = "main" optional = false python-versions = "*" files = [ @@ -1183,7 +1134,6 @@ six = "*" name = "itemadapter" version = "0.8.0" description = "Common interface for data container classes" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1195,7 +1145,6 @@ files = [ name = "itemloaders" version = "1.1.0" description = "Base library for scrapy's ItemLoader" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1213,7 +1162,6 @@ w3lib = ">=1.17.0" name = "itsdangerous" version = "2.0.1" description = "Safely pass data to untrusted environments and back." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1225,7 +1173,6 @@ files = [ name = "jinja2" version = "2.11.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1243,7 +1190,6 @@ i18n = ["Babel (>=0.8)"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1253,102 +1199,115 @@ files = [ [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.3" 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 = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] +source = ["Cython (>=0.29.35)"] [[package]] name = "mako" version = "1.2.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1368,7 +1327,6 @@ testing = ["pytest"] name = "markupsafe" version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1447,7 +1405,6 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1531,7 +1488,6 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1543,7 +1499,6 @@ files = [ name = "org-webpki-json" version = "0.1.0" description = "rfc8785 JSON canonicalization" -category = "main" optional = false python-versions = "^3.6" files = [] @@ -1559,7 +1514,6 @@ resolved_reference = "3d7ef90bf7c740841473877537302feddd229a3e" name = "owlrl" version = "6.0.2" description = "OWL-RL and RDFS based RDF Closure inferencing for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1574,7 +1528,6 @@ rdflib = ">=6.0.2" name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1584,14 +1537,13 @@ files = [ [[package]] name = "paramiko" -version = "3.2.0" +version = "3.3.1" description = "SSH2 protocol library" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "paramiko-3.2.0-py3-none-any.whl", hash = "sha256:df0f9dd8903bc50f2e10580af687f3015bf592a377cd438d2ec9546467a14eb8"}, - {file = "paramiko-3.2.0.tar.gz", hash = "sha256:93cdce625a8a1dc12204439d45033f3261bdb2c201648cfcdc06f9fd0f94ec29"}, + {file = "paramiko-3.3.1-py3-none-any.whl", hash = "sha256:b7bc5340a43de4287bbe22fe6de728aa2c22468b2a849615498dd944c2f275eb"}, + {file = "paramiko-3.3.1.tar.gz", hash = "sha256:6a3777a961ac86dbef375c5f5b8d50014a1a96d0fd7f054a43bc880134b0ff77"}, ] [package.dependencies] @@ -1608,7 +1560,6 @@ invoke = ["invoke (>=2.0)"] name = "parsel" version = "1.8.1" description = "Parsel is a library to extract data from HTML and XML using XPath and CSS selectors" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1625,26 +1576,24 @@ w3lib = ">=1.19.0" [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] @@ -1655,7 +1604,6 @@ testing = ["pytest", "pytest-benchmark"] 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 = [ @@ -1671,24 +1619,19 @@ tests = ["pytest", "pytest-cov", "pytest-lazy-fixture"] [[package]] name = "protego" -version = "0.2.1" +version = "0.3.0" description = "Pure-Python robots.txt parser with support for modern conventions" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "Protego-0.2.1-py2.py3-none-any.whl", hash = "sha256:04419b18f20e8909f1691c6b678392988271cc2a324a72f9663cb3af838b4bf7"}, - {file = "Protego-0.2.1.tar.gz", hash = "sha256:df666d4304dab774e2dc9feb208bb1ac8d71ea5ceec12f4c99eba30fbd642ff2"}, + {file = "Protego-0.3.0-py2.py3-none-any.whl", hash = "sha256:db38f6a945839d8162a4034031a21490469566a2726afb51d668497c457fb0aa"}, + {file = "Protego-0.3.0.tar.gz", hash = "sha256:04228bffde4c6bcba31cf6529ba2cfd6e1b70808fdc1d2cb4301be6b28d6c568"}, ] -[package.dependencies] -six = "*" - [[package]] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1700,7 +1643,6 @@ files = [ name = "pyasn1" version = "0.5.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -1712,7 +1654,6 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -1727,7 +1668,6 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1739,7 +1679,6 @@ files = [ name = "pydispatcher" version = "2.0.7" description = "Multi-producer multi-consumer in-memory signal dispatch system" -category = "main" optional = false python-versions = "*" files = [ @@ -1754,7 +1693,6 @@ dev = ["tox"] name = "pyee" version = "8.2.2" description = "A port of node.js's EventEmitter to python." -category = "main" optional = false python-versions = "*" files = [ @@ -1764,14 +1702,13 @@ files = [ [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" 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"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -1779,14 +1716,13 @@ plugins = ["importlib-metadata"] [[package]] name = "pyjwt" -version = "2.7.0" +version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, - {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.extras] @@ -1799,7 +1735,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "PyLD" version = "2.1.0" description = "Python implementation of the JSON-LD API" -category = "main" optional = false python-versions = "*" files = [] @@ -1826,7 +1761,6 @@ resolved_reference = "f5711b40d40d2fe43e0e68cb17005cf198757771" name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1851,18 +1785,17 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyopenssl" -version = "23.1.1" +version = "23.2.0" description = "Python wrapper module around the OpenSSL library" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pyOpenSSL-23.1.1-py3-none-any.whl", hash = "sha256:9e0c526404a210df9d2b18cd33364beadb0dc858a739b885677bc65e105d4a4c"}, - {file = "pyOpenSSL-23.1.1.tar.gz", hash = "sha256:841498b9bec61623b1b6c47ebbc02367c07d60e0e195f19790817f10cc8db0b7"}, + {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, + {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, ] [package.dependencies] -cryptography = ">=38.0.0,<41" +cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] @@ -1870,14 +1803,13 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, ] [package.extras] @@ -1887,7 +1819,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyppeteer" version = "1.0.2" description = "Headless chrome/chromium automation library (unofficial port of puppeteer)" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1908,7 +1839,6 @@ websockets = ">=10.0,<11.0" name = "pypydispatcher" version = "2.1.2" description = "Multi-producer-multi-consumer signal dispatching mechanism" -category = "main" optional = false python-versions = "*" files = [ @@ -1919,7 +1849,6 @@ files = [ name = "pyshacl" version = "0.22.2" description = "Python SHACL Validator" -category = "main" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ @@ -1945,7 +1874,6 @@ js = ["pyduktape2 (>=0.4.2,<0.5.0)"] name = "pytest" version = "6.2.5" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1970,7 +1898,6 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1985,7 +1912,6 @@ six = ">=1.5" name = "python-magic" version = "0.4.27" description = "File type identification using libmagic" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1995,32 +1921,19 @@ files = [ [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] - -[[package]] -name = "pyxb" -version = "1.2.6" -description = "Python XML Schema Bindings" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "PyXB-1.2.6.tar.gz", hash = "sha256:2a00f38dd1d87b88f92d79bc5a09718d730419b88e814545f472bbd5a3bf27b4"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] name = "pyxb-x" version = "1.2.6.1" description = "PyXB-X (\"pixbix\") is a pure Python package that generates Python source code for classes that correspond to data structures defined by XMLSchema." -category = "main" optional = false python-versions = "*" files = [ @@ -2032,7 +1945,6 @@ files = [ name = "queuelib" version = "1.6.2" description = "Collection of persistent (disk-based) and non-persistent (memory-based) queues" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2044,7 +1956,6 @@ files = [ name = "rdflib" version = "6.3.2" 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,<4.0" files = [ @@ -2064,107 +1975,105 @@ networkx = ["networkx (>=2.0.0,<3.0.0)"] [[package]] name = "regex" -version = "2023.5.5" +version = "2023.8.8" description = "Alternative regular expression module, to replace re." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "regex-2023.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48c9ec56579d4ba1c88f42302194b8ae2350265cb60c64b7b9a88dcb7fbde309"}, - {file = "regex-2023.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f4541550459c08fdd6f97aa4e24c6f1932eec780d58a2faa2068253df7d6ff"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e22e4460f0245b468ee645156a4f84d0fc35a12d9ba79bd7d79bdcd2f9629d"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b870b6f632fc74941cadc2a0f3064ed8409e6f8ee226cdfd2a85ae50473aa94"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:171c52e320fe29260da550d81c6b99f6f8402450dc7777ef5ced2e848f3b6f8f"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad5524c2aedaf9aa14ef1bc9327f8abd915699dea457d339bebbe2f0d218f86"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a0f874ee8c0bc820e649c900243c6d1e6dc435b81da1492046716f14f1a2a96"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e645c757183ee0e13f0bbe56508598e2d9cd42b8abc6c0599d53b0d0b8dd1479"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a4c5da39bca4f7979eefcbb36efea04471cd68db2d38fcbb4ee2c6d440699833"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5e3f4468b8c6fd2fd33c218bbd0a1559e6a6fcf185af8bb0cc43f3b5bfb7d636"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:59e4b729eae1a0919f9e4c0fc635fbcc9db59c74ad98d684f4877be3d2607dd6"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ba73a14e9c8f9ac409863543cde3290dba39098fc261f717dc337ea72d3ebad2"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0bbd5dcb19603ab8d2781fac60114fb89aee8494f4505ae7ad141a3314abb1f9"}, - {file = "regex-2023.5.5-cp310-cp310-win32.whl", hash = "sha256:40005cbd383438aecf715a7b47fe1e3dcbc889a36461ed416bdec07e0ef1db66"}, - {file = "regex-2023.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:59597cd6315d3439ed4b074febe84a439c33928dd34396941b4d377692eca810"}, - {file = "regex-2023.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f08276466fedb9e36e5193a96cb944928301152879ec20c2d723d1031cd4ddd"}, - {file = "regex-2023.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd46f30e758629c3ee91713529cfbe107ac50d27110fdcc326a42ce2acf4dafc"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2910502f718828cecc8beff004917dcf577fc5f8f5dd40ffb1ea7612124547b"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:445d6f4fc3bd9fc2bf0416164454f90acab8858cd5a041403d7a11e3356980e8"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18196c16a584619c7c1d843497c069955d7629ad4a3fdee240eb347f4a2c9dbe"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d430a23b661629661f1fe8395be2004006bc792bb9fc7c53911d661b69dd7e"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a28979cc667e5f82ef433db009184e7ac277844eea0f7f4d254b789517941d"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f764e4dfafa288e2eba21231f455d209f4709436baeebb05bdecfb5d8ddc3d35"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23d86ad2121b3c4fc78c58f95e19173790e22ac05996df69b84e12da5816cb17"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:690a17db524ee6ac4a27efc5406530dd90e7a7a69d8360235323d0e5dafb8f5b"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1ecf3dcff71f0c0fe3e555201cbe749fa66aae8d18f80d2cc4de8e66df37390a"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:811040d7f3dd9c55eb0d8b00b5dcb7fd9ae1761c454f444fd9f37fe5ec57143a"}, - {file = "regex-2023.5.5-cp311-cp311-win32.whl", hash = "sha256:c8c143a65ce3ca42e54d8e6fcaf465b6b672ed1c6c90022794a802fb93105d22"}, - {file = "regex-2023.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:586a011f77f8a2da4b888774174cd266e69e917a67ba072c7fc0e91878178a80"}, - {file = "regex-2023.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b6365703e8cf1644b82104cdd05270d1a9f043119a168d66c55684b1b557d008"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a56c18f21ac98209da9c54ae3ebb3b6f6e772038681d6cb43b8d53da3b09ee81"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b942d8b3ce765dbc3b1dad0a944712a89b5de290ce8f72681e22b3c55f3cc8"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:844671c9c1150fcdac46d43198364034b961bd520f2c4fdaabfc7c7d7138a2dd"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ce65bdeaf0a386bb3b533a28de3994e8e13b464ac15e1e67e4603dd88787fa"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fee0016cc35a8a91e8cc9312ab26a6fe638d484131a7afa79e1ce6165328a135"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18f05d14f14a812fe9723f13afafefe6b74ca042d99f8884e62dbd34dcccf3e2"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:941b3f1b2392f0bcd6abf1bc7a322787d6db4e7457be6d1ffd3a693426a755f2"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:921473a93bcea4d00295799ab929522fc650e85c6b9f27ae1e6bb32a790ea7d3"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:e2205a81f815b5bb17e46e74cc946c575b484e5f0acfcb805fb252d67e22938d"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:385992d5ecf1a93cb85adff2f73e0402dd9ac29b71b7006d342cc920816e6f32"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:890a09cb0a62198bff92eda98b2b507305dd3abf974778bae3287f98b48907d3"}, - {file = "regex-2023.5.5-cp36-cp36m-win32.whl", hash = "sha256:821a88b878b6589c5068f4cc2cfeb2c64e343a196bc9d7ac68ea8c2a776acd46"}, - {file = "regex-2023.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:7918a1b83dd70dc04ab5ed24c78ae833ae8ea228cef84e08597c408286edc926"}, - {file = "regex-2023.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:338994d3d4ca4cf12f09822e025731a5bdd3a37aaa571fa52659e85ca793fb67"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a69cf0c00c4d4a929c6c7717fd918414cab0d6132a49a6d8fc3ded1988ed2ea"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f5e06df94fff8c4c85f98c6487f6636848e1dc85ce17ab7d1931df4a081f657"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8906669b03c63266b6a7693d1f487b02647beb12adea20f8840c1a087e2dfb5"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fda3e50abad8d0f48df621cf75adc73c63f7243cbe0e3b2171392b445401550"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac2b7d341dc1bd102be849d6dd33b09701223a851105b2754339e390be0627a"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb2b495dd94b02de8215625948132cc2ea360ae84fe6634cd19b6567709c8ae2"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aa7d032c1d84726aa9edeb6accf079b4caa87151ca9fabacef31fa028186c66d"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d45864693351c15531f7e76f545ec35000d50848daa833cead96edae1665559"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21e90a288e6ba4bf44c25c6a946cb9b0f00b73044d74308b5e0afd190338297c"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:10250a093741ec7bf74bcd2039e697f519b028518f605ff2aa7ac1e9c9f97423"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6b8d0c153f07a953636b9cdb3011b733cadd4178123ef728ccc4d5969e67f3c2"}, - {file = "regex-2023.5.5-cp37-cp37m-win32.whl", hash = "sha256:10374c84ee58c44575b667310d5bbfa89fb2e64e52349720a0182c0017512f6c"}, - {file = "regex-2023.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9b320677521aabf666cdd6e99baee4fb5ac3996349c3b7f8e7c4eee1c00dfe3a"}, - {file = "regex-2023.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:afb1c70ec1e594a547f38ad6bf5e3d60304ce7539e677c1429eebab115bce56e"}, - {file = "regex-2023.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf123225945aa58b3057d0fba67e8061c62d14cc8a4202630f8057df70189051"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99757ad7fe5c8a2bb44829fc57ced11253e10f462233c1255fe03888e06bc19"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a623564d810e7a953ff1357f7799c14bc9beeab699aacc8b7ab7822da1e952b8"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ced02e3bd55e16e89c08bbc8128cff0884d96e7f7a5633d3dc366b6d95fcd1d6"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cbe6b5be3b9b698d8cc4ee4dee7e017ad655e83361cd0ea8e653d65e469468"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a6e4b0e0531223f53bad07ddf733af490ba2b8367f62342b92b39b29f72735a"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e9c4f778514a560a9c9aa8e5538bee759b55f6c1dcd35613ad72523fd9175b8"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:256f7f4c6ba145f62f7a441a003c94b8b1af78cee2cccacfc1e835f93bc09426"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd7b68fd2e79d59d86dcbc1ccd6e2ca09c505343445daaa4e07f43c8a9cc34da"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4a5059bd585e9e9504ef9c07e4bc15b0a621ba20504388875d66b8b30a5c4d18"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6893544e06bae009916a5658ce7207e26ed17385149f35a3125f5259951f1bbe"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c64d5abe91a3dfe5ff250c6bb267ef00dbc01501518225b45a5f9def458f31fb"}, - {file = "regex-2023.5.5-cp38-cp38-win32.whl", hash = "sha256:7923470d6056a9590247ff729c05e8e0f06bbd4efa6569c916943cb2d9b68b91"}, - {file = "regex-2023.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:4035d6945cb961c90c3e1c1ca2feb526175bcfed44dfb1cc77db4fdced060d3e"}, - {file = "regex-2023.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50fd2d9b36938d4dcecbd684777dd12a407add4f9f934f235c66372e630772b0"}, - {file = "regex-2023.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d19e57f888b00cd04fc38f5e18d0efbd91ccba2d45039453ab2236e6eec48d4d"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd966475e963122ee0a7118ec9024388c602d12ac72860f6eea119a3928be053"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db09e6c18977a33fea26fe67b7a842f706c67cf8bda1450974d0ae0dd63570df"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6164d4e2a82f9ebd7752a06bd6c504791bedc6418c0196cd0a23afb7f3e12b2d"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84397d3f750d153ebd7f958efaa92b45fea170200e2df5e0e1fd4d85b7e3f58a"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c3efee9bb53cbe7b285760c81f28ac80dc15fa48b5fe7e58b52752e642553f1"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:144b5b017646b5a9392a5554a1e5db0000ae637be4971c9747566775fc96e1b2"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1189fbbb21e2c117fda5303653b61905aeeeea23de4a94d400b0487eb16d2d60"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f83fe9e10f9d0b6cf580564d4d23845b9d692e4c91bd8be57733958e4c602956"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:72aa4746993a28c841e05889f3f1b1e5d14df8d3daa157d6001a34c98102b393"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:de2f780c3242ea114dd01f84848655356af4dd561501896c751d7b885ea6d3a1"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:290fd35219486dfbc00b0de72f455ecdd63e59b528991a6aec9fdfc0ce85672e"}, - {file = "regex-2023.5.5-cp39-cp39-win32.whl", hash = "sha256:732176f5427e72fa2325b05c58ad0b45af341c459910d766f814b0584ac1f9ac"}, - {file = "regex-2023.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:1307aa4daa1cbb23823d8238e1f61292fd07e4e5d8d38a6efff00b67a7cdb764"}, - {file = "regex-2023.5.5.tar.gz", hash = "sha256:7d76a8a1fc9da08296462a18f16620ba73bcbf5909e42383b253ef34d9d5141e"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, + {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, + {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, + {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, + {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, + {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, + {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, + {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, + {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, + {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, + {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, + {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, + {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, + {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, + {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, + {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2186,7 +2095,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-file" version = "1.5.1" description = "File transport adapter for Requests" -category = "main" optional = false python-versions = "*" files = [ @@ -2202,7 +2110,6 @@ six = "*" name = "requests-toolbelt" version = "1.0.0" description = "A utility belt for advanced users of python-requests" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2217,7 +2124,6 @@ requests = ">=2.0.1,<3.0.0" name = "scp" version = "0.14.5" description = "scp module for paramiko" -category = "main" optional = false python-versions = "*" files = [ @@ -2230,22 +2136,21 @@ paramiko = "*" [[package]] name = "scrapy" -version = "2.9.0" +version = "2.10.1" description = "A high-level Web Crawling and Web Scraping framework" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Scrapy-2.9.0-py2.py3-none-any.whl", hash = "sha256:908fdb7874d235230a16fa288637e3f673813cf27fb177f589b5a22bad00b0f9"}, - {file = "Scrapy-2.9.0.tar.gz", hash = "sha256:564c972b56e54b83141f395ce3f6a25bfe2093d61d13f9b81d05384e19db98da"}, + {file = "Scrapy-2.10.1-py2.py3-none-any.whl", hash = "sha256:0b2f99d297f32112ae7979f50b9942a5f55b09b821f1c3afb0bed950f6a1f5a7"}, + {file = "Scrapy-2.10.1.tar.gz", hash = "sha256:91d67875fbb537607b07e31363445718a3532b544e6e2b4baf8a042b21a1d10f"}, ] [package.dependencies] -cryptography = ">=3.4.6" +cryptography = ">=36.0.0" cssselect = ">=0.9.1" itemadapter = ">=0.1.0" itemloaders = ">=1.0.1" -lxml = ">=4.3.0" +lxml = ">=4.4.1" packaging = "*" parsel = ">=1.5.0" protego = ">=0.1.15" @@ -2256,7 +2161,7 @@ queuelib = ">=1.4.2" service-identity = ">=18.1.0" setuptools = "*" tldextract = "*" -Twisted = ">=18.9.0" +Twisted = ">=18.9.0,<23.8.0" w3lib = ">=1.17.0" "zope.interface" = ">=5.1.0" @@ -2264,7 +2169,6 @@ w3lib = ">=1.17.0" name = "scrapyd" version = "1.4.2" description = "A service for running Scrapy spiders, with an HTTP API" -category = "main" optional = false python-versions = "*" files = [ @@ -2286,14 +2190,13 @@ test = ["pytest", "pytest-cov", "requests"] [[package]] name = "service-identity" -version = "21.1.0" +version = "23.1.0" description = "Service identity verification for pyOpenSSL & cryptography." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "service-identity-21.1.0.tar.gz", hash = "sha256:6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34"}, - {file = "service_identity-21.1.0-py2.py3-none-any.whl", hash = "sha256:f0b0caac3d40627c3c04d7a51b6e06721857a0e10a8775f2d1d7e72901b3a7db"}, + {file = "service_identity-23.1.0-py3-none-any.whl", hash = "sha256:87415a691d52fcad954a500cb81f424d0273f8e7e3ee7d766128f4575080f383"}, + {file = "service_identity-23.1.0.tar.gz", hash = "sha256:ecb33cd96307755041e978ab14f8b14e13b40f1fbd525a4dc78f46d2b986431d"}, ] [package.dependencies] @@ -2301,36 +2204,34 @@ attrs = ">=19.1.0" cryptography = "*" pyasn1 = "*" pyasn1-modules = "*" -six = "*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "furo", "idna", "pyOpenSSL", "pytest", "sphinx"] -docs = ["furo", "sphinx"] +dev = ["pyopenssl", "service-identity[docs,idna,mypy,tests]"] +docs = ["furo", "myst-parser", "pyopenssl", "sphinx", "sphinx-notfound-page"] idna = ["idna"] +mypy = ["idna", "mypy", "types-pyopenssl"] tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] name = "setuptools" -version = "67.8.0" +version = "68.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, - {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, + {file = "setuptools-68.2.0-py3-none-any.whl", hash = "sha256:af3d5949030c3f493f550876b2fd1dd5ec66689c4ee5d5344f009746f71fd5a8"}, + {file = "setuptools-68.2.0.tar.gz", hash = "sha256:00478ca80aeebeecb2f288d3206b0de568df5cd2b8fada1209843cc9a8d88a48"}, ] [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-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"] +docs = ["furo", "jaraco.packaging (>=9.3)", "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 (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "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)", "packaging", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shortuuid" version = "1.0.11" description = "A generator library for concise, unambiguous and URL-safe UUIDs." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2342,7 +2243,6 @@ files = [ 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 = [ @@ -2354,7 +2254,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -2366,7 +2265,6 @@ files = [ name = "sonormal" version = "0.2.1" description = "Schema.org normalization service" -category = "main" optional = false python-versions = "^3.8" files = [] @@ -2393,7 +2291,6 @@ url = "../sonormal" name = "sphinx" version = "5.1.1" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2429,7 +2326,6 @@ test = ["cython", "html5lib", "pytest (>=4.6)", "typed-ast"] name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2445,7 +2341,6 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2461,7 +2356,6 @@ test = ["pytest"] name = "sphinxcontrib-drawio" version = "0.0.13" description = "Sphinx Extension to include draw.io files" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2473,7 +2367,6 @@ files = [ name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2489,7 +2382,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2504,7 +2396,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-plantuml" version = "0.21" description = "Sphinx \"plantuml\" extension" -category = "dev" optional = false python-versions = "*" files = [ @@ -2518,7 +2409,6 @@ Sphinx = ">=1.6" name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2534,7 +2424,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2548,57 +2437,53 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.4.48" +version = "1.4.49" description = "Database Abstraction Library" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "SQLAlchemy-1.4.48-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:4bac3aa3c3d8bc7408097e6fe8bf983caa6e9491c5d2e2488cfcfd8106f13b6a"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dbcae0e528d755f4522cad5842f0942e54b578d79f21a692c44d91352ea6d64e"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27m-win32.whl", hash = "sha256:cbbe8b8bffb199b225d2fe3804421b7b43a0d49983f81dc654d0431d2f855543"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27m-win_amd64.whl", hash = "sha256:627e04a5d54bd50628fc8734d5fc6df2a1aa5962f219c44aad50b00a6cdcf965"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9af1db7a287ef86e0f5cd990b38da6bd9328de739d17e8864f1817710da2d217"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ce7915eecc9c14a93b73f4e1c9d779ca43e955b43ddf1e21df154184f39748e5"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5381ddd09a99638f429f4cbe1b71b025bed318f6a7b23e11d65f3eed5e181c33"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:87609f6d4e81a941a17e61a4c19fee57f795e96f834c4f0a30cee725fc3f81d9"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0808ad34167f394fea21bd4587fc62f3bd81bba232a1e7fbdfa17e6cfa7cd7"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-win32.whl", hash = "sha256:d53cd8bc582da5c1c8c86b6acc4ef42e20985c57d0ebc906445989df566c5603"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-win_amd64.whl", hash = "sha256:4355e5915844afdc5cf22ec29fba1010166e35dd94a21305f49020022167556b"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:066c2b0413e8cb980e6d46bf9d35ca83be81c20af688fedaef01450b06e4aa5e"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99bf13e07140601d111a7c6f1fc1519914dd4e5228315bbda255e08412f61a4"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee26276f12614d47cc07bc85490a70f559cba965fb178b1c45d46ffa8d73fda"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-win32.whl", hash = "sha256:49c312bcff4728bffc6fb5e5318b8020ed5c8b958a06800f91859fe9633ca20e"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-win_amd64.whl", hash = "sha256:cef2e2abc06eab187a533ec3e1067a71d7bbec69e582401afdf6d8cad4ba3515"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3509159e050bd6d24189ec7af373359f07aed690db91909c131e5068176c5a5d"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc2ab4d9f6d9218a5caa4121bdcf1125303482a1cdcfcdbd8567be8518969c0"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1ddbbcef9bcedaa370c03771ebec7e39e3944782bef49e69430383c376a250b"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f82d8efea1ca92b24f51d3aea1a82897ed2409868a0af04247c8c1e4fef5890"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-win32.whl", hash = "sha256:e3e98d4907805b07743b583a99ecc58bf8807ecb6985576d82d5e8ae103b5272"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-win_amd64.whl", hash = "sha256:25887b4f716e085a1c5162f130b852f84e18d2633942c8ca40dfb8519367c14f"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0817c181271b0ce5df1aa20949f0a9e2426830fed5ecdcc8db449618f12c2730"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1dd2562313dd9fe1778ed56739ad5d9aae10f9f43d9f4cf81d65b0c85168bb"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:68413aead943883b341b2b77acd7a7fe2377c34d82e64d1840860247cec7ff7c"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbde5642104ac6e95f96e8ad6d18d9382aa20672008cf26068fe36f3004491df"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-win32.whl", hash = "sha256:11c6b1de720f816c22d6ad3bbfa2f026f89c7b78a5c4ffafb220e0183956a92a"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-win_amd64.whl", hash = "sha256:eb5464ee8d4bb6549d368b578e9529d3c43265007193597ddca71c1bae6174e6"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:92e6133cf337c42bfee03ca08c62ba0f2d9695618c8abc14a564f47503157be9"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d29a3fc6d9c45962476b470a81983dd8add6ad26fdbfae6d463b509d5adcda"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:005e942b451cad5285015481ae4e557ff4154dde327840ba91b9ac379be3b6ce"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8cfe951ed074ba5e708ed29c45397a95c4143255b0d022c7c8331a75ae61f3"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-win32.whl", hash = "sha256:2b9af65cc58726129d8414fc1a1a650dcdd594ba12e9c97909f1f57d48e393d3"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-win_amd64.whl", hash = "sha256:2b562e9d1e59be7833edf28b0968f156683d57cabd2137d8121806f38a9d58f4"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a1fc046756cf2a37d7277c93278566ddf8be135c6a58397b4c940abf837011f4"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d9b55252d2ca42a09bcd10a697fa041e696def9dfab0b78c0aaea1485551a08"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6dab89874e72a9ab5462997846d4c760cdb957958be27b03b49cf0de5e5c327c"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd8b5ee5a3acc4371f820934b36f8109ce604ee73cc668c724abb054cebcb6e"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-win32.whl", hash = "sha256:eee09350fd538e29cfe3a496ec6f148504d2da40dbf52adefb0d2f8e4d38ccc4"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-win_amd64.whl", hash = "sha256:7ad2b0f6520ed5038e795cc2852eb5c1f20fa6831d73301ced4aafbe3a10e1f6"}, - {file = "SQLAlchemy-1.4.48.tar.gz", hash = "sha256:b47bc287096d989a0838ce96f7d8e966914a24da877ed41a7531d44b55cdb8df"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, + {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -2623,14 +2508,13 @@ sqlcipher = ["sqlcipher3-binary"] [[package]] name = "tldextract" -version = "3.4.4" +version = "3.5.0" description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tldextract-3.4.4-py3-none-any.whl", hash = "sha256:581e7dbefc90e7bb857bb6f768d25c811a3c5f0892ed56a9a2999ddb7b1b70c2"}, - {file = "tldextract-3.4.4.tar.gz", hash = "sha256:5fe3210c577463545191d45ad522d3d5e78d55218ce97215e82004dcae1e1234"}, + {file = "tldextract-3.5.0-py3-none-any.whl", hash = "sha256:2cb271ca8d06ea1630a1361b58edad14e0cf81f34ce3c90b052854528fe2a281"}, + {file = "tldextract-3.5.0.tar.gz", hash = "sha256:4df1c65b95be61d59428e8611e955e54e6f1d4483d3e8d5733d3a9062155e910"}, ] [package.dependencies] @@ -2643,7 +2527,6 @@ requests-file = ">=1.4" name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2653,21 +2536,20 @@ files = [ [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -2676,7 +2558,6 @@ telegram = ["requests"] name = "twisted" version = "22.10.0" description = "An asynchronous networking framework written in Python" -category = "main" optional = false python-versions = ">=3.7.1" files = [ @@ -2713,81 +2594,97 @@ windows-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0. [[package]] name = "twisted-iocpsupport" -version = "1.0.3" +version = "1.0.4" description = "An extension for use in the twisted I/O Completion Ports reactor." -category = "main" optional = false python-versions = "*" files = [ - {file = "twisted-iocpsupport-1.0.3.tar.gz", hash = "sha256:afb00801fdfbaccf0d0173a722626500023d4a19719ac9f129d1347a32e2fc66"}, - {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win32.whl", hash = "sha256:a379ef56a576c8090889f74441bc3822ca31ac82253cc61e8d50631bcb0c26d0"}, - {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1ea2c3fbdb739c95cc8b3355305cd593d2c9ec56d709207aa1a05d4d98671e85"}, - {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win32.whl", hash = "sha256:7efcdfafb377f32db90f42bd5fc5bb32cd1e3637ee936cdaf3aff4f4786ab3bf"}, - {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1dbfac706972bf9ec5ce1ddbc735d2ebba406ad363345df8751ffd5252aa1618"}, - {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:1ddfc5fa22ec6f913464b736b3f46e642237f17ac41be47eed6fa9bd52f5d0e0"}, - {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:1bdccbb22199fc69fd7744d6d2dfd22d073c028c8611d994b41d2d2ad0e0f40d"}, - {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:db11c80054b52dbdea44d63d5474a44c9a6531882f0e2960268b15123088641a"}, - {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:67bec1716eb8f466ef366bbf262e1467ecc9e20940111207663ac24049785bad"}, - {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win32.whl", hash = "sha256:98a6f16ab215f8c1446e9fc60aaed0ab7c746d566aa2f3492a23cea334e6bebb"}, - {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:4f249d0baac836bb431d6fa0178be063a310136bc489465a831e3abd2d7acafd"}, - {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win32.whl", hash = "sha256:aaca8f30c3b7c80d27a33fe9fe0d0bac42b1b012ddc60f677175c30e1becc1f3"}, - {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:dff43136c33665c2d117a73706aef6f7d6433e5c4560332a118fe066b16b8695"}, - {file = "twisted_iocpsupport-1.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8faceae553cfadc42ad791b1790e7cdecb7751102608c405217f6a26e877e0c5"}, - {file = "twisted_iocpsupport-1.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6f8c433faaad5d53d30d1da6968d5a3730df415e2efb6864847267a9b51290cd"}, - {file = "twisted_iocpsupport-1.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3f39c41c0213a81a9ce0961e30d0d7650f371ad80f8d261007d15a2deb6d5be3"}, + {file = "twisted-iocpsupport-1.0.4.tar.gz", hash = "sha256:858096c0d15e33f15ac157f455d8f86f2f2cdd223963e58c0f682a3af8362d89"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win32.whl", hash = "sha256:afa2b630797f9ed2f27f3d9f55e3f72b4244911e45a8c82756f44babbf0b243e"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:0058c963c8957bcd3deda62122e89953c9de1e867a274facc9b15dde1a9f31e8"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win32.whl", hash = "sha256:196f7c7ccad4ba4d1783b1c4e1d1b22d93c04275cd780bf7498d16c77319ad6e"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:4e5f97bcbabdd79cbaa969b63439b89801ea560f11d42b0a387634275c633623"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win32.whl", hash = "sha256:6081bd7c2f4fcf9b383dcdb3b3385d75a26a7c9d2be25b6950c3d8ea652d2d2d"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:76f7e67cec1f1d097d1f4ed7de41be3d74546e1a4ede0c7d56e775c4dce5dfb0"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:3d306fc4d88a6bcf61ce9d572c738b918578121bfd72891625fab314549024b5"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:391ac4d6002a80e15f35adc4ad6056f4fe1c17ceb0d1f98ba01b0f4f917adfd7"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:0c1b5cf37f0b2d96cc3c9bc86fff16613b9f5d0ca565c96cf1f1fb8cfca4b81c"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:3c5dc11d72519e55f727320e3cee535feedfaee09c0f0765ed1ca7badff1ab3c"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win32.whl", hash = "sha256:cc86c2ef598c15d824a243c2541c29459881c67fc3c0adb6efe2242f8f0ec3af"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c27985e949b9b1a1fb4c20c71d315c10ea0f93fdf3ccdd4a8c158b5926edd8c8"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win32.whl", hash = "sha256:e311dfcb470696e3c077249615893cada598e62fa7c4e4ca090167bd2b7d331f"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4574eef1f3bb81501fb02f911298af3c02fe8179c31a33b361dd49180c3e644d"}, + {file = "twisted_iocpsupport-1.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:872747a3b64e2909aee59c803ccd0bceb9b75bf27915520ebd32d69687040fa2"}, + {file = "twisted_iocpsupport-1.0.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c2712b778bacf1db434e3e065adfed3db300754186a29aecac1efae9ef4bcaff"}, + {file = "twisted_iocpsupport-1.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7c66fa0aa4236b27b3c61cb488662d85dae746a6d1c7b0d91cf7aae118445adf"}, + {file = "twisted_iocpsupport-1.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:300437af17396a945a58dcfffd77863303a8b6d9e65c6e81f1d2eed55b50d444"}, ] [[package]] name = "typed-ast" -version = "1.5.4" +version = "1.5.5" description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, ] [[package]] name = "typing-extensions" -version = "4.6.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.6.0-py3-none-any.whl", hash = "sha256:6ad00b63f849b7dcc313b70b6b304ed67b2b2963b3098a33efe18056b1a9a223"}, - {file = "typing_extensions-4.6.0.tar.gz", hash = "sha256:ff6b238610c747e44c268aa4bb23c8c735d665a63726df3f9431ce707f2aa768"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -2799,7 +2696,6 @@ files = [ name = "tzlocal" version = "5.0.1" description = "tzinfo object for the local timezone" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2818,7 +2714,6 @@ devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pyte name = "urllib3" version = "1.26.16" 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 = [ @@ -2833,32 +2728,29 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uwsgi" -version = "2.0.21" +version = "2.0.22" description = "The uWSGI server" -category = "main" optional = false python-versions = "*" files = [ - {file = "uwsgi-2.0.21.tar.gz", hash = "sha256:35a30d83791329429bc04fe44183ce4ab512fcf6968070a7bfba42fc5a0552a9"}, + {file = "uwsgi-2.0.22.tar.gz", hash = "sha256:4cc4727258671ac5fa17ab422155e9aaef8a2008ebb86e4404b66deaae965db2"}, ] [[package]] name = "w3lib" -version = "2.1.1" +version = "2.1.2" description = "Library of web-related functions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "w3lib-2.1.1-py3-none-any.whl", hash = "sha256:7fd5bd7980a95d1a8185e867d05f68a591aa281a3ded4590d2641d7b09086ed4"}, - {file = "w3lib-2.1.1.tar.gz", hash = "sha256:0e1198f1b745195b6b3dd1a4cd66011fbf82f30a4d9dabaee1f9e5c86f020274"}, + {file = "w3lib-2.1.2-py3-none-any.whl", hash = "sha256:c4432926e739caa8e3f49f5de783f336df563d9490416aebd5d39fb896d264e7"}, + {file = "w3lib-2.1.2.tar.gz", hash = "sha256:ed5b74e997eea2abe3c1321f916e344144ee8e9072a6f33463ee8e57f858a4b1"}, ] [[package]] name = "watchdog" version = "2.3.1" description = "Filesystem events monitoring" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2899,7 +2791,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -2911,7 +2802,6 @@ files = [ name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" optional = false python-versions = "*" files = [ @@ -2923,7 +2813,6 @@ files = [ name = "websockets" version = "10.4" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3002,7 +2891,6 @@ files = [ name = "werkzeug" version = "2.0.3" description = "The comprehensive WSGI web application library." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3017,7 +2905,6 @@ watchdog = ["watchdog"] name = "xmltodict" version = "0.13.0" description = "Makes working with XML feel like you are working with JSON" -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -3029,7 +2916,6 @@ files = [ name = "yarl" version = "1.9.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3115,25 +3001,23 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [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)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "zipstream" version = "1.1.4" description = "Zipfile generator" -category = "main" optional = false python-versions = "*" files = [ @@ -3144,7 +3028,6 @@ files = [ name = "zope-interface" version = "6.0" description = "Interfaces for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3191,4 +3074,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f1a9232f97baeaf304dc183b87a967dbbc4d261cf8301d29c9b0bea828f2c9ca" +content-hash = "1c5a6b743330cf10ebe037b8c84924b4d229eed12a9bb92b3ebdeadde46cdf0a" diff --git a/pyproject.toml b/pyproject.toml index 26dbf606..73a0b65e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,6 +37,7 @@ paramiko = "^3.2.0" scp = "^0.14.5" xmltodict = "^0.13.0" dataone-common = "^3.5.2" +uwsgi = "^2.0.22" [tool.poetry.dev-dependencies] pytest = "^6.1.2" From 636539d47d102e14cc7edebdf60c08f33a8b34dc Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 14 Sep 2023 17:25:58 +0000 Subject: [PATCH 219/301] fixing mnlite service restart --- mnonboard/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 7ef7039f..9155e17d 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -181,8 +181,8 @@ def restart_mnlite(): """ Subprocess call to restart the mnlite system service. Requires sudo. """ - i = input('Do you wish to restart the mnlite service? (Y/n) ') while True: + i = input('Do you wish to restart the mnlite service? (Y/n) ') if i.lower() == 'n': break elif i.lower() in ['y', '']: @@ -190,6 +190,7 @@ def restart_mnlite(): try: subprocess.run(['sudo', 'systemctl', 'restart', 'mnlite.service'], check=True) L.info('Done.') + break except subprocess.CalledProcessError as e: L.error('Error restarting mnlite system service. Is it installed on your system? Error text:\n%s' % (e)) print('mnlite was not restarted.') From fb814bca4f1c58ac88b1b21b1c86843139dbe2b9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 14 Sep 2023 18:54:23 +0000 Subject: [PATCH 220/301] avoiding IndexError when mnlite database is empty --- mnonboard/data_chx.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index b3df4c04..530a1b0a 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -128,7 +128,11 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): thing_no = random.randint(0, num_things) else: thing_no = i - t = q[thing_no] + if len(q) > 0: + t = q[thing_no] + else: + L.error('No records in mnlite database! Aborting checks and registrations.') + exit(1) L.info('Selected record number %s of %s in set: %s' % (thing_no, num_things, t.content)) pth = op.contentAbsPath(t.content) # read to object From 2cd82ed62b17ead78d1517ebd5ea74860a0fd139 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 14 Sep 2023 18:54:47 +0000 Subject: [PATCH 221/301] adding continue prompt after record checks --- mnonboard/data_chx.py | 6 ++++-- mnonboard/utils.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 530a1b0a..ff8aa74a 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -5,7 +5,7 @@ from mnonboard import L from mnonboard.defs import SHACL_URL, SHACL_ERRORS -from mnonboard.utils import limit_tests, save_report +from mnonboard.utils import limit_tests, save_report, ask_continue from opersist.cli import getOpersistInstance from opersist.models.thing import Thing from json.decoder import JSONDecodeError @@ -115,7 +115,7 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): num_tests = num_things if num_tests == 'all' else num_tests # still might have to test all things if (num_things < 500) L.info('Checking %s files.' % num_tests) q = op.getSession().query(Thing) # this might be too inefficient for large sets; may need to change - i, valid_files, load_errs = 0, 0, 0 + i, valid_files, load_errs, tot_violations = 0, 0, 0, 0 viol_dict = {} while i < num_tests: if i > 0: @@ -214,3 +214,5 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): violation_report(viol_dict, loc) # close the opersist instance op.close() + msg = f"{tot_violations} violations found (out of {i} checked; with {load_errs} load/decode errors). Continue?" + ask_continue(msg) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 9155e17d..92f53661 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -261,6 +261,20 @@ def limit_tests(num_things): break return num_things +def ask_continue(msg: str): + """ + """ + while True: + i = input(msg + ' ') + if i.lower() in 'n': + exit(1) + elif i.lower() in 'y': + break + else: + L.info('User has not entered "y" or "n".') + print('You have entered an incorrect value. Please enter "y" to continue or "n" to quit.') + continue + def create_names_xml(loc, node_id, names): """ Format subject XML documents and return list of names. From c58d9814f3c0e312c48b5ca922aff237c76783d5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 14 Sep 2023 18:58:50 +0000 Subject: [PATCH 222/301] replacing len inequality with try --- mnonboard/data_chx.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index ff8aa74a..b00bfb45 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -128,10 +128,12 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): thing_no = random.randint(0, num_things) else: thing_no = i - if len(q) > 0: + try: t = q[thing_no] - else: - L.error('No records in mnlite database! Aborting checks and registrations.') + except IndexError as e: + msg = 'No records in mnlite database! Aborting checks and registrations.' + L.error(f'{msg} Details: {e}') + print(msg) exit(1) L.info('Selected record number %s of %s in set: %s' % (thing_no, num_things, t.content)) pth = op.contentAbsPath(t.content) From 3e8dd5e564c2d9dd03fdc993327fbde4d8d3c5ac Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 14 Sep 2023 19:49:27 +0000 Subject: [PATCH 223/301] updating prompt message and docstring --- mnonboard/utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 92f53661..6d2ef906 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -263,9 +263,12 @@ def limit_tests(num_things): def ask_continue(msg: str): """ + A user input loop in which the user is prompted whether they want to continue. + + :param str msg: The message to display at the prompt. """ while True: - i = input(msg + ' ') + i = input(msg + ' (y/n) ') if i.lower() in 'n': exit(1) elif i.lower() in 'y': From 3a3fb6190b4b2a07e4311a1e47753bdf4b15dc62 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 25 Sep 2023 22:27:26 +0000 Subject: [PATCH 224/301] defining json-ld version for sonormal and pyld (related to #31) --- soscan/sonormalizepipeline.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index b94c274e..dfd315a2 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -35,7 +35,11 @@ def process_item(self, item, spider): require_identifier = True jsonld = item["jsonld"] - options = {"base": item["url"]} + version = jsonld.get('version', None) + version = jsonld.get('@version', '1.1') if not version else version + jldversion = f'json-ld-{version}' + self.logger.debug(f"process_item: version {jldversion}") + options = {"base": item["url"], "processingMode": jldversion} try: normalized = sonormal.sosoNormalize(jsonld, options=options) except Exception as e: @@ -43,7 +47,7 @@ def process_item(self, item, spider): ids = [] try: - _framed = sonormal.normalize.frameSODataset(normalized) + _framed = sonormal.normalize.frameSODataset(normalized, options=options) ids = sonormal.normalize.getDatasetsIdentifiers(_framed) except Exception as e: raise scrapy.exceptions.DropItem(f"JSON-LD identifier extract failed: {e}") From dc7bb230b6f9174a8ab733524b28f736c351bd6a Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 25 Sep 2023 22:28:20 +0000 Subject: [PATCH 225/301] no rigidly defined click ver; updates to lock file --- poetry.lock | 130 +++++++++++++++++++++++-------------------------- pyproject.toml | 2 +- 2 files changed, 63 insertions(+), 69 deletions(-) diff --git a/poetry.lock b/poetry.lock index 197f91a3..ad1d9a43 100644 --- a/poetry.lock +++ b/poetry.lock @@ -517,13 +517,13 @@ files = [ [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -553,34 +553,34 @@ files = [ [[package]] name = "cryptography" -version = "41.0.3" +version = "41.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, - {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, - {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, - {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, + {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, + {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, + {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, ] [package.dependencies] @@ -689,13 +689,13 @@ files = [ [[package]] name = "dynaconf" -version = "3.2.2" +version = "3.2.3" description = "The dynamic configurator for your Python Project" optional = false python-versions = ">=3.8" files = [ - {file = "dynaconf-3.2.2-py2.py3-none-any.whl", hash = "sha256:0d62e51af6e9971e8e45cabee487ec70467d6c5065a9f070beac973bedaf1d54"}, - {file = "dynaconf-3.2.2.tar.gz", hash = "sha256:2f98ec85a2b8edb767b3ed0f82c6d605d30af116ce4622932a719ba70ff152fc"}, + {file = "dynaconf-3.2.3-py2.py3-none-any.whl", hash = "sha256:df4af8d0f3b068cc6419ceceaae572070a6b8fec38fa51a1f5eb8ea4883e53de"}, + {file = "dynaconf-3.2.3.tar.gz", hash = "sha256:8a37ba3b16df64cb1db383eaad9c733aece218413be0fad5d785f7a907612106"}, ] [package.extras] @@ -710,21 +710,19 @@ yaml = ["ruamel.yaml"] [[package]] name = "filelock" -version = "3.12.3" +version = "3.12.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, - {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} - [package.extras] docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +typing = ["typing-extensions (>=4.7.1)"] [[package]] name = "flask" @@ -920,7 +918,6 @@ files = [ {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, @@ -929,7 +926,6 @@ files = [ {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, @@ -959,7 +955,6 @@ files = [ {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, @@ -968,7 +963,6 @@ files = [ {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, @@ -1063,21 +1057,21 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.0.1" +version = "6.1.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, - {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, + {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, + {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] [[package]] name = "incremental" @@ -2136,13 +2130,13 @@ paramiko = "*" [[package]] name = "scrapy" -version = "2.10.1" +version = "2.11.0" description = "A high-level Web Crawling and Web Scraping framework" optional = false python-versions = ">=3.8" files = [ - {file = "Scrapy-2.10.1-py2.py3-none-any.whl", hash = "sha256:0b2f99d297f32112ae7979f50b9942a5f55b09b821f1c3afb0bed950f6a1f5a7"}, - {file = "Scrapy-2.10.1.tar.gz", hash = "sha256:91d67875fbb537607b07e31363445718a3532b544e6e2b4baf8a042b21a1d10f"}, + {file = "Scrapy-2.11.0-py2.py3-none-any.whl", hash = "sha256:a7f36544d1f5ceb13cff9b7bc904bd7c0fc43a3af0fbe5aa2034fd937cf092d1"}, + {file = "Scrapy-2.11.0.tar.gz", hash = "sha256:3cbdedce0c3f0e0482d61be2d7458683be7cd7cf14b0ee6adfbaddb80f5b36a5"}, ] [package.dependencies] @@ -2167,13 +2161,13 @@ w3lib = ">=1.17.0" [[package]] name = "scrapyd" -version = "1.4.2" +version = "1.4.3" description = "A service for running Scrapy spiders, with an HTTP API" optional = false python-versions = "*" files = [ - {file = "scrapyd-1.4.2-py2.py3-none-any.whl", hash = "sha256:2f030bfa1cb04309406c6a96f7ec236706ea04a988fda88e39c07d1890eb7ca9"}, - {file = "scrapyd-1.4.2.tar.gz", hash = "sha256:fd10df9ba9a2a147cc8015bf15a47a2949e02ea8dee9dcb12e3bc98c2ff50615"}, + {file = "scrapyd-1.4.3-py2.py3-none-any.whl", hash = "sha256:4ad70b3043e76b125316ce71d1ed1cc8e17e8c3f75e0fa95208fadcb69d9407e"}, + {file = "scrapyd-1.4.3.tar.gz", hash = "sha256:ad2cfb47cdfb03e30d0401db6ff95864988ad5cce84081ad6b55f2e2b52b50bd"}, ] [package.dependencies] @@ -2214,19 +2208,19 @@ tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] name = "setuptools" -version = "68.2.0" +version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.2.0-py3-none-any.whl", hash = "sha256:af3d5949030c3f493f550876b2fd1dd5ec66689c4ee5d5344f009746f71fd5a8"}, - {file = "setuptools-68.2.0.tar.gz", hash = "sha256:00478ca80aeebeecb2f288d3206b0de568df5cd2b8fada1209843cc9a8d88a48"}, + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "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 (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "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)", "packaging", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shortuuid" @@ -2508,13 +2502,13 @@ sqlcipher = ["sqlcipher3-binary"] [[package]] name = "tldextract" -version = "3.5.0" +version = "3.6.0" description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." optional = false python-versions = ">=3.7" files = [ - {file = "tldextract-3.5.0-py3-none-any.whl", hash = "sha256:2cb271ca8d06ea1630a1361b58edad14e0cf81f34ce3c90b052854528fe2a281"}, - {file = "tldextract-3.5.0.tar.gz", hash = "sha256:4df1c65b95be61d59428e8611e955e54e6f1d4483d3e8d5733d3a9062155e910"}, + {file = "tldextract-3.6.0-py3-none-any.whl", hash = "sha256:30a492de80f4de215aa998588ba5c2e625ee74ace3a2705cfb52b0021053bcbe"}, + {file = "tldextract-3.6.0.tar.gz", hash = "sha256:a5d8b6583791daca268a7592ebcf764152fa49617983c49916ee9de99b366222"}, ] [package.dependencies] @@ -2672,13 +2666,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, ] [[package]] @@ -3001,17 +2995,17 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.16.2" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] @@ -3074,4 +3068,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "1c5a6b743330cf10ebe037b8c84924b4d229eed12a9bb92b3ebdeadde46cdf0a" +content-hash = "7dd07168495274eeefe0399bc1e07cd95cc062b8e5e51cb48f095edec17ba962" diff --git a/pyproject.toml b/pyproject.toml index 73a0b65e..88cceffe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ Flask = "^1.1.2" SQLAlchemy = "^1.3.20" dateparser = "^1.0.0" Flask-SQLAlchemy = "^2.4.4" -click = "8.1.3" +click = "^8.1.3" #Flask-MonitoringDashboard = "^3.1.0" Scrapy = "^2.4.1" requests = "^2.25.0" From 8ed840269c858a7007d8e49ef6c57813f1f432b9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 26 Sep 2023 23:18:04 +0000 Subject: [PATCH 226/301] cleaning up errors associated with #27 --- mnonboard/info_chx.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index b28c5184..2ce1694b 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -121,12 +121,12 @@ def valid_url_prefix(url, prefix, f): """ # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: - L.error('ORCiD number in "%s" field does not have the correct URL prefix. (URL: %s)' % (f, url)) - print('Please ensure the correct URL prefix (%s) preceeds the ORCiD number in field "%s"' % (ORCID_PREFIX, f)) + L.error('URL in "%s" field does not have the correct prefix. (prefix: %s; URL: %s)' % (f, prefix, url)) + print('Please ensure the correct URL prefix (%s) preceeds URL in field "%s" (currently: %s)' % (ORCID_PREFIX, f, prefix)) return False if url[-1] in '/': - L.error('ORCiD number in "%s" field has a trailing slash.') - print('Please remove the trailing slash (/) from the end of the ORCiD number in field "%s"' % f) + L.error('URL in "%s" field has a trailing slash.' % (f)) + print('Please remove the trailing slash (/) from the end of URL in field "%s"' % (f)) return False return True @@ -478,22 +478,23 @@ def input_test(fields): for f in test_fields: if fields[f] == '': raise ValueError('Value in field "%s" is an empty string.' % (f)) - if f in ['default_owner', 'default_submitter']: - # test orcid records while we're here + if f in ['node_id']: if valid_url_prefix(fields[f], NODE_ID_PREFIX, f): L.info('%s looks like a valid nodeid') # could test for uniqueness as well? - elif valid_url_prefix(fields[f], ORCID_PREFIX, f): - L.info('%s has a valid ORCiD url prefix') + if f in ['default_owner', 'default_submitter']: + # test orcid records while we're here + if valid_url_prefix(fields[f], ORCID_PREFIX, f): + L.info('%s has a valid ORCiD url prefix' % (fields[f])) if valid_orcid(fields[f].split('/')[-1]): - L.info('%s is a valid ORCiD') + L.info('%s is a valid ORCiD URL' % (fields[f])) else: raise ValueError('Invalid ORCiD number "%s" in field %s' % (fields[f], f)) else: raise ValueError('Invalid value "%s" in field %s (must either be ORCiD number or "urn:node:NODE_NAME")' % (fields[f], f)) except KeyError as e: L.error('No "%s" field found in json.' % f) - print('Please add the "%s" field to the json you loaded and re-run the script.') + print('Please add the "%s" field to the json you loaded and re-run the script.' % f) exit(1) except AssertionError as e: L.error('Invalid ORCiD number %s in field "%s"' % (fields[f], f)) @@ -512,8 +513,10 @@ def input_test(fields): raise ValueError('Value in field "%s > %s" is an empty string.' % (f, nf)) if 'contact_subject' in nf: # test orcid record - assert valid_url_prefix(fields[f][nf], ORCID_PREFIX, nf) - assert valid_orcid(fields[f][nf].split('/')[-1]), 'Invalid ORCiD number %s in field "%s > %s"' % (fields[f][nf], f, nf) + if not valid_url_prefix(fields[f][nf], ORCID_PREFIX, nf): + raise ValueError('Invalid ORCiD URL prefix "%s" in field %s (must be "%s")' % (fields[f][nf], nf, ORCID_PREFIX)) + if not valid_orcid(fields[f][nf].split('/')[-1]): + raise ValueError('Invalid ORCiD URL %s in field "%s > %s"' % (fields[f][nf], f, nf)) if 'node_id' in nf: # check that the node_id is valid and prompt user to change if it's not fields[f][nf] = enter_nodeid(id=fields[f][nf]) From 86c55ae48f96a6312c5cb5350bcee62b2f46c2d6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 26 Sep 2023 23:29:32 +0000 Subject: [PATCH 227/301] more cleaning up after #27 --- mnonboard/info_chx.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 2ce1694b..52645b56 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -74,13 +74,16 @@ def valid_orcid(orcid): return False try: # int exists in correct position, next test - int(orcid[i]) + if i > 18: + # last digit can be non-integer (like X) + int(orcid[i]) continue except ValueError as e: # fail (not an integer) #print('valueerror at %s' % i) L.warning('ORCiD number failed check (%s has no integer in position %s)' % (orcid, i+1)) return False + # future: maybe run checksum to truly validate against spec? # pass L.info('ORCiD number passed checks. (%s)' % orcid) return True @@ -485,9 +488,9 @@ def input_test(fields): if f in ['default_owner', 'default_submitter']: # test orcid records while we're here if valid_url_prefix(fields[f], ORCID_PREFIX, f): - L.info('%s has a valid ORCiD url prefix' % (fields[f])) + L.info('%s: %s has a valid ORCiD url prefix' % (f, fields[f])) if valid_orcid(fields[f].split('/')[-1]): - L.info('%s is a valid ORCiD URL' % (fields[f])) + L.info('%s: %s is a valid ORCiD URL' % (f, fields[f])) else: raise ValueError('Invalid ORCiD number "%s" in field %s' % (fields[f], f)) else: From 3c13edf469821f8d461f9fe7047d16a422085f6e Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 3 Oct 2023 16:01:49 +0000 Subject: [PATCH 228/301] fixing bug on ssh connection failure --- mnonboard/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 6d2ef906..1ead4893 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -325,6 +325,7 @@ def start_ssh(server: str, node_id): xml_dir = '~/d1_xml/%s' % (node_id) mkdir_cmd = 'mkdir -p %s' % (xml_dir) cd_cmd = 'cd %s' % xml_dir + op = 'connection to remote server' try: ssh = SSHClient() ssh.load_system_host_keys() From 0cb814e2f9ae38be29ae62862c9d5bd2df9d5759 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 3 Oct 2023 18:13:13 +0000 Subject: [PATCH 229/301] allow script to set D1_AUTH_TOKEN --- mnonboard/cli.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 1b09eb93..45a168ae 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -23,6 +23,7 @@ def run(cfg): if not cfg['token']: print('Your DataONE auth token is missing. Please enter it here and/or store it in the env variable "D1_AUTH_TOKEN".') cfg['token'] = info_chx.req_input('Please enter your DataONE authentication token: ') + os.environ['D1_AUTH_TOKEN'] = cfg['token'] DC = cn.init_client(cn_url=cfg['cn_url'], auth_token=cfg['token']) if cfg['info'] == 'user': # do the full user-driven info gathering process From 311bdba169fd8f18cae74c4bef8c93bbcde82c2b Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 16:02:03 +0000 Subject: [PATCH 230/301] adding changes to address #30 --- mnonboard/cli.py | 20 ++++++---- mnonboard/defs.py | 6 ++- mnonboard/utils.py | 99 ++++++++++++++++++++++++++++++++++------------ 3 files changed, 91 insertions(+), 34 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 45a168ae..974c6e69 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -24,6 +24,7 @@ def run(cfg): print('Your DataONE auth token is missing. Please enter it here and/or store it in the env variable "D1_AUTH_TOKEN".') cfg['token'] = info_chx.req_input('Please enter your DataONE authentication token: ') os.environ['D1_AUTH_TOKEN'] = cfg['token'] + cfg['cert_loc'] = CN_CERT_LOC[cfg['mode']] DC = cn.init_client(cn_url=cfg['cn_url'], auth_token=cfg['token']) if cfg['info'] == 'user': # do the full user-driven info gathering process @@ -67,18 +68,21 @@ def run(cfg): # create xml to upload for validation (step 15) files = utils.create_names_xml(loc, node_id=fields['node']['node_id'], names=names) # uploading xml (proceed to step 14 and ssh to find xml in ~/d1_xml) - ssh, work_dir, node_id = utils.start_ssh(server=cfg['cn_url'], node_id=fields['node']['node_id']) + ssh, work_dir, node_id = utils.start_ssh(server=cfg['cn_url'], + node_id=fields['node']['node_id'], + loc=loc, + ssh=cfg['ssh']) time.sleep(0.5) - utils.upload_xml(ssh=ssh, files=files, target_dir=work_dir) + utils.upload_xml(ssh=ssh, server=SO_SRVR[cfg['mode']], files=files, node_id=node_id, loc=loc) # create and validate the subject in the accounts service (step 16) - utils.create_subj_in_acct_svc(ssh=ssh, cert=CN_CERT_LOC, files=files, cn=cfg['cn_url']) - utils.validate_subj_in_acct_svc(ssh=ssh, cert=CN_CERT_LOC, names=names, cn=cfg['cn_url']) + utils.create_subj_in_acct_svc(ssh=ssh, cert=cfg['cert_loc'], files=files, cn=cfg['cn_url'], loc=loc) + utils.validate_subj_in_acct_svc(ssh=ssh, cert=cfg['cert_loc'], names=names, cn=cfg['cn_url'], loc=loc) # download the node capabilities and register the node - node_filename = utils.dl_node_capabilities(ssh=ssh, baseurl=SO_SRVR[cfg['mode']], node_dir=work_dir, node_id=node_id) - utils.register_node(ssh=ssh, cert=CN_CERT_LOC, node_filename=node_filename, cn=cfg['cn_url']) - #utils.approve_node(ssh=ssh, script_loc=APPROVE_SCRIPT_LOC) + node_filename = utils.dl_node_capabilities(ssh=ssh, baseurl=SO_SRVR[cfg['mode']], node_dir=work_dir, node_id=node_id, loc=loc) + utils.register_node(ssh=ssh, cert=cfg['cert_loc'], node_filename=node_filename, cn=cfg['cn_url'], loc=loc) + utils.approve_node(ssh=ssh, script_loc=APPROVE_SCRIPT_LOC, loc=loc) # close connection - ssh.close() + ssh.close() if ssh else None def main(): """ diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 8cfde4e1..ff7204ee 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -12,6 +12,7 @@ 'token': None, 'check_files': 5, 'local': False, + 'ssh': False, } SO_SRVR = { @@ -25,7 +26,10 @@ CN_SRVR_BASEURL = 'https://%s/cn' -CN_CERT_LOC = '/etc/dataone/client/private/urn_node_cnStageUCSB1.pem' +CN_CERT_LOC = { + 'production': '/etc/dataone/client/private/urn_node_UCSB1.pem', + 'testing': '/etc/dataone/client/private/urn_node_cnStageUCSB1.pem' +} APPROVE_SCRIPT_LOC = '/usr/local/bin/dataone-approve-node' HELP_TEXT = """DataONE member node onboard script diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 1ead4893..7f8a6092 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -317,93 +317,142 @@ def create_names_xml(loc, node_id, names): files.append(fn) return files -def start_ssh(server: str, node_id): +def write_cmd_to(fn, cmd, desc=None, mode='a'): + """ + """ + desc = f"# {desc}\n" if desc else "" + with open(fn, mode) as f: + f.write(f"{desc}{cmd}\n") + +def start_ssh(server: str, node_id, loc: str, ssh: bool=True): """ """ server = server.split('https://')[1].split('/')[0] node_id = node_id.split(':')[-1] xml_dir = '~/d1_xml/%s' % (node_id) + local_xml_dir = f'{loc}/xml' mkdir_cmd = 'mkdir -p %s' % (xml_dir) cd_cmd = 'cd %s' % xml_dir - op = 'connection to remote server' + op = f'connection to {server}' + if not ssh: + return None, local_xml_dir, node_id try: ssh = SSHClient() ssh.load_system_host_keys() ssh.connect(server) L.info('Running "%s" on %s' % (mkdir_cmd, server)) - op = 'mkdir on remote server' + op = f'mkdir on {server}' ssh.exec_command(mkdir_cmd) L.info('Running "%s" on %s' % (cd_cmd, server)) - op = 'cd on remote server' + op = f'cd on {server}' ssh.exec_command(cd_cmd) return ssh, xml_dir, node_id except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) - exit(1) + return None, local_xml_dir, node_id -def upload_xml(ssh: SSHClient, files: list, target_dir: str): +def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, server: str=None): """ Format subject XML documents and return list of names. + cmd_fn = f"{loc}/commands.sh" Args: files (list): List of files to upload. """ op = '' + target_dir = f'~/d1_xml/{node_id}/' try: op = 'mkdir on remote server' - with SCPClient(ssh.get_transport()) as scp: - op = 'scp to remote server' - L.info('Copying files to remote %s : %s' % (target_dir, files)) - scp.put(files=files, remote_path=target_dir) + if ssh: + with SCPClient(ssh.get_transport()) as scp: + op = 'scp to remote server' + L.info('Copying files to remote %s : %s' % (target_dir, files)) + scp.put(files=files, remote_path=target_dir) + else: + cmd_fn = f"{loc}/commands.sh" + write_cmd_to(fn=cmd_fn, cmd=f'mkdir -p {target_dir}', desc='# Copy xml files from so server to cn', mode='w') + write_cmd_to(fn=cmd_fn, cmd=f'cd {target_dir}') + for f in files: + command = f"scp {server}:{f} {target_dir}" + write_cmd_to(fn=cmd_fn, cmd=command) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) exit(1) -def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str): +def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str, loc: str): """ """ + cmd_fn = f"{loc}/commands.sh" for f in files: f = os.path.split(f)[1] command = 'sudo curl -s --cert %s -F person=@%s -X POST %s/v2/accounts' % ( cert, f, cn ) - L.info('Creating subject: %s' % (command)) - ssh.exec_command(command) + if ssh: + L.info('Creating subject: %s' % (command)) + ssh.exec_command(command) + else: + L.debug(f'Command: {command}') + L.info(f'Writing cmd to {cmd_fn}: subject creation') + write_cmd_to(fn=cmd_fn, cmd=command, desc=f"Create subject: {f}") -def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str): +def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str, loc: str): """ """ + cmd_fn = f"{loc}/commands.sh" for n in names: orcid_urlenc = urlparse.quote(n, safe='-') command = 'sudo curl -s --cert %s -X PUT %s/v2/accounts/verification/%s' % ( cert, cn, orcid_urlenc ) - L.info('Validating subject: %s' % (command)) - ssh.exec_command(command) + if ssh: + L.info('Validating subject: %s' % (command)) + ssh.exec_command(command) + else: + L.debug(f'Command: {command}') + L.info(f'Writing cmd to {cmd_fn}: subject validation') + write_cmd_to(fn=cmd_fn, cmd=command, desc=f"Validate subject: {n}") -def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_dir: str, node_id: str): +def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_dir: str, node_id: str, loc: str): """ """ + cmd_fn = f"{loc}/commands.sh" node_filename = '%s/%s-node.xml' % (node_dir, node_id) command = 'sudo curl "https://%s/%s/v2/node" > %s' % (baseurl, node_id, node_filename) - L.info('Downloading node capabilities: %s' % (command)) - ssh.exec_command(command) + if ssh: + L.info('Downloading node capabilities: %s' % (command)) + ssh.exec_command(command) + else: + L.info(f'Writing cmd to {cmd_fn}: node capabilities') + L.debug(f'Command: {command}') + write_cmd_to(fn=cmd_fn, cmd=command, desc=f"Download {node_id} node capabilities") return node_filename -def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str): +def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str, loc: str): """ """ + cmd_fn = f"{loc}/commands.sh" node_filename = os.path.split(node_filename)[1] mn = node_filename.split('-')[0] command = """sudo curl --cert %s -X POST -F 'node=@%s' "%s/v2/node" """ % ( cert, node_filename, cn ) - L.info('Registering node: %s' % (command)) - ssh.exec_command(command) + if ssh: + L.info('Registering node: %s' % (command)) + ssh.exec_command(command) + else: + L.info(f'Writing cmd to {cmd_fn}: node registration') + L.debug(f'Command: {command}') + write_cmd_to(fn=cmd_fn, cmd=command, desc=f"Register {node_filename} with CN") -def approve_node(ssh: SSHClient, script_loc: str): +def approve_node(ssh: SSHClient, script_loc: str, loc: str): """ """ + cmd_fn = f"{loc}/commands.sh" command = 'sudo %s' % (script_loc) - L.info('Starting approval script: %s' % (command)) - ssh.exec_command(command) + if ssh: + L.info('Starting approval script: %s' % (command)) + ssh.exec_command(command) + else: + L.info(f'Writing to {cmd_fn}: node approval') + write_cmd_to(fn=cmd_fn, cmd=command, desc="Approve node with CN (interactive script)") From 97fee60e3bb055ab59cba6f2168bb15d0022c194 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 16:02:21 +0000 Subject: [PATCH 231/301] updating post-report message --- mnonboard/data_chx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index b00bfb45..15501c12 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -216,5 +216,5 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): violation_report(viol_dict, loc) # close the opersist instance op.close() - msg = f"{tot_violations} violations found (out of {i} checked; with {load_errs} load/decode errors). Continue?" + msg = f"{valid_files} fully valid records found (out of {i} checked; with {load_errs} load/decode errors). Continue?" ask_continue(msg) From 6a0f3ac75167b40d4957eefbfc02a491021fd6c0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 16:03:48 +0000 Subject: [PATCH 232/301] simplifying continue loop ue --- mnonboard/utils.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 7f8a6092..f526e81b 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -268,11 +268,14 @@ def ask_continue(msg: str): :param str msg: The message to display at the prompt. """ while True: - i = input(msg + ' (y/n) ') - if i.lower() in 'n': - exit(1) - elif i.lower() in 'y': + i = input(msg + ' (Y/n) ') + if i.lower() in 'y': + # this also implicitly matches an empty string (i.e. user presses enter) + L.info('Continuing.') break + elif (i.lower() in 'n'): + L.info('Exiting.') + exit(1) else: L.info('User has not entered "y" or "n".') print('You have entered an incorrect value. Please enter "y" to continue or "n" to quit.') From 83aefdbd041823a4f4edb1edd52d3a7e5fe96059 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 16:11:06 +0000 Subject: [PATCH 233/301] correction for #30 --- mnonboard/defs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index ff7204ee..149cbfed 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -27,7 +27,7 @@ CN_SRVR_BASEURL = 'https://%s/cn' CN_CERT_LOC = { - 'production': '/etc/dataone/client/private/urn_node_UCSB1.pem', + 'production': '/etc/dataone/client/private/urn_node_CNUCSB1.pem', 'testing': '/etc/dataone/client/private/urn_node_cnStageUCSB1.pem' } APPROVE_SCRIPT_LOC = '/usr/local/bin/dataone-approve-node' From e8dc48b2658fe51267942535c51952c8fc4c7ef7 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 19:27:33 +0000 Subject: [PATCH 234/301] fixing node doc download for #30 --- mnonboard/cli.py | 2 +- mnonboard/utils.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 974c6e69..e36a0a6f 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -78,7 +78,7 @@ def run(cfg): utils.create_subj_in_acct_svc(ssh=ssh, cert=cfg['cert_loc'], files=files, cn=cfg['cn_url'], loc=loc) utils.validate_subj_in_acct_svc(ssh=ssh, cert=cfg['cert_loc'], names=names, cn=cfg['cn_url'], loc=loc) # download the node capabilities and register the node - node_filename = utils.dl_node_capabilities(ssh=ssh, baseurl=SO_SRVR[cfg['mode']], node_dir=work_dir, node_id=node_id, loc=loc) + node_filename = utils.dl_node_capabilities(ssh=ssh, baseurl=SO_SRVR[cfg['mode']], node_id=node_id, loc=loc) utils.register_node(ssh=ssh, cert=cfg['cert_loc'], node_filename=node_filename, cn=cfg['cn_url'], loc=loc) utils.approve_node(ssh=ssh, script_loc=APPROVE_SCRIPT_LOC, loc=loc) # close connection diff --git a/mnonboard/utils.py b/mnonboard/utils.py index f526e81b..8c472cee 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -416,11 +416,12 @@ def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str, l L.info(f'Writing cmd to {cmd_fn}: subject validation') write_cmd_to(fn=cmd_fn, cmd=command, desc=f"Validate subject: {n}") -def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_dir: str, node_id: str, loc: str): +def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_id: str, loc: str): """ """ cmd_fn = f"{loc}/commands.sh" - node_filename = '%s/%s-node.xml' % (node_dir, node_id) + target_dir = f'~/d1_xml/{node_id}' + node_filename = '%s/%s-node.xml' % (target_dir, node_id) command = 'sudo curl "https://%s/%s/v2/node" > %s' % (baseurl, node_id, node_filename) if ssh: L.info('Downloading node capabilities: %s' % (command)) From 7e5d78b19e4f4e497fd6dab1f2250e61f1ea1ccf Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 19:38:36 +0000 Subject: [PATCH 235/301] removing extra hash in first comment #30 --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 8c472cee..4be2c02a 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -373,7 +373,7 @@ def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, server: str= scp.put(files=files, remote_path=target_dir) else: cmd_fn = f"{loc}/commands.sh" - write_cmd_to(fn=cmd_fn, cmd=f'mkdir -p {target_dir}', desc='# Copy xml files from so server to cn', mode='w') + write_cmd_to(fn=cmd_fn, cmd=f'mkdir -p {target_dir}', desc='Copy xml files from so server to cn', mode='w') write_cmd_to(fn=cmd_fn, cmd=f'cd {target_dir}') for f in files: command = f"scp {server}:{f} {target_dir}" From 570becd2fb0072b015e42c2c883593848bf0c388 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 20:17:20 +0000 Subject: [PATCH 236/301] adding mnlite user to scp command #30 --- mnonboard/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 4be2c02a..dd1c5f8d 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -376,7 +376,7 @@ def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, server: str= write_cmd_to(fn=cmd_fn, cmd=f'mkdir -p {target_dir}', desc='Copy xml files from so server to cn', mode='w') write_cmd_to(fn=cmd_fn, cmd=f'cd {target_dir}') for f in files: - command = f"scp {server}:{f} {target_dir}" + command = f"scp mnlite@{server}:{f} {target_dir}" write_cmd_to(fn=cmd_fn, cmd=command) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) From 61ab4a7b6e1316434782ea85ea028bc5234be354 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 4 Oct 2023 21:30:56 +0000 Subject: [PATCH 237/301] bumping version in prep for merging #17 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 88cceffe..dd7c5e10 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mnlite" -version = "0.1.0" +version = "0.1.1" description = "Light weight read-only DataONE member node in Python Flask" authors = ["datadavev "] license = "Apache 2.0" From 096356039aaa1c63f620f7707e5ae66598f72669 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 5 Oct 2023 20:08:51 +0000 Subject: [PATCH 238/301] addressing #33 --- mnonboard/defs.py | 3 ++- mnonboard/info_chx.py | 30 +++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 149cbfed..60567424 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -2,7 +2,8 @@ ORCID_PREFIX = 'http://orcid.org/' SHACL_URL = 'https://raw.githubusercontent.com/ESIPFed/science-on-schema.org/master/validation/shapegraphs/soso_common_v1.2.3.ttl' -NODE_ID_PREFIX = 'urn:node:' +NODE_ID_PREFIX = 'CN=urn:node:' +NODE_ID_POSTFIX = ',DC=dataone,DC=org' CFG = { 'info': 'user', diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 52645b56..2f8cc5a7 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -2,7 +2,7 @@ from d1_common.types import exceptions from os import environ -from mnonboard.defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX +from mnonboard.defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX, NODE_ID_POSTFIX from mnonboard import default_json, L from opersist.utils import JSON_TIME_FORMAT, dtnow from opersist.cli import getOpersistInstance @@ -331,7 +331,7 @@ def enter_orcid(prompt): def valid_nodeid(node_id): """ - Make sure the node_id contains the correct prefix. + Make sure the node_id contains the correct format. Args: node_id (str): Member node unique id. @@ -340,8 +340,28 @@ def valid_nodeid(node_id): (bool): Whether or not the node_id is valid. """ if NODE_ID_PREFIX in node_id: - # if valid, return - return True + if NODE_ID_POSTFIX in node_id: + # if valid, return + return True + else: + # if invalid, ask user if they meant to do that + L.warning('Entered node_id does not contain the "%s" postfix. Entry: "%s"' % (NODE_ID_POSTFIX, node_id)) + while True: + # prompt loop + c = input('node_id usually contains the postfix "%s" but the entered one (%s) does not.\n\ + The subject should look like this: CN=urn:node:KNB,DC=dataone,DC=org\n\ + This could have *serious* downstream consequences!\n\ + Do you wish to modify the node_id entry to fit the standard?\n\ + Please answer "yes" or "no" (yes is default): ' % (NODE_ID_POSTFIX, node_id)) + if c.lower() == 'no': + L.warning('User has chosen to continue with node_id entry of %s' % (node_id)) + return True + elif (c.lower() == 'yes') or (c.lower() == ''): + L.info('User has chosen to re-enter node_id. Entry: "%s"' % (c)) + return False + else: + L.info('User has entered something other than "yes", "", or "no" and will be prompted again. Entry: "%s"' % (c)) + pass else: # if invalid, ask user if they meant to do that L.warning('Entered node_id does not contain the "%s" prefix. Entry: "%s"' % (NODE_ID_PREFIX, node_id)) @@ -353,7 +373,7 @@ def valid_nodeid(node_id): Please answer "yes" or "no" (yes is default): ' % (NODE_ID_PREFIX, node_id)) if c.lower() == 'no': L.warning('User has chosen to continue with node_id entry of %s' % (node_id)) - return True + break elif (c.lower() == 'yes') or (c.lower() == ''): L.info('User has chosen to re-enter node_id. Entry: "%s"' % (c)) return False From 86d8e6b7fc11282cf53b3d3886776e217b91f2a5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 6 Oct 2023 19:54:58 +0000 Subject: [PATCH 239/301] removing `sudo` from `curl` commands --- mnonboard/utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index dd1c5f8d..3b6cc603 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -388,7 +388,7 @@ def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str, loc cmd_fn = f"{loc}/commands.sh" for f in files: f = os.path.split(f)[1] - command = 'sudo curl -s --cert %s -F person=@%s -X POST %s/v2/accounts' % ( + command = 'curl -s --cert %s -F person=@%s -X POST %s/v2/accounts' % ( cert, f, cn ) if ssh: @@ -405,7 +405,7 @@ def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str, l cmd_fn = f"{loc}/commands.sh" for n in names: orcid_urlenc = urlparse.quote(n, safe='-') - command = 'sudo curl -s --cert %s -X PUT %s/v2/accounts/verification/%s' % ( + command = 'curl -s --cert %s -X PUT %s/v2/accounts/verification/%s' % ( cert, cn, orcid_urlenc ) if ssh: @@ -422,7 +422,7 @@ def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_id: str, loc: str): cmd_fn = f"{loc}/commands.sh" target_dir = f'~/d1_xml/{node_id}' node_filename = '%s/%s-node.xml' % (target_dir, node_id) - command = 'sudo curl "https://%s/%s/v2/node" > %s' % (baseurl, node_id, node_filename) + command = 'curl "https://%s/%s/v2/node" > %s' % (baseurl, node_id, node_filename) if ssh: L.info('Downloading node capabilities: %s' % (command)) ssh.exec_command(command) @@ -438,7 +438,7 @@ def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str, loc: s cmd_fn = f"{loc}/commands.sh" node_filename = os.path.split(node_filename)[1] mn = node_filename.split('-')[0] - command = """sudo curl --cert %s -X POST -F 'node=@%s' "%s/v2/node" """ % ( + command = """curl --cert %s -X POST -F 'node=@%s' "%s/v2/node" """ % ( cert, node_filename, cn ) if ssh: From ae560498f0738579a4b5901d34037ca1121a1840 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 6 Oct 2023 21:21:50 +0000 Subject: [PATCH 240/301] starting #32 --- mnonboard/utils.py | 110 ++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 62 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 3b6cc603..82b345ac 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -11,15 +11,13 @@ from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name, set_role -def load_json(loc): +def load_json(loc: str): """ Load json from file. - Args: - loc (str): File location of the json file to be loaded. - - Returns: - j (str): Serialized json file contents. + :param str loc: File location of the json file to be loaded + :returns: Serialized json file contents + :rtype: dict """ L.info('Loading member node json from %s' % loc) try: @@ -34,16 +32,12 @@ def load_json(loc): L.error('Error: %s' % e) exit(1) -def save_json(loc, jf): +def save_json(loc: str, jf: dict): """ Output json to file. - Args: - loc (str): File location where the json file is to be written. - jf (dict): Dictionary to be written as json. - - Returns: - (No variable is returned) + :param str loc: File location where the json file is to be written. + :param dict jf: Dictionary to be written as json. """ L.info('Writing member node json to %s' % loc) try: @@ -58,14 +52,13 @@ def save_json(loc, jf): L.error('Error: %s' % e) exit(1) -def save_report(rep_str, loc, format='.csv'): +def save_report(rep_str: str, loc: str, format: str='.csv'): """ Output a validation report for a set of metadata. - Args: - rep_str (str): Report string to be written. - loc (str): File location where the report file is to be written. - jf (dict): File extension (default: .csv). + :param str rep_str: Report string to be written. + :param str loc: File location where the report file is to be written. + :param str jf: File extension (default: .csv). """ fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) L.info('Writing report to %s' % (fn)) @@ -77,33 +70,29 @@ def dumps_json(js): """ Quick and dirty way to output formatted json. - Args: - js (dict): Dictionary to be written as json. + :param dict js: Dictionary to be written as json. """ print(json.dumps(js, indent=2)) -def node_path(nodepath=NODE_PATH_REL, curpath=CUR_PATH_ABS, nodedir=''): +def node_path(nodepath: str=NODE_PATH_REL, curpath: str=CUR_PATH_ABS, nodedir: str=''): """ Get the absolute path of the nodes directory where new members will go. Currently the nodes directory lives at `../instance/nodes/` (relative to the mnonboard dir that this file is in). - Args: - nodepath (str): Location of the nodes directory relative to the project directory (default: 'instance/nodes/'). - curpath (str): Current absolute path of this function (default: os.path.dirname(os.path.abspath(__file__))). - nodedir (str): Name of the node directory (example: 'HAKAI_IYS'; default: '') - - Returns: - (str): Absolute path of the node directory + :param str nodepath: Location of the nodes directory relative to the project directory (default: 'instance/nodes/'). + :param str curpath: Current absolute path of this function (default: os.path.dirname(os.path.abspath(__file__))). + :param str nodedir: Name of the node directory (example: 'HAKAI_IYS'; default: '') + :returns: Absolute path of the node directory + :rtype: str """ return os.path.abspath(os.path.join(curpath, '../', nodepath, nodedir)) -def init_repo(loc): +def init_repo(loc: str): ''' Initialize a new instance using opersist. - Args: - loc (str): Location of the member node directory in which to initialize an opersist instance. + :param str loc: Location of the member node directory in which to initialize an opersist instance. ''' try: L.info('Using opersist to init new member node folder: %s' % loc) @@ -114,14 +103,13 @@ def init_repo(loc): L.error('opersist init command failed (node folder: %s): %s' % (loc, e)) exit(1) -def new_subj(loc, name, value): +def new_subj(loc: str, name: str, value: str): """ Create new subject in the database using opersist. - Args: - loc (str): Location of the opersist instance. - name (str): Subject name (human readable). - value (str): Subject value (unique subject id, such as orcid or member node id). + :param str loc: Location of the opersist instance. + :param str name: Subject name (human readable). + :param str value: Subject value (unique subject id, such as orcid or member node id). """ try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) @@ -135,18 +123,18 @@ def new_subj(loc, name, value): L.error('opersist subject creation command failed for %s (%s): %s' % (name, value, e)) exit(1) -def get_or_create_subj(loc, value, cn_url, title='unspecified subject', name=None): +def get_or_create_subj(loc: str, value: str, cn_url: str, title: str='unspecified subject', name: str=None): """ Get an existing subject using their ORCiD or create a new one with the specified values. Search is conducted first at the given coordinating node URL, then locally. If no subject is found, a new record is created in the local opersist instance. - Args: - loc (str): Location of the opersist instance. - value (str): Subject value (unique subject id, such as orcid or member node id). - cn_url (str): The base URL of the rest API with which to search for the given subject. - title (str): The subject's role in relation to the database. - name (str or bool): Subject name (human readable). + :param str loc: Location of the opersist instance. + :param str value: Subject value (unique subject id, such as orcid or member node id). + :param str cn_url: The base URL of the rest API with which to search for the given subject. + :param str title: The subject's role in relation to the database. + :param name: Subject name (human readable). + :type name: str or None """ if name: # we are probably creating a node record @@ -171,8 +159,8 @@ def set_schedule(): Ask the user what schedule on which they would like to run scrapes. Options are: monthly, daily, and every 3 minutes. - Returns: - (dict): Dictionary entry formatted based on the chosen schedule option. + :returns: Dictionary entry formatted based on the chosen schedule option. + :rtype: dict """ s = enter_schedule() return SCHEDULES[s] @@ -209,11 +197,12 @@ def restart_mnlite(): print('You have selected an invalid option.') -def harvest_data(loc, mn_name): +def harvest_data(loc: str, mn_name: str): """ - Args: - loc (str): Location of the opersist instance. - mn_name (str): Name of the member node (used to name the crawl log). + Use scrapy to harvest data to the specified path, and output a log to the specified location. + + :param str loc: Location of the opersist instance. + :param str mn_name: Name of the member node (used to name the crawl log). """ log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) @@ -227,18 +216,16 @@ def harvest_data(loc, mn_name): except Exception as e: L.error('Error running scrapy: %s' % e) -def limit_tests(num_things): +def limit_tests(num_things: int): """ Ask the user to limit the number of tests to run on a given set of metadata. This will execute if the user decides to try and test more than 500 metadata objects. The prompt will ask them if they wish to limit the number, then return a number based on their decision. - Args: - num_things (int): Initial number of things to test. - - Returns: - num_things (int): Modified number of things to test. + :param int num_things: Initial number of things to test. + :returns: Modified number of things to test. + :rtype: int """ while True: i = input('Testing more than 500 objects is not recommended due to performance concerns.\n\ @@ -281,17 +268,16 @@ def ask_continue(msg: str): print('You have entered an incorrect value. Please enter "y" to continue or "n" to quit.') continue -def create_names_xml(loc, node_id, names): +def create_names_xml(loc: str, node_id: str, names: dict): """ Format subject XML documents and return list of names. - Args: - loc (str): Location (dir) to write file to. - node_id (str): Node id of current MN. - names (dict): Dict of subject names with ORCiD as index. + :param str loc: Location (dir) to write file to. + :param str node_id: Node id of current MN. + :param dict names: Dict of subject names with ORCiD as index. - Returns: - files (list): List of files written. + :returns: List of files written. + :rtype: list """ # make dir loc = os.path.join(loc, 'xml') From f040c0b6bc7c0f801c61d83c2a070283aa73c0a5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 12 Oct 2023 22:59:29 +0000 Subject: [PATCH 241/301] work on #32 --- mnlite/mnode.py | 5 +++++ mnonboard/defs.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/mnlite/mnode.py b/mnlite/mnode.py index 91db18ba..ddf2004c 100644 --- a/mnlite/mnode.py +++ b/mnlite/mnode.py @@ -45,6 +45,11 @@ ] } } +""" +Default node configuration dictionary. Defines the node document upon loading +into mnlite system service (see eg: the +`OpenTopography node document `_) +""" def getMNodeNameFromRequest(): diff --git a/mnonboard/defs.py b/mnonboard/defs.py index 60567424..a8923cbb 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -15,23 +15,52 @@ 'local': False, 'ssh': False, } +""" +Config dictionary. + +``'info'`` - Where the script gets data from. ``'json'`` for loaded node document or ``'user'`` for user-entered. Default: ``'user'`` +``'json_file'`` - JSON file to load, usually at ``../instance/nodes//node.json``. See :py:data:`mnlite.mnode.DEFAULT_NODE_CONFIG`. Default: ``node.json`` +``'cn_url'`` - The URL of the coordinating node. Defined by ``'mode'``. Default: ``'https://cn-stage.test.dataone.org/cn'`` +``'mode'`` - The environment to run in: ``'production'`` or default ``'testing'`` +``'token'`` - The DataONE auth token. Can be loaded from ``https://search.dataone.org/profile/http://orcid.org//s=settings/s=token`` in production +``'check_files'`` - How many schema.org records to check. Default: ``5`` +``'local'`` - If ``True``, run locally (do not run the scraper to harvest from the remote sitemap) +``'ssh'`` - If ``True``, run registration commands on the CN after checking schema.org records. Only works in ``'mode': 'testing'``. Otherwise, output a file with a list of commands to run to register the node on the CN. +""" SO_SRVR = { 'production': 'sonode.dataone.org', 'testing': 'so.test.dataone.org' } +""" +The location of the mnlite instance serving schema.org metadata. +""" CN_SRVR = { 'production': 'cn.dataone.org', 'testing': 'cn-stage.test.dataone.org' } +""" +The location of the coordinating node. +""" CN_SRVR_BASEURL = 'https://%s/cn' +""" +The URL format of the CN API. +Populated with one of the servers defined in :py:data:`mnonboard.defs.CN_SRVR`. +""" CN_CERT_LOC = { 'production': '/etc/dataone/client/private/urn_node_CNUCSB1.pem', 'testing': '/etc/dataone/client/private/urn_node_cnStageUCSB1.pem' } +""" +The location of the CN cert, used for registration. +""" + APPROVE_SCRIPT_LOC = '/usr/local/bin/dataone-approve-node' +""" +The location of the Hazelcast node approval script. +""" HELP_TEXT = """DataONE member node onboard script %s NCEAS/Ian Nesbitt @@ -54,6 +83,11 @@ run this script in local mode (will not scrape the remote site for new metadata) } """ % __version__ +""" +Help text for command line use. + +.. warning:: Soon to be deprecated in favor of using ``argparse``. +""" FIELDS = { 'node': { From b8c3ae462a66805f4e29cb5c5ff2772c1461aa8f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 13 Oct 2023 19:49:26 +0000 Subject: [PATCH 242/301] continuing to address #33 --- mnonboard/cli.py | 2 +- mnonboard/defs.py | 5 ++-- mnonboard/info_chx.py | 64 +++++++++++++++++++++++-------------------- mnonboard/utils.py | 7 +++-- 4 files changed, 43 insertions(+), 35 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index e36a0a6f..81f9f1b9 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -36,7 +36,7 @@ def run(cfg): info_chx.input_test(fields) # still need to ask the user for some names # now we're cooking - # get the node path using the end of the path in the 'subject' field (differs from operation.md documentation) + # get the node path using the end of the path in the 'node_id' field end_node_subj = fields['node']['node_id'].split(':')[-1] loc = utils.node_path(nodedir=end_node_subj) # initialize a repository there (step 5) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index a8923cbb..fde450e0 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -2,8 +2,9 @@ ORCID_PREFIX = 'http://orcid.org/' SHACL_URL = 'https://raw.githubusercontent.com/ESIPFed/science-on-schema.org/master/validation/shapegraphs/soso_common_v1.2.3.ttl' -NODE_ID_PREFIX = 'CN=urn:node:' -NODE_ID_POSTFIX = ',DC=dataone,DC=org' +NODE_ID_PREFIX = 'urn:node:' +SUBJECT_PREFIX = 'CN=' +SUBJECT_POSTFIX = ',DC=dataone,DC=org' CFG = { 'info': 'user', diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 2f8cc5a7..6865b585 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -2,7 +2,7 @@ from d1_common.types import exceptions from os import environ -from mnonboard.defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX, NODE_ID_POSTFIX +from mnonboard.defs import FIELDS, SITEMAP_URLS, ORCID_PREFIX, SCHEDULES, NODE_ID_PREFIX, SUBJECT_PREFIX, SUBJECT_POSTFIX from mnonboard import default_json, L from opersist.utils import JSON_TIME_FORMAT, dtnow from opersist.cli import getOpersistInstance @@ -46,12 +46,14 @@ def valid_orcid(orcid): """ Checks the validity of an ORCiD number. - ORCiDs have 4 groupings of 4 of integers separated by dashes (-) - for a total of 19 characters, thus `0000-0000-0000-0000` is valid - but `0000-0000-00000-000` and `0000-0000-0000-000` are not. + ORCiDs have 4 groupings of 4 of alphanumerics separated by dashes (-) + for a total of 19 characters, thus ``0000-0000-0000-0000`` is valid + but ``0000-0000-00000-000`` and ``0000-0000-0000-000`` are not. + Also, the last character is a checksum and can be ``X`` but we do not + validate that yet. - This seems like overkill but is probably good to have since it will be - used to store contacts for database upkeep/maintenance. + This seems like overkill but is probably good to have a simple check + since it will be used to store contacts for database upkeep/maintenance. Args: orcid (str): The orcid number. @@ -329,53 +331,51 @@ def enter_orcid(prompt): L.warning("Invalid ORCiD number entered: %s" % o) print('Please enter a valid ORCiD number (ex: 0000-0000-0000-0000).') -def valid_nodeid(node_id): +def valid_format(test_value: str, prefix: str='', postfix: str=''): """ Make sure the node_id contains the correct format. - Args: - node_id (str): Member node unique id. - - Returns: - (bool): Whether or not the node_id is valid. + :param str test_value: String to test against, for example ``node_id`` or ``subject``. + :returns: Whether or not the node_id is valid. + :rtype: bool """ - if NODE_ID_PREFIX in node_id: - if NODE_ID_POSTFIX in node_id: + if prefix in test_value: + if postfix in test_value: # if valid, return return True else: # if invalid, ask user if they meant to do that - L.warning('Entered node_id does not contain the "%s" postfix. Entry: "%s"' % (NODE_ID_POSTFIX, node_id)) + L.warning('Entered test value does not contain the "%s" postfix. Entry: "%s"' % (postfix, test_value)) while True: # prompt loop - c = input('node_id usually contains the postfix "%s" but the entered one (%s) does not.\n\ + c = input('This field usually contains the postfix "%s" but the entered one (%s) does not.\n\ The subject should look like this: CN=urn:node:KNB,DC=dataone,DC=org\n\ This could have *serious* downstream consequences!\n\ - Do you wish to modify the node_id entry to fit the standard?\n\ - Please answer "yes" or "no" (yes is default): ' % (NODE_ID_POSTFIX, node_id)) + Do you wish to modify the entry to fit the standard?\n\ + Please answer "yes" or "no" (yes is default): ' % (postfix, test_value)) if c.lower() == 'no': - L.warning('User has chosen to continue with node_id entry of %s' % (node_id)) + L.warning('User has chosen to continue with entry of %s' % (test_value)) return True elif (c.lower() == 'yes') or (c.lower() == ''): - L.info('User has chosen to re-enter node_id. Entry: "%s"' % (c)) + L.info('User has chosen to re-enter test_value. Entry: "%s"' % (c)) return False else: L.info('User has entered something other than "yes", "", or "no" and will be prompted again. Entry: "%s"' % (c)) pass else: # if invalid, ask user if they meant to do that - L.warning('Entered node_id does not contain the "%s" prefix. Entry: "%s"' % (NODE_ID_PREFIX, node_id)) + L.warning('Entered test_value does not contain the "%s" prefix. Entry: "%s"' % (prefix, test_value)) while True: # prompt loop - c = input('node_id usually contains the prefix "%s" but the entered one (%s) does not.\n\ + c = input('test_value usually contains the prefix "%s" but the entered one (%s) does not.\n\ This could have *serious* downstream consequences!\n\ - Do you wish to modify the node_id entry to fit the standard?\n\ - Please answer "yes" or "no" (yes is default): ' % (NODE_ID_PREFIX, node_id)) + Do you wish to modify the test_value entry to fit the standard?\n\ + Please answer "yes" or "no" (yes is default): ' % (prefix, test_value)) if c.lower() == 'no': - L.warning('User has chosen to continue with node_id entry of %s' % (node_id)) - break + L.warning('User has chosen to continue with test_value entry of %s' % (test_value)) + return True elif (c.lower() == 'yes') or (c.lower() == ''): - L.info('User has chosen to re-enter node_id. Entry: "%s"' % (c)) + L.info('User has chosen to re-enter test_value. Entry: "%s"' % (c)) return False else: L.info('User has entered something other than "yes", "", or "no" and will be prompted again. Entry: "%s"' % (c)) @@ -400,7 +400,7 @@ def enter_nodeid(prompt='Unique node_id: ', id=False): print('Please ensure that the node_id is unique from that of all other member nodes!') id = req_input(prompt) # validate and return - if valid_nodeid(id): + if valid_format(id, prefix=NODE_ID_PREFIX): return id else: # loop again @@ -435,8 +435,10 @@ def user_input(): baseurl = base_url(FIELDS[f][nf][0]) FIELDS[f][nf][1] = baseurl elif nf in 'subject': - # set the subject field as the base_url without trailing slash - FIELDS[f][nf][1] = baseurl[:-1] + pass + # # set the subject field as the node id in LDAP record format (CN=urn:node:NODEID,DC=dataone,DC=org) + # # postponing this step for later as we don't know if node_id has been set yet + # FIELDS[f][nf][1] = baseurl[:-1] else: FIELDS[f][nf][1] = req_input(FIELDS[f][nf][0]) elif f in ('default_submitter', 'default_owner'): @@ -449,6 +451,8 @@ def user_input(): pass else: FIELDS[f][1] = req_input(FIELDS[f][0]) + # add the subject field now that ['node']['node_id'] is definitely populated: should be "CN=urn:node:NODEID,DC=dataone,DC=org" + FIELDS['node']['subject'] = f"{SUBJECT_PREFIX}{FIELDS['node']['node_id']}{SUBJECT_POSTFIX}" # add the sitemap URLs field now that we're done with the loops FIELDS['spider'] = {} FIELDS['spider']['sitemap_urls'] = ['Sitemap URLs: ', []] diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 82b345ac..3d00c09b 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -7,7 +7,7 @@ import xmltodict from pathlib import Path -from mnonboard.defs import SCHEDULES, NAMES_DICT +from mnonboard.defs import SCHEDULES, NAMES_DICT, SUBJECT_PREFIX, SUBJECT_POSTFIX from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name, set_role @@ -138,7 +138,10 @@ def get_or_create_subj(loc: str, value: str, cn_url: str, title: str='unspecifie """ if name: # we are probably creating a node record - L.info('Creating a node subject.') + L.info(f'Creating a node subject. Given node_id: {value}') + if (not SUBJECT_PREFIX in value) and (not SUBJECT_POSTFIX in value): + value = f"{SUBJECT_PREFIX}{value}{SUBJECT_POSTFIX}" + L.info(f'Node subject value: "{value}"') else: # name was not given. look up the orcid record in the database name = cn_subj_lookup(subj=value, cn_url=cn_url) From 18c24adf364133a158453baab421cdd7315b8e67 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 13 Oct 2023 19:50:03 +0000 Subject: [PATCH 243/301] adding `application/ld+json` to request header #23 --- soscan/settings.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/soscan/settings.py b/soscan/settings.py index 7bb91a49..d39ac3c7 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -46,10 +46,10 @@ # TELNETCONSOLE_ENABLED = False # Override the default request headers: -# DEFAULT_REQUEST_HEADERS = { -# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', -# 'Accept-Language': 'en', -# } +DEFAULT_REQUEST_HEADERS = { + 'Accept': 'application/ld+json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en', +} # Enable or disable spider middlewares # See https://docs.scrapy.org/en/latest/topics/spider-middleware.html From e6e9ae518d60c25f1148d849b7ed1ac1c46f8ed3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 13 Oct 2023 20:45:27 +0000 Subject: [PATCH 244/301] adding debug text for response Content-Type #23 --- soscan/middlewares.py | 1 + 1 file changed, 1 insertion(+) diff --git a/soscan/middlewares.py b/soscan/middlewares.py index 4cebb98b..92545948 100644 --- a/soscan/middlewares.py +++ b/soscan/middlewares.py @@ -101,6 +101,7 @@ def process_response(self, request, response, spider): # - return a Response object # - return a Request object # - or raise IgnoreRequest + spider.logger.debug(f'Response Content-Type: {response.headers.get("Content-Type")}') return response def process_exception(self, request, exception, spider): From c59359172bd5e55bd2a40372e41656e1230113a2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 13 Oct 2023 21:48:22 +0000 Subject: [PATCH 245/301] disabling telnet console --- soscan/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/settings.py b/soscan/settings.py index d39ac3c7..028b31d3 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -43,7 +43,7 @@ # COOKIES_ENABLED = False # Disable Telnet Console (enabled by default) -# TELNETCONSOLE_ENABLED = False +TELNETCONSOLE_ENABLED = False # Override the default request headers: DEFAULT_REQUEST_HEADERS = { From 379106aba9e6ec9de48c71221328d1d91b7431c3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 13 Oct 2023 21:49:30 +0000 Subject: [PATCH 246/301] adding handling of integer jsonld version --- soscan/sonormalizepipeline.py | 1 + 1 file changed, 1 insertion(+) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index dfd315a2..0953f0f4 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -37,6 +37,7 @@ def process_item(self, item, spider): jsonld = item["jsonld"] version = jsonld.get('version', None) version = jsonld.get('@version', '1.1') if not version else version + version = '1.0' if version == '1' else version jldversion = f'json-ld-{version}' self.logger.debug(f"process_item: version {jldversion}") options = {"base": item["url"], "processingMode": jldversion} From 00669a4442b947756547e7885ffefc80dc864b41 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 13 Oct 2023 22:36:07 +0000 Subject: [PATCH 247/301] adding response logic for #23 --- soscan/spiders/jsonldspider.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 77d8ee7b..0f55fe8b 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -138,7 +138,10 @@ def parse(self, response, **kwargs): "extractAllScripts": True, "json_parse_strict": json_parse_strict, } - jsonld = pyld.jsonld.load_html(response.body, response.url, None, options) + if "application/ld+json" in response.headers.get("Content-Type"): + jsonld = json.loads(response.body.decode(), strict=options.get("json_parse_strict", True)) + else: + jsonld = pyld.jsonld.load_html(response.body, response.url, None, options) # for j_item in jsonld: # item = soscan.items.SoscanItem() # item["source"] = response.url From 9bf06bb69891244e94214c4de4d7a8e3c59e70d3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 16:46:18 +0000 Subject: [PATCH 248/301] enable RedirectMiddleware (#35) --- soscan/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/soscan/settings.py b/soscan/settings.py index 028b31d3..6237745e 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -61,6 +61,7 @@ # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html DOWNLOADER_MIDDLEWARES = { "soscan.middlewares.SoscanDownloaderMiddleware": 543, + "scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 543, } # Enable or disable extensions From ed0262c246849b0ccd3819ba687408538d671300 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 16:48:06 +0000 Subject: [PATCH 249/301] enabling RobotsTxtMiddleware explicitly (#23) --- soscan/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/soscan/settings.py b/soscan/settings.py index 6237745e..ca59c741 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -62,6 +62,7 @@ DOWNLOADER_MIDDLEWARES = { "soscan.middlewares.SoscanDownloaderMiddleware": 543, "scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 543, + "scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 543, } # Enable or disable extensions From c171809678a2440b871a6280c2829662514a2f8f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 16:49:33 +0000 Subject: [PATCH 250/301] more explicit error logging for jsonldspider (#23) --- soscan/spiders/jsonldspider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 0f55fe8b..de77ebbe 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -179,5 +179,5 @@ def parse(self, response, **kwargs): item["jsonld"] = jsonld yield item except Exception as e: - self.logger.error("parse: url: %s, error: %s", response.url, e) + self.logger.error("parse: url: %s, %s: %s", response.url, repr(e), e) yield None From 33cce6957b553eb89c8951c84b86ffd5b5f4359d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 17:27:05 +0000 Subject: [PATCH 251/301] decoding content-type from response (#23) --- soscan/spiders/jsonldspider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index de77ebbe..811aaec1 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -138,7 +138,7 @@ def parse(self, response, **kwargs): "extractAllScripts": True, "json_parse_strict": json_parse_strict, } - if "application/ld+json" in response.headers.get("Content-Type"): + if "application/ld+json" in response.headers.get("Content-Type").decode(): jsonld = json.loads(response.body.decode(), strict=options.get("json_parse_strict", True)) else: jsonld = pyld.jsonld.load_html(response.body, response.url, None, options) From 03e7079a3281543adcbd98eac42bc6b0bd042c55 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 20:10:56 +0000 Subject: [PATCH 252/301] adding to docs (#32) --- mnonboard/data_chx.py | 43 +++++++-------- mnonboard/utils.py | 121 +++++++++++++++++++++++++++++++----------- 2 files changed, 111 insertions(+), 53 deletions(-) diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 15501c12..8f04d7f4 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -12,13 +12,12 @@ def violation_extract(viol): """ - A function that extracts the name of the violation from pyshacl.validate()[2] (res_text). + A function that extracts the name of the violation from + :py:func:`pyshacl.validate`. - Args: - viol (str): The result text, third item returned of a pyshacl.validate() run. - - Returns: - vx (list of str): List of violation names found in the res_text + :param str viol: The result text, third item returned of a pyshacl.validate() run. + :returns: List of violation names found in the res_text + :rtype: list[str, str, ...] """ lines = ['Source Shape: '] end = '\n' @@ -39,14 +38,13 @@ def violation_extract(viol): def violation_cat(hash, viol): """ - A function that returns a CSV linestring that contains the severity of a passed shacl violation and a comment. - - Args: - hash (str): Path to the metadata file (based on file hash). - viol (str): The violation name. + A function that returns a CSV linestring that contains the severity of a + passed shacl violation and a comment. - Returns: - csvl (str): Comma-separated list of: hash, violation category, violation name, comment + :param str hash: Path to the metadata file (based on file hash). + :param str viol: The violation name. + :returns: Comma-separated list of: hash, violation category, violation name, comment + :rtype: str """ csvl = '%s,%s,%s,%s\n' cat, comment = '', '' @@ -61,7 +59,7 @@ def violation_cat(hash, viol): comment = SHACL_ERRORS['internal'][viol] else: cat = 'Not found' - comment = 'Violation name %s not found in SHACL_ERRORS dictionary! Consult NCEAS node manager for information.' % viol + comment = 'Violation name %s not found in SHACL_ERRORS dictionary! Consult DataONE node admin for information.' % viol L.warning(comment) hash = hash.split('/')[-1].split('.bin')[0] # split path and file extension from string csvl = csvl % (hash, cat, viol, comment) @@ -70,11 +68,11 @@ def violation_cat(hash, viol): def violation_report(viol_dict, loc): """ - A function that outputs a report containing information on the violations found while shacl testing. + A function that outputs a report containing information on the violations + found while shacl testing. - Args: - viol_dict (dict): Dictionary of violations compiled from this run of metadata checks. - loc (str): Directory of the opersist instance, where the report file will be written. + :param dict viol_dict: Dictionary of violations compiled from this run of metadata checks. + :param str loc: Directory of the opersist instance, where the report file will be written. """ L.info('Creating report.') L.debug(viol_dict) @@ -99,11 +97,10 @@ def test_mdata(loc, shp_graph=SHACL_URL, format='json-ld', num_tests=3): """ Use pyshacl to test harvested metadata. - Args: - loc (str): The base MN folder path in which opersist keeps its data and databases - shp_graph (str): Shape graph to be used for testing (defaults to soso v1.2.3) - format (str): Format of the data graphs (default: json-ld) - num_tests (int): Number of metadata files to test (randomly selected; default=3) + :param str loc: The base MN folder path in which opersist keeps its data and databases + :param str shp_graph: Shape graph to be used for testing (defaults to soso v1.2.3) + :param str format: Format of the data graphs (default: json-ld) + :param int num_tests: Number of metadata files to test (randomly selected; default=3) """ L.info('Starting metadata checks. Shape graph: %s' % (shp_graph)) op = getOpersistInstance(loc) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 3d00c09b..0f234683 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -107,9 +107,9 @@ def new_subj(loc: str, name: str, value: str): """ Create new subject in the database using opersist. - :param str loc: Location of the opersist instance. - :param str name: Subject name (human readable). - :param str value: Subject value (unique subject id, such as orcid or member node id). + :param str loc: Location of the opersist instance + :param str name: Subject name (human readable) + :param str value: Subject value (unique subject id, such as orcid or member node id) """ try: L.info('opersist creating new subject. Name: %s Value: %s Location: %s' % (name, value, loc)) @@ -125,15 +125,17 @@ def new_subj(loc: str, name: str, value: str): def get_or_create_subj(loc: str, value: str, cn_url: str, title: str='unspecified subject', name: str=None): """ - Get an existing subject using their ORCiD or create a new one with the specified values. + Get an existing subject using their ORCiD or create a new one with the + specified values. Search is conducted first at the given coordinating node URL, then locally. - If no subject is found, a new record is created in the local opersist instance. - - :param str loc: Location of the opersist instance. - :param str value: Subject value (unique subject id, such as orcid or member node id). - :param str cn_url: The base URL of the rest API with which to search for the given subject. - :param str title: The subject's role in relation to the database. - :param name: Subject name (human readable). + If no subject is found, a new record is created in the local opersist + instance. + + :param str loc: Location of the opersist instance + :param str value: Subject value (unique subject id, such as orcid or member node id) + :param str cn_url: The base URL of the rest API with which to search for the given subject + :param str title: The subject's role in relation to the database + :param name: Subject name (human readable) :type name: str or None """ if name: @@ -162,7 +164,7 @@ def set_schedule(): Ask the user what schedule on which they would like to run scrapes. Options are: monthly, daily, and every 3 minutes. - :returns: Dictionary entry formatted based on the chosen schedule option. + :returns: Dictionary entry formatted based on the chosen schedule option :rtype: dict """ s = enter_schedule() @@ -202,10 +204,11 @@ def restart_mnlite(): def harvest_data(loc: str, mn_name: str): """ - Use scrapy to harvest data to the specified path, and output a log to the specified location. + Use scrapy to harvest data to the specified path, and output a log to the + specified location. - :param str loc: Location of the opersist instance. - :param str mn_name: Name of the member node (used to name the crawl log). + :param str loc: Location of the opersist instance + :param str mn_name: Name of the member node (used to name the crawl log) """ log_loc = os.path.join(LOG_DIR, mn_name + HARVEST_LOG_NAME) L.info('Starting scrapy crawl, saving to %s' % (loc)) @@ -221,13 +224,15 @@ def harvest_data(loc: str, mn_name: str): def limit_tests(num_things: int): """ - Ask the user to limit the number of tests to run on a given set of metadata. - This will execute if the user decides to try and test more than 500 metadata objects. - The prompt will ask them if they wish to limit the number, then return a - number based on their decision. + Ask the user to limit the number of tests to run on a given set of + metadata. + This will execute if the user decides to try and test more than 500 + metadata objects. + The prompt will ask them if they wish to limit the number, then return + a number based on their decision. - :param int num_things: Initial number of things to test. - :returns: Modified number of things to test. + :param int num_things: Initial number of things to test + :returns: Modified number of things to test :rtype: int """ while True: @@ -253,9 +258,10 @@ def limit_tests(num_things: int): def ask_continue(msg: str): """ - A user input loop in which the user is prompted whether they want to continue. + A user input loop in which the user is prompted whether they want to + continue. - :param str msg: The message to display at the prompt. + :param str msg: The message to display at the prompt """ while True: i = input(msg + ' (Y/n) ') @@ -275,11 +281,11 @@ def create_names_xml(loc: str, node_id: str, names: dict): """ Format subject XML documents and return list of names. - :param str loc: Location (dir) to write file to. - :param str node_id: Node id of current MN. - :param dict names: Dict of subject names with ORCiD as index. + :param str loc: Location (dir) to write file to + :param str node_id: Node id of current MN + :param dict names: Dict of subject names with ORCiD as index - :returns: List of files written. + :returns: List of files written :rtype: list """ # make dir @@ -318,6 +324,12 @@ def write_cmd_to(fn, cmd, desc=None, mode='a'): def start_ssh(server: str, node_id, loc: str, ssh: bool=True): """ + Starts ssh client connection to a given server. + + :param str server: The remote CN server to connect to (e.g. ``"cn-stage-ucsb-1.test.dataone.org"``) + :param str node_id: The node identifier (e.g. ``"urn:node:OPENTOPO"``) + :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) + :param bool ssh: ``True`` will attempt to establish a remote connection. ``False`` will return values to output command strings to file. Default: True """ server = server.split('https://')[1].split('/')[0] node_id = node_id.split(':')[-1] @@ -346,10 +358,13 @@ def start_ssh(server: str, node_id, loc: str, ssh: bool=True): def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, server: str=None): """ Format subject XML documents and return list of names. - cmd_fn = f"{loc}/commands.sh" - Args: - files (list): List of files to upload. + :param paramiko.SSHClient ssh: The SSH client (if one was created) or ``False`` + :type ssh: paramiko.SSHClient or bool + :param list files: List of files to upload + :param str node_id: The node identifier (e.g. ``"urn:node:OPENTOPO"``) + :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) + :param str server: The remote CN server to connect to (e.g. ``"cn-stage-ucsb-1.test.dataone.org"``) """ op = '' target_dir = f'~/d1_xml/{node_id}/' @@ -373,6 +388,14 @@ def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, server: str= def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str, loc: str): """ + Create a subject in the accounts service on the CN. + + :param paramiko.SSHClient ssh: The SSH client (if one was created) or ``False`` + :type ssh: paramiko.SSHClient or bool + :param str cert: The location of the CN certificate on the remote server + :param list files: List of XML subject files to upload + :param str cn: The base https address of the CN to use for API calls (e.g. ``"https://cn-stage.test.dataone.org/cn"``) + :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) """ cmd_fn = f"{loc}/commands.sh" for f in files: @@ -390,6 +413,15 @@ def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str, loc def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str, loc: str): """ + Validate the subjects created using + :py:func:`mnlite.mnonboard.utils.create_subj_in_acct_svc`. + + :param paramiko.SSHClient ssh: The SSH client (if one was created) or ``False`` + :type ssh: paramiko.SSHClient or bool + :param str cert: The location of the CN certificate on the remote server + :param dict names: Dictionary of names indexed by ORCiD (e.g. ``{"http://orcid.org/0000-0001-5828-6070": "Ian Nesbitt"}``) + :param str cn: The base https address of the CN to use for API calls (e.g. ``"https://cn-stage.test.dataone.org/cn"``) + :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) """ cmd_fn = f"{loc}/commands.sh" for n in names: @@ -407,6 +439,16 @@ def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str, l def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_id: str, loc: str): """ + Download the node capabilities xml document from the SO server and save it + to file. + + :param paramiko.SSHClient ssh: The SSH client (if one was created) or ``False`` + :type ssh: paramiko.SSHClient or bool + :param str baseurl: The base URL of the schema.org server to download node config from (e.g. ``"so.test.dataone.org"``) + :param str node_id: The end triplet of the node identifier (e.g. ``"OPENTOPO"``) + :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) + :returns: Location of the xml filepath where the node doc is saved + :rtype: str """ cmd_fn = f"{loc}/commands.sh" target_dir = f'~/d1_xml/{node_id}' @@ -423,6 +465,12 @@ def dl_node_capabilities(ssh: SSHClient, baseurl: str, node_id: str, loc: str): def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str, loc: str): """ + Registers the node in the CN. + + :param paramiko.SSHClient ssh: The SSH client (if one was created) or ``False`` + :type ssh: paramiko.SSHClient or bool + :param str node_filename: The xml filepath returned by :py:func:`mnlite.mnonboard.utils.dl_node_capabilities`. + :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) """ cmd_fn = f"{loc}/commands.sh" node_filename = os.path.split(node_filename)[1] @@ -440,6 +488,19 @@ def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str, loc: s def approve_node(ssh: SSHClient, script_loc: str, loc: str): """ + Starting the node approval script. + + .. warning:: This does not work over SSH! + + .. note:: + + In the future, this will be deprecated in favor of a method that does + not use Hazelcast. + + :param paramiko.SSHClient ssh: The SSH client (if one was created) or ``False`` + :type ssh: paramiko.SSHClient or bool + :param str script_loc: The location of the node approval script (e.g. ``"/usr/local/bin/dataone-approve-node"``) + :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) """ cmd_fn = f"{loc}/commands.sh" command = 'sudo %s' % (script_loc) From 0e64f64c77326978cc3289f172a88169798e97f2 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 20:38:27 +0000 Subject: [PATCH 253/301] adding to docs (#32) --- mnonboard/info_chx.py | 154 ++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 87 deletions(-) diff --git a/mnonboard/info_chx.py b/mnonboard/info_chx.py index 6865b585..bae02569 100644 --- a/mnonboard/info_chx.py +++ b/mnonboard/info_chx.py @@ -8,17 +8,20 @@ from opersist.cli import getOpersistInstance D1_AUTH_TOKEN = environ.get('D1_AUTH_TOKEN') +""" +The authentication token for a DataONE CN. Taken from the environment if it +exists there, then from user input. +""" + # user info checks def not_empty(f): """ Test whether a string is empty. - Args: - f (str): The string to test. - - Returns: - (bool): Whether or not the string is empty. + :param str f: The string to test + :returns: Whether or not the string is empty + :rtype: bool """ return f != '' @@ -26,11 +29,9 @@ def req_input(desc): """ Require user input for a given prompt. - Args: - desc (str): The prompt to show the user at the input step. - - Returns: - (str): User input. + :param str desc: The prompt to show the user at the input step + :returns: User input + :rtype: str """ while True: i = input(desc) @@ -55,11 +56,9 @@ def valid_orcid(orcid): This seems like overkill but is probably good to have a simple check since it will be used to store contacts for database upkeep/maintenance. - Args: - orcid (str): The orcid number. - - Returns: - (bool): Whether or not the orcid number passed checks. + :param str orcid: The orcid number + :returns: Whether or not the orcid number passed checks + :rtype: bool """ if (len(orcid) == 19): # it's 19 characters long. start test loop @@ -98,11 +97,9 @@ def base_url(descrip): """ Validate the base URL of the member node. Should include trailing slash. - Args: - descrip (str): The prompt to show the user at the base URL input step. - - Returns: - (str): User input. + :param str descrip: The prompt to show the user at the base URL input step + :returns: User input + :rtype: str """ while True: url = req_input(descrip) @@ -116,13 +113,11 @@ def valid_url_prefix(url, prefix, f): """ Validate a URL prefix (such as for an ORCiD number). - Args: - url (str): The URL to test. - prefix (str): The URL prefix. - f (str): The name of the field being tested. - - Returns: - True (bool): Returns True if the URL passed checks. + :param str url: The URL to test + :param str prefix: The URL prefix + :param str f: The name of the field being tested + :returns: ``True`` if the URL passed checks + :rtype: bool """ # orcid number will be preceded by a url prefix but no trailing slash if prefix not in url: @@ -140,11 +135,9 @@ def sitemap_urls(num_urls): Collect the sitemap URLs. Usually there will be just one of these but we will prepare for more. - Args: - num_urls (int): The number of URLs describing the sitemap. - - Returns: - SITEMAP_URLS (list): The sitemap URLs for the given member node. + :param int num_urls: The number of URLs describing the sitemap + :returns: A list of sitemap URLs for the given member node + :rtype: list[str, str, ...] """ i = 0 while i < num_urls: @@ -160,8 +153,8 @@ def enter_schedule(): Give the user a choice between three basic scheduling options. Options are: monthly, daily, and every 3 minutes. - Returns: - (int): User-entered integer indicating schedule choice. + :returns: User-entered integer indicating schedule choice + :rtype: int """ p = 'Select a starting frequency with which to scrape data from this member node.\n' \ '0: Monthly\n' \ @@ -187,11 +180,9 @@ def enter_int(prompt): """ Make sure the user enters a number of sitemap URLs of 1 or greater. - Args: - prompt (str): The prompt to show the user at the input step. - - Returns: - (int): User-entered integer indicating number of sitemap URLs. + :param str prompt: The prompt to show the user at the input step + :returns: User-entered integer indicating number of sitemap URLs + :rtype: int """ i = None while True: @@ -214,15 +205,14 @@ def enter_int(prompt): def cn_subj_lookup(subj, cn_url='https://cn.dataone.org/cn', debug=False): """ - Use the DataONE API to look up whether a given ORCiD number already exists in the system. + Use the DataONE API to look up whether a given ORCiD number already exists + in the system. - Args: - subj (str): The subject to look up. - cn_url (str): The URL for the DataONE api to send REST searches to (default: 'https://cn.dataone.org/cn'). - debug (bool): Whether to include debug info in log messages (lots of text). - - Returns: - (str or bool): Received response or False. + :param str subj: The subject to look up + :param str cn_url: The URL for the DataONE api to send REST searches to (default: 'https://cn.dataone.org/cn') + :param bool debug: Whether to include debug info in log messages (lots of text) + :returns: Received response or False + :rtype: str or bool """ # this authentication method was adapted from: # https://github.com/DataONEorg/dataone_examples/blob/master/python_examples/update_object.ipynb @@ -254,14 +244,12 @@ def local_subj_lookup(subj, name, loc, retn=False): """ Use the local opersist instance to look up a subject. - Args: - subj (str): Subject id (unique). - loc (str): Location of the opersist instance. - name (str): Name of subject. - retn (bool): Whether to return the record. - - Returns: - (str or False): Returns subject name or False if not found. + :param str subj: Subject id (unique) + :param str loc: Location of the opersist instance + :param str name: Name of subject + :param bool retn: Whether to return the record + :returns: Returns subject name or False if not found + :rtype: str or bool """ L.info('Looking up %s in sqlite database at %s' % (subj, loc)) op = getOpersistInstance(loc) @@ -282,6 +270,7 @@ def set_role(loc, title, value): :param str loc: The location of the opersist database parent folder :param str title: ``default_submitter`` or ``default_owner`` + :param str value: Subject ORCiD (e.g. ``"http://orcid.org/0000-0001-5828-6070"``) """ L.info('Setting %s as "%s" in sqlite database at %s' % (value, title, loc)) op = getOpersistInstance(loc) @@ -298,12 +287,10 @@ def orcid_name(orcid, f): """ Ask the user for the name of an orcid number. - Args: - orcid (str): Subject orcid number. - f (str): json field name of inquiry. - - Returns: - (str): Returns user-entered subject name. + :param str orcid: Subject orcid number + :param str f: json field name of inquiry + :returns: Returns user-entered subject name + :rtype: str """ L.info('Asking for name of %s (ORCiD number %s)' % (f, orcid)) name = req_input('Please enter the name of %s (ORCiD number %s): ' % (f, orcid)) @@ -314,11 +301,9 @@ def enter_orcid(prompt): """ Make sure the user enters a valid orcid number. - Args: - prompt (str): Prompt to display at input step. - - Returns: - (str): Returns user-entered orcid number. + :param str prompt: Prompt to display at input step + :returns: Returns user-entered orcid number + :rtype: str """ while True: # ask the user for an ORCiD number @@ -335,8 +320,8 @@ def valid_format(test_value: str, prefix: str='', postfix: str=''): """ Make sure the node_id contains the correct format. - :param str test_value: String to test against, for example ``node_id`` or ``subject``. - :returns: Whether or not the node_id is valid. + :param str test_value: String to test against, for example ``node_id`` or ``subject`` + :returns: Whether or not the node_id is valid :rtype: bool """ if prefix in test_value: @@ -383,15 +368,15 @@ def valid_format(test_value: str, prefix: str='', postfix: str=''): def enter_nodeid(prompt='Unique node_id: ', id=False): """ - Have the user enter a node_id and make sure it contains the correct id prefix. + Have the user enter a node_id and make sure it contains the correct id + prefix. Loops until a valid node id is entered. - Args: - prompt (str): Prompt to display at input step. - id (str or bool): The node id from the user's json file or False if none. - - Returns: - (str): Only returns if node id is valid. + :param str prompt: Prompt to display at input step + :param id: The node id from the user's json file or False if none + :type id: str or bool + :returns: Node identifier. Only returns if id is deemed valid + :rtype: str """ while True: L.info('In loop, vars are prompt="%s", id="%s"' % (prompt, id)) @@ -411,8 +396,8 @@ def user_input(): We need a few pieces of information to fill the json fields. Collects user input for necessary pieces of node.json information. - Returns: - (dict): Dictionary of fields to use for node creation. Will be written to node.json. + :returns: Dictionary of fields to use for node creation. Will be written to node.json + :rtype: dict """ baseurl = '' L.info('Collecting user input.') @@ -466,11 +451,8 @@ def transfer_info(ufields): """ Take a user fields dict and translate it to the default json object. - Args: - ufields (dict): A dict of user-entered fields to be translated. - - Returns: - (dict): A dict of user-entered fields in proper node.json format. + :param dict ufields: A dict of user-entered fields to be translated + :returns: A dict of user-entered fields in proper node.json format """ fields = default_json(fx='mnonboard.info_chx.transfer_info()') L.info('Adding user fields to default fields.') @@ -490,11 +472,9 @@ def input_test(fields): """ Testing the manually filled json file. - Args: - fields (dict): A dict of loaded json fields to test. - - Returns: - (bool): Returns True if all tests pass. + :param dict fields: A dict of loaded json fields to test + :returns: Returns ``True`` if all tests pass, else ``False`` + :rtype: bool """ L.info('Running tests on imported json.') # first, test that there are the fields we need From d934fcc213dda75719b16e4416a03de202fbeb1c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 20:40:45 +0000 Subject: [PATCH 254/301] adding to docs (#32) --- mnonboard/cli.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 81f9f1b9..87ea24e4 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -14,8 +14,7 @@ def run(cfg): Wrapper around opersist that simplifies the process of onboarding a new member node to DataONE. - Args: - cfg (dict): Dict containing config variables. + :param dict cfg: Dict containing config variables """ # auth if not cfg['token']: @@ -86,10 +85,11 @@ def run(cfg): def main(): """ - Uses getopt to set config values in order to call run(). + Uses getopt to set config values in order to call + :py:func:`mnlite.mnonboard.cli.run`. - Returns: - (dict): Config variable dict to use in run(). + :returns: Config variable dict to use in :py:func:`mnlite.mnonboard.cli.run` + :rtype: dict """ # get arguments try: From 10a8d22bd77bb0baa74cc3a0c79c457b777f7a25 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 24 Oct 2023 20:56:00 +0000 Subject: [PATCH 255/301] adding more docs (#32) --- mnonboard/__init__.py | 8 ++++---- mnonboard/cn.py | 24 +++++++++++++++++++++++- mnonboard/data_chx.py | 10 +++++----- mnonboard/utils.py | 20 ++++++++++---------- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/mnonboard/__init__.py b/mnonboard/__init__.py index ca6ddaaf..ada11b0b 100644 --- a/mnonboard/__init__.py +++ b/mnonboard/__init__.py @@ -24,8 +24,8 @@ def start_logging(): """ Initialize logger. - Returns: - (logging.Logger): The logger to use. + :returns: The logger to use + :rtype: logging.Logger """ logger = logging.getLogger('mnonboard') logger.setLevel(logging.DEBUG) @@ -56,8 +56,8 @@ def default_json(fx='Unspecified'): """ A function that spits out a dict to be used in onboarding. - Returns: - (dict): A dict of values to be used in member node creation. + :returns: A dict of values to be used in member node creation + :rtype: dict """ L.info('%s function loading default json template.' % (fx)) return DEFAULT_JSON diff --git a/mnonboard/cn.py b/mnonboard/cn.py index ac799ba7..4c5ca202 100644 --- a/mnonboard/cn.py +++ b/mnonboard/cn.py @@ -9,18 +9,26 @@ def init_client(cn_url: str, auth_token: str): """ Initialize a d1_client.cnclient.CoordinatingNodeClient instance. - :param str cn_url: The URL + :param str cn_url: The URL of the coordinating node to query (e.g. ``"https://cn-stage.test.dataone.org/cn"``) """ options: dict = {"headers": {"Authorization": "Bearer " + auth_token}} return CoordinatingNodeClient(cn_url, **options) def get_subjects(client: CoordinatingNodeClient, orcid: str): """ + Return a list of subjects queried from the CN client. + + :param d1_client.cnclient.CoordinatingNodeClient client: The client to query + :param str orcid: ORCiD to search for on the CN """ return client.getSubjectInfo(orcid) def get_first_subject(client: CoordinatingNodeClient, orcid: str): """ + Return the first subject in the list queried from the CN client. + + :param d1_client.cnclient.CoordinatingNodeClient client: The client to use for the query + :param str orcid: ORCiD to search for on the CN """ try: return get_subjects(client=client, orcid=orcid)[0] @@ -29,12 +37,18 @@ def get_first_subject(client: CoordinatingNodeClient, orcid: str): def get_subject_name(subject: Subject): """ + Get the name of a subject queried from the CN. + + :param d1_common.types.dataoneTypes.Subject subject: The Subject object to get the name from """ first, last = subject.content()[0].content()[1], subject.content()[0].content()[2] return "%s %s" % (first, last) def node_list(client: CoordinatingNodeClient): """ + Get a list of nodes from the CN. + + :param d1_client.cnclient.CoordinatingNodeClient client: The CN client to use for the query """ nodes = client.listNodes() for node in nodes.content(): @@ -43,8 +57,16 @@ def node_list(client: CoordinatingNodeClient): def register_user(client: CoordinatingNodeClient, orcid: str, name: str, email: str=None): """ + Register a user using the CN client. + + :param d1_client.cnclient.CoordinatingNodeClient client: The client to use for the query + :param str orcid: The subject's ORCiD ID + :param str name: The name of the subject + :param str email: The subject's email address """ def set_nodes_properties(nodes_properties: dict, con=None): """ + :param dict nodes_properties: + :param con: """ diff --git a/mnonboard/data_chx.py b/mnonboard/data_chx.py index 8f04d7f4..185034a4 100644 --- a/mnonboard/data_chx.py +++ b/mnonboard/data_chx.py @@ -15,7 +15,7 @@ def violation_extract(viol): A function that extracts the name of the violation from :py:func:`pyshacl.validate`. - :param str viol: The result text, third item returned of a pyshacl.validate() run. + :param str viol: The result text, third item returned of a pyshacl.validate() run :returns: List of violation names found in the res_text :rtype: list[str, str, ...] """ @@ -41,8 +41,8 @@ def violation_cat(hash, viol): A function that returns a CSV linestring that contains the severity of a passed shacl violation and a comment. - :param str hash: Path to the metadata file (based on file hash). - :param str viol: The violation name. + :param str hash: Path to the metadata file (based on file hash) + :param str viol: The violation name :returns: Comma-separated list of: hash, violation category, violation name, comment :rtype: str """ @@ -71,8 +71,8 @@ def violation_report(viol_dict, loc): A function that outputs a report containing information on the violations found while shacl testing. - :param dict viol_dict: Dictionary of violations compiled from this run of metadata checks. - :param str loc: Directory of the opersist instance, where the report file will be written. + :param dict viol_dict: Dictionary of violations compiled from this run of metadata checks + :param str loc: Directory of the opersist instance, where the report file will be written """ L.info('Creating report.') L.debug(viol_dict) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index 0f234683..fede21a3 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -36,8 +36,8 @@ def save_json(loc: str, jf: dict): """ Output json to file. - :param str loc: File location where the json file is to be written. - :param dict jf: Dictionary to be written as json. + :param str loc: File location where the json file is to be written + :param dict jf: Dictionary to be written as json """ L.info('Writing member node json to %s' % loc) try: @@ -56,9 +56,9 @@ def save_report(rep_str: str, loc: str, format: str='.csv'): """ Output a validation report for a set of metadata. - :param str rep_str: Report string to be written. - :param str loc: File location where the report file is to be written. - :param str jf: File extension (default: .csv). + :param str rep_str: Report string to be written + :param str loc: File location where the report file is to be written + :param str jf: File extension (default: .csv) """ fn = os.path.join(loc, 'report-%s%s' % (HM_DATE, format)) L.info('Writing report to %s' % (fn)) @@ -70,7 +70,7 @@ def dumps_json(js): """ Quick and dirty way to output formatted json. - :param dict js: Dictionary to be written as json. + :param dict js: Dictionary to be written as json """ print(json.dumps(js, indent=2)) @@ -80,8 +80,8 @@ def node_path(nodepath: str=NODE_PATH_REL, curpath: str=CUR_PATH_ABS, nodedir: s Currently the nodes directory lives at `../instance/nodes/` (relative to the mnonboard dir that this file is in). - :param str nodepath: Location of the nodes directory relative to the project directory (default: 'instance/nodes/'). - :param str curpath: Current absolute path of this function (default: os.path.dirname(os.path.abspath(__file__))). + :param str nodepath: Location of the nodes directory relative to the project directory (default: 'instance/nodes/') + :param str curpath: Current absolute path of this function (default: os.path.dirname(os.path.abspath(__file__))) :param str nodedir: Name of the node directory (example: 'HAKAI_IYS'; default: '') :returns: Absolute path of the node directory :rtype: str @@ -92,7 +92,7 @@ def init_repo(loc: str): ''' Initialize a new instance using opersist. - :param str loc: Location of the member node directory in which to initialize an opersist instance. + :param str loc: Location of the member node directory in which to initialize an opersist instance ''' try: L.info('Using opersist to init new member node folder: %s' % loc) @@ -469,7 +469,7 @@ def register_node(ssh: SSHClient, cert: str, node_filename: str, cn: str, loc: s :param paramiko.SSHClient ssh: The SSH client (if one was created) or ``False`` :type ssh: paramiko.SSHClient or bool - :param str node_filename: The xml filepath returned by :py:func:`mnlite.mnonboard.utils.dl_node_capabilities`. + :param str node_filename: The xml filepath returned by :py:func:`mnlite.mnonboard.utils.dl_node_capabilities` :param str loc: The local location of the member node directory (e.g. ``"instance/nodes/mnTestOPENTOPO"``) """ cmd_fn = f"{loc}/commands.sh" From 9ea2163ec0fda4a8966de3622cff55f6c67aca41 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 26 Oct 2023 18:30:04 +0000 Subject: [PATCH 256/301] adding redirect setting explicitly (#35) --- soscan/settings.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soscan/settings.py b/soscan/settings.py index ca59c741..b8777ce8 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -65,6 +65,9 @@ "scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 543, } +# Whether the Redirect middleware will be enabled +REDIRECT_ENABLED = True + # Enable or disable extensions # See https://docs.scrapy.org/en/latest/topics/extensions.html # EXTENSIONS = { From a39d7966e980b4220d49f66e43243953bb573a23 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 26 Oct 2023 18:32:10 +0000 Subject: [PATCH 257/301] adding settings override (#38) --- soscan/spiders/jsonldspider.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 811aaec1..bd9cfd64 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -2,6 +2,7 @@ import sonormal import pyld import email.utils +from pathlib import Path try: import orjson as json @@ -62,6 +63,14 @@ def __init__(self, *args, **kwargs): @classmethod def from_crawler(cls, crawler, *args, **kwargs): node_path = crawler.settings.get("STORE_PATH", None) + custom_settings = Path(f'{node_path}/settings.json') + if custom_settings.exists(): + spider = super().from_crawler(crawler, *args, **kwargs) + with open(custom_settings) as cs: + _cs = json.loads(cs.read()) + for s in _cs: + spider.settings.set(s, _cs[s], priority='spider') + spider.logger.info(f'Setting override from {custom_settings}: set {s} to {s[_cs]}') alt_rules = None if not node_path is None: node_settings = os.path.join(node_path, "node.json") From d14f32cd0c68810f00bdf34a00e058478393853d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 26 Oct 2023 18:55:25 +0000 Subject: [PATCH 258/301] modifying handling of mn specific settings (#38) --- soscan/spiders/jsonldspider.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index bd9cfd64..cd5d6ca6 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -1,4 +1,5 @@ import os +from scrapy.settings import BaseSettings import sonormal import pyld import email.utils @@ -63,14 +64,6 @@ def __init__(self, *args, **kwargs): @classmethod def from_crawler(cls, crawler, *args, **kwargs): node_path = crawler.settings.get("STORE_PATH", None) - custom_settings = Path(f'{node_path}/settings.json') - if custom_settings.exists(): - spider = super().from_crawler(crawler, *args, **kwargs) - with open(custom_settings) as cs: - _cs = json.loads(cs.read()) - for s in _cs: - spider.settings.set(s, _cs[s], priority='spider') - spider.logger.info(f'Setting override from {custom_settings}: set {s} to {s[_cs]}') alt_rules = None if not node_path is None: node_settings = os.path.join(node_path, "node.json") @@ -90,6 +83,14 @@ def from_crawler(cls, crawler, *args, **kwargs): **kwargs ) spider._set_crawler(crawler) + # incorporate MN-specific settings + mn_settings = Path(f'{node_path}/settings.json') + if mn_settings.exists(): + with open(mn_settings) as cs: + _cs = json.loads(cs.read()) + for s in _cs: + spider.settings.set(s, _cs[s], priority='spider') + spider.logger.info(f'Setting override from {mn_settings}: set {s} to {s[_cs]}') return spider def sitemap_filter(self, entries): From 95d4e145aaa396659d135631a03595ff2dcb1c55 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 26 Oct 2023 19:04:36 +0000 Subject: [PATCH 259/301] minor bug fix for #38 --- soscan/spiders/jsonldspider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index cd5d6ca6..c780f601 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -90,7 +90,7 @@ def from_crawler(cls, crawler, *args, **kwargs): _cs = json.loads(cs.read()) for s in _cs: spider.settings.set(s, _cs[s], priority='spider') - spider.logger.info(f'Setting override from {mn_settings}: set {s} to {s[_cs]}') + spider.logger.info(f'Setting override from {mn_settings}: set {s} to {_cs[s]}') return spider def sitemap_filter(self, entries): From 782252cb1d39a5972fceef471cb1dab6226b1094 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 27 Oct 2023 19:26:06 +0000 Subject: [PATCH 260/301] dummy sitemap to debug #42 --- tests/testHDsitemap.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/testHDsitemap.xml diff --git a/tests/testHDsitemap.xml b/tests/testHDsitemap.xml new file mode 100644 index 00000000..051e1c66 --- /dev/null +++ b/tests/testHDsitemap.xml @@ -0,0 +1,11 @@ + + + + https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/K3OIJQ + 2015-04-11 + + + https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/XFUVJJ + 2023-09-26 + + \ No newline at end of file From 3b4f62d34b5c0d2de6bc9976a60f9529fd38411f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 27 Oct 2023 19:55:06 +0000 Subject: [PATCH 261/301] fixing #42 --- soscan/middlewares.py | 3 +-- soscan/opersistpipeline.py | 2 +- soscan/spiders/jsonldspider.py | 7 +++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/soscan/middlewares.py b/soscan/middlewares.py index 92545948..468d5a6e 100644 --- a/soscan/middlewares.py +++ b/soscan/middlewares.py @@ -101,7 +101,6 @@ def process_response(self, request, response, spider): # - return a Response object # - return a Request object # - or raise IgnoreRequest - spider.logger.debug(f'Response Content-Type: {response.headers.get("Content-Type")}') return response def process_exception(self, request, exception, spider): @@ -112,7 +111,7 @@ def process_exception(self, request, exception, spider): # - return None: continue processing this exception # - return a Response object: stops process_exception() chain # - return a Request object: stops process_exception() chain - pass + spider.logger.error(f'{repr(exception)}: {exception}\n{request}') def spider_opened(self, spider): spider.logger.info("Spider opened: %s" % spider.name) diff --git a/soscan/opersistpipeline.py b/soscan/opersistpipeline.py index abfc5fca..77fb7931 100644 --- a/soscan/opersistpipeline.py +++ b/soscan/opersistpipeline.py @@ -101,5 +101,5 @@ def process_item(self, item, spider): ) except Exception as e: - self.logger.error(e) + self.logger.error(f"{repr(e)}: {e}") return item diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index c780f601..b8fea667 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -148,8 +148,11 @@ def parse(self, response, **kwargs): "extractAllScripts": True, "json_parse_strict": json_parse_strict, } - if "application/ld+json" in response.headers.get("Content-Type").decode(): - jsonld = json.loads(response.body.decode(), strict=options.get("json_parse_strict", True)) + contenttype = response.headers.get("Content-Type").decode() + #self.logger.debug(f'Response Content-Type: {contenttype} from {response.url}') + if contenttype in ["application/ld+json", "application/octet-stream"]: + self.logger.debug(f'Content-Type is "{contenttype}"; assuming json object and loading directly') + jsonld = json.loads(response.text, strict=options.get("json_parse_strict", False)) else: jsonld = pyld.jsonld.load_html(response.body, response.url, None, options) # for j_item in jsonld: From e2be73196b904a9f3a59d16d8eb9485001160158 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Tue, 31 Oct 2023 18:23:19 +0000 Subject: [PATCH 262/301] adding `lastmod_filter` handling (#41) --- soscan/spiders/jsonldspider.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index b8fea667..0239748e 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -91,6 +91,11 @@ def from_crawler(cls, crawler, *args, **kwargs): for s in _cs: spider.settings.set(s, _cs[s], priority='spider') spider.logger.info(f'Setting override from {mn_settings}: set {s} to {_cs[s]}') + if s in "lastmod_filter": + spider.lastmod_filter = dateparser.parse( + _cs[s], + settings={"RETURN_AS_TIMEZONE_AWARE": True}, + ) return spider def sitemap_filter(self, entries): @@ -123,6 +128,8 @@ def sitemap_filter(self, entries): if self.lastmod_filter is not None and ts is not None: if ts > self.lastmod_filter: yield entry + else: + self.logger.debug(f'lastmod_filter skipping {entry}') else: yield entry From 490ca0ee3fdffb2e57811744d2e12f0503555015 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 3 Nov 2023 01:04:56 +0000 Subject: [PATCH 263/301] adding test Dryad sitemap --- tests/testDDRsitemap.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/testDDRsitemap.xml diff --git a/tests/testDDRsitemap.xml b/tests/testDDRsitemap.xml new file mode 100644 index 00000000..6538a421 --- /dev/null +++ b/tests/testDDRsitemap.xml @@ -0,0 +1,11 @@ + + + + http://datadryad.org/stash/dataset/doi:10.5061/dryad.7wm37pvxv + 2023-03-03 + + + http://datadryad.org/stash/dataset/doi:10.5061/dryad.4j0zpc8f2 + 2022-11-30 + + \ No newline at end of file From 38c01566d5ef18c7e08774cf8bbc5329a4b27787 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 3 Nov 2023 15:09:30 +0000 Subject: [PATCH 264/301] setting `REQUEST_FINGERPRINTER_IMPLEMENTATION` --- soscan/settings.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/soscan/settings.py b/soscan/settings.py index b8777ce8..73daf6be 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -21,6 +21,10 @@ # Obey robots.txt rules ROBOTSTXT_OBEY = True +# Setting fingerprinter implementation to avoid deprecation warning +# https://docs.scrapy.org/en/latest/topics/request-response.html#request-fingerprinter-implementation +REQUEST_FINGERPRINTER_IMPLEMENTATION = '2.7' + # Configure maximum concurrent requests performed by Scrapy (default: 16) # CONCURRENT_REQUESTS = 32 From 32c08cb7f23e30e3d613e1e5065b337b01e3b500 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 3 Nov 2023 15:12:12 +0000 Subject: [PATCH 265/301] removing test Dryad sitemap --- tests/testDDRsitemap.xml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 tests/testDDRsitemap.xml diff --git a/tests/testDDRsitemap.xml b/tests/testDDRsitemap.xml deleted file mode 100644 index 6538a421..00000000 --- a/tests/testDDRsitemap.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - http://datadryad.org/stash/dataset/doi:10.5061/dryad.7wm37pvxv - 2023-03-03 - - - http://datadryad.org/stash/dataset/doi:10.5061/dryad.4j0zpc8f2 - 2022-11-30 - - \ No newline at end of file From 045f44697237bc9b2c83e5e435a044ec07ab7e28 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 6 Nov 2023 16:14:32 +0000 Subject: [PATCH 266/301] removing Accept-Language en; not relevant to all mns --- soscan/settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/soscan/settings.py b/soscan/settings.py index 73daf6be..9122cf5b 100644 --- a/soscan/settings.py +++ b/soscan/settings.py @@ -52,7 +52,6 @@ # Override the default request headers: DEFAULT_REQUEST_HEADERS = { 'Accept': 'application/ld+json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'en', } # Enable or disable spider middlewares From 62d6cd30cf3bd2fff0e88ad13a48788f66808191 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 6 Nov 2023 16:15:58 +0000 Subject: [PATCH 267/301] adding nohup output file to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 459674aa..2965c515 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ instance/ dbs/ .vscode +nohup.out docs/diagrams/C4-PlantUML From a302548554a0e7c7aeed4fd7bc09b7431e9bf414 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 9 Nov 2023 21:20:03 +0000 Subject: [PATCH 268/301] updating lock for Ubuntu 22.04 SSL version change --- poetry.lock | 1100 +++++++++++++++++++++++++-------------------------- 1 file changed, 542 insertions(+), 558 deletions(-) diff --git a/poetry.lock b/poetry.lock index aecd858c..7799896e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,98 +2,98 @@ [[package]] name = "aiohttp" -version = "3.8.5" +version = "3.8.6" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, + {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, + {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, + {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, + {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, + {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, + {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, + {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, + {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, + {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, + {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, ] [package.dependencies] @@ -135,13 +135,13 @@ files = [ [[package]] name = "alembic" -version = "1.12.0" +version = "1.12.1" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.7" files = [ - {file = "alembic-1.12.0-py3-none-any.whl", hash = "sha256:03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f"}, - {file = "alembic-1.12.0.tar.gz", hash = "sha256:8e7645c32e4f200675e69f0745415335eb59a3663f5feb487abfa0b30c45888b"}, + {file = "alembic-1.12.1-py3-none-any.whl", hash = "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb"}, + {file = "alembic-1.12.1.tar.gz", hash = "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"}, ] [package.dependencies] @@ -235,17 +235,21 @@ visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] [[package]] name = "babel" -version = "2.12.1" +version = "2.13.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"}, + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "backports-zoneinfo" @@ -335,13 +339,13 @@ d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] @@ -357,75 +361,63 @@ files = [ [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -433,86 +425,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -542,45 +549,45 @@ files = [ [[package]] name = "constantly" -version = "15.1.0" +version = "23.10.4" description = "Symbolic constants in Python" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, - {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, + {file = "constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9"}, + {file = "constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"}, ] [[package]] name = "cryptography" -version = "41.0.4" +version = "41.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, - {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, - {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, - {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, + {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797"}, + {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20"}, + {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548"}, + {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d"}, + {file = "cryptography-41.0.5-cp37-abi3-win32.whl", hash = "sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936"}, + {file = "cryptography-41.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84"}, + {file = "cryptography-41.0.5.tar.gz", hash = "sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7"}, ] [package.dependencies] @@ -689,13 +696,13 @@ files = [ [[package]] name = "dynaconf" -version = "3.2.3" +version = "3.2.4" description = "The dynamic configurator for your Python Project" optional = false python-versions = ">=3.8" files = [ - {file = "dynaconf-3.2.3-py2.py3-none-any.whl", hash = "sha256:df4af8d0f3b068cc6419ceceaae572070a6b8fec38fa51a1f5eb8ea4883e53de"}, - {file = "dynaconf-3.2.3.tar.gz", hash = "sha256:8a37ba3b16df64cb1db383eaad9c733aece218413be0fad5d785f7a907612106"}, + {file = "dynaconf-3.2.4-py2.py3-none-any.whl", hash = "sha256:858f9806fab2409c4f5442614c2605d4c4071d5e5153b0e7f24a225f27465aed"}, + {file = "dynaconf-3.2.4.tar.gz", hash = "sha256:2e6adebaa587f4df9241a16a4bec3fda521154d26b15f3258fde753a592831b6"}, ] [package.extras] @@ -703,26 +710,26 @@ all = ["configobj", "hvac", "redis", "ruamel.yaml"] configobj = ["configobj"] ini = ["configobj"] redis = ["redis"] -test = ["configobj", "django", "flake8", "flake8-debugger", "flake8-print", "flake8-todo", "flask (>=0.12)", "hvac", "pep8-naming", "pytest", "pytest-cov", "pytest-mock", "pytest-xdist", "python-dotenv", "radon", "redis", "toml"] +test = ["configobj", "django", "flake8", "flake8-debugger", "flake8-print", "flake8-todo", "flask (>=0.12)", "hvac (>=1.1.0)", "pep8-naming", "pytest", "pytest-cov", "pytest-mock", "pytest-xdist", "python-dotenv", "radon", "redis", "toml"] toml = ["toml"] vault = ["hvac"] yaml = ["ruamel.yaml"] [[package]] name = "filelock" -version = "3.12.4" +version = "3.13.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, - {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] -typing = ["typing-extensions (>=4.7.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "flask" @@ -908,75 +915,72 @@ files = [ [[package]] name = "greenlet" -version = "2.0.2" +version = "3.0.1" description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, + {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, + {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, + {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, + {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, + {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, + {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, + {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, + {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, + {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, + {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, + {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, + {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, + {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, + {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, ] [package.extras] -docs = ["Sphinx", "docutils (<0.18)"] +docs = ["Sphinx"] test = ["objgraph", "psutil"] [[package]] @@ -1057,13 +1061,13 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.1.0" +version = "6.1.1" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, - {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, ] [package.dependencies] @@ -1101,13 +1105,13 @@ files = [ [[package]] name = "iso8601" -version = "2.0.0" +version = "2.1.0" description = "Simple module to parse ISO 8601 dates" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "iso8601-2.0.0-py3-none-any.whl", hash = "sha256:ebe10061b932edb8a8e33cc635d661926c59b9c3bed7a4f4edca8c62d400af10"}, - {file = "iso8601-2.0.0.tar.gz", hash = "sha256:739960d37c74c77bd9bd546a76562ccb581fe3d4820ff5c3141eb49c839fda8f"}, + {file = "iso8601-2.1.0-py3-none-any.whl", hash = "sha256:aac4145c4dcb66ad8b648a02830f5e2ff6c24af20f4f482689be402db2429242"}, + {file = "iso8601-2.1.0.tar.gz", hash = "sha256:6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df"}, ] [[package]] @@ -1300,13 +1304,13 @@ source = ["Cython (>=0.29.35)"] [[package]] name = "mako" -version = "1.2.4" +version = "1.3.0" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, + {file = "Mako-1.3.0-py3-none-any.whl", hash = "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9"}, + {file = "Mako-1.3.0.tar.gz", hash = "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"}, ] [package.dependencies] @@ -1520,13 +1524,13 @@ rdflib = ">=6.0.2" [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -1779,20 +1783,20 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyopenssl" -version = "23.2.0" +version = "23.3.0" description = "Python wrapper module around the OpenSSL library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, - {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, + {file = "pyOpenSSL-23.3.0-py3-none-any.whl", hash = "sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2"}, + {file = "pyOpenSSL-23.3.0.tar.gz", hash = "sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12"}, ] [package.dependencies] -cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" +cryptography = ">=41.0.5,<42" [package.extras] -docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] test = ["flaky", "pretend", "pytest (>=3.0.1)"] [[package]] @@ -1969,99 +1973,99 @@ networkx = ["networkx (>=2.0.0,<3.0.0)"] [[package]] name = "regex" -version = "2023.8.8" +version = "2023.10.3" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, ] [[package]] @@ -2303,7 +2307,6 @@ Jinja2 = ">=2.3" packaging = "*" Pygments = ">=2.0" requests = ">=2.5.0" -setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -2432,56 +2435,43 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.4.49" +version = "1.4.50" description = "Database Abstraction Library" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, - {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, - {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00665725063692c42badfd521d0c4392e83c6c826795d38eb88fb108e5660e5"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85292ff52ddf85a39367057c3d7968a12ee1fb84565331a36a8fead346f08796"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0fed0f791d78e7767c2db28d34068649dfeea027b83ed18c45a423f741425cb"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db4db3c08ffbb18582f856545f058a7a5e4ab6f17f75795ca90b3c38ee0a8ba4"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14b0cacdc8a4759a1e1bd47dc3ee3f5db997129eb091330beda1da5a0e9e5bd7"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fb9cb60e0f33040e4f4681e6658a7eb03b5cb4643284172f91410d8c493dace"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cb501d585aa74a0f86d0ea6263b9c5e1d1463f8f9071392477fd401bd3c7cc"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a7a66297e46f85a04d68981917c75723e377d2e0599d15fbe7a56abed5e2d75"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1db0221cb26d66294f4ca18c533e427211673ab86c1fbaca8d6d9ff78654293"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7dbe6369677a2bea68fe9812c6e4bbca06ebfa4b5cde257b2b0bf208709131"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a9bddb60566dc45c57fd0a5e14dd2d9e5f106d2241e0a2dc0c1da144f9444516"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82dd4131d88395df7c318eeeef367ec768c2a6fe5bd69423f7720c4edb79473c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:273505fcad22e58cc67329cefab2e436006fc68e3c5423056ee0513e6523268a"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3257a6e09626d32b28a0c5b4f1a97bced585e319cfa90b417f9ab0f6145c33c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d69738d582e3a24125f0c246ed8d712b03bd21e148268421e4a4d09c34f521a5"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34e1c5d9cd3e6bf3d1ce56971c62a40c06bfc02861728f368dcfec8aeedb2814"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1fcee5a2c859eecb4ed179edac5ffbc7c84ab09a5420219078ccc6edda45436"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbaf6643a604aa17e7a7afd74f665f9db882df5c297bdd86c38368f2c471f37d"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e70e0673d7d12fa6cd363453a0d22dac0d9978500aa6b46aa96e22690a55eab"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b881ac07d15fb3e4f68c5a67aa5cdaf9eb8f09eb5545aaf4b0a5f5f4659be18"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6997da81114daef9203d30aabfa6b218a577fc2bd797c795c9c88c9eb78d49"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdb77e1789e7596b77fd48d99ec1d2108c3349abd20227eea0d48d3f8cf398d9"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:128a948bd40780667114b0297e2cc6d657b71effa942e0a368d8cc24293febb3"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d526aeea1bd6a442abc7c9b4b00386fd70253b80d54a0930c0a216230a35be"}, + {file = "SQLAlchemy-1.4.50.tar.gz", hash = "sha256:3b97ddf509fc21e10b09403b5219b06c5b558b27fc2453150274fa4e70707dbf"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] @@ -2503,13 +2493,13 @@ sqlcipher = ["sqlcipher3-binary"] [[package]] name = "tldextract" -version = "3.6.0" +version = "5.1.0" description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tldextract-3.6.0-py3-none-any.whl", hash = "sha256:30a492de80f4de215aa998588ba5c2e625ee74ace3a2705cfb52b0021053bcbe"}, - {file = "tldextract-3.6.0.tar.gz", hash = "sha256:a5d8b6583791daca268a7592ebcf764152fa49617983c49916ee9de99b366222"}, + {file = "tldextract-5.1.0-py3-none-any.whl", hash = "sha256:c8eecb15f556b43db6eebd21667640fb6fba9bc9539b48707432014913a78d13"}, + {file = "tldextract-5.1.0.tar.gz", hash = "sha256:366acfb099c7eb5dc83545c391d73da6e3afe4eaec652417c3cf13b002a160e1"}, ] [package.dependencies] @@ -2518,6 +2508,9 @@ idna = "*" requests = ">=2.1.0" requests-file = ">=1.4" +[package.extras] +testing = ["black", "mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ruff", "tox", "types-filelock", "types-requests"] + [[package]] name = "toml" version = "0.10.2" @@ -2689,13 +2682,13 @@ files = [ [[package]] name = "tzlocal" -version = "5.0.1" +version = "5.2" description = "tzinfo object for the local timezone" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, - {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, ] [package.dependencies] @@ -2703,32 +2696,32 @@ files = [ tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] [[package]] name = "urllib3" -version = "1.26.16" +version = "1.26.18" 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.*" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, + {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +brotli = ["brotli (==1.0.9)", "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)"] [[package]] name = "uwsgi" -version = "2.0.22" +version = "2.0.23" description = "The uWSGI server" optional = false python-versions = "*" files = [ - {file = "uwsgi-2.0.22.tar.gz", hash = "sha256:4cc4727258671ac5fa17ab422155e9aaef8a2008ebb86e4404b66deaae965db2"}, + {file = "uwsgi-2.0.23.tar.gz", hash = "sha256:0cafda0c16f921db7fe42cfaf81b167cf884ee17350efbdd87d1ecece2d7de37"}, ] [[package]] @@ -2784,13 +2777,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.9" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, + {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, ] [[package]] @@ -2894,22 +2887,7 @@ files = [ ] [package.extras] -watchdog = ["watchdog (>=2.3)"] - -[[package]] -name = "wheel" -version = "0.41.2" -description = "A built-package format for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.41.2-py3-none-any.whl", hash = "sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8"}, - {file = "wheel-0.41.2.tar.gz", hash = "sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)", "setuptools (>=65)"] +watchdog = ["watchdog"] [[package]] name = "xmltodict" @@ -3036,48 +3014,54 @@ files = [ [[package]] name = "zope-interface" -version = "6.0" +version = "6.1" description = "Interfaces for Python" optional = false python-versions = ">=3.7" files = [ - {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, - {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, - {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, - {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, - {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, - {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, - {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, - {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, - {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, - {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, - {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, - {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, - {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, - {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, - {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, + {file = "zope.interface-6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43b576c34ef0c1f5a4981163b551a8781896f2a37f71b8655fd20b5af0386abb"}, + {file = "zope.interface-6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67be3ca75012c6e9b109860820a8b6c9a84bfb036fbd1076246b98e56951ca92"}, + {file = "zope.interface-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b9bc671626281f6045ad61d93a60f52fd5e8209b1610972cf0ef1bbe6d808e3"}, + {file = "zope.interface-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe81def9cf3e46f16ce01d9bfd8bea595e06505e51b7baf45115c77352675fd"}, + {file = "zope.interface-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dc998f6de015723196a904045e5a2217f3590b62ea31990672e31fbc5370b41"}, + {file = "zope.interface-6.1-cp310-cp310-win_amd64.whl", hash = "sha256:239a4a08525c080ff833560171d23b249f7f4d17fcbf9316ef4159f44997616f"}, + {file = "zope.interface-6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ffdaa5290422ac0f1688cb8adb1b94ca56cee3ad11f29f2ae301df8aecba7d1"}, + {file = "zope.interface-6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34c15ca9248f2e095ef2e93af2d633358c5f048c49fbfddf5fdfc47d5e263736"}, + {file = "zope.interface-6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b012d023b4fb59183909b45d7f97fb493ef7a46d2838a5e716e3155081894605"}, + {file = "zope.interface-6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97806e9ca3651588c1baaebb8d0c5ee3db95430b612db354c199b57378312ee8"}, + {file = "zope.interface-6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddbab55a2473f1d3b8833ec6b7ac31e8211b0aa608df5ab09ce07f3727326de"}, + {file = "zope.interface-6.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0da79117952a9a41253696ed3e8b560a425197d4e41634a23b1507efe3273f1"}, + {file = "zope.interface-6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8bb9c990ca9027b4214fa543fd4025818dc95f8b7abce79d61dc8a2112b561a"}, + {file = "zope.interface-6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b51b64432eed4c0744241e9ce5c70dcfecac866dff720e746d0a9c82f371dfa7"}, + {file = "zope.interface-6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa6fd016e9644406d0a61313e50348c706e911dca29736a3266fc9e28ec4ca6d"}, + {file = "zope.interface-6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c8cf55261e15590065039696607f6c9c1aeda700ceee40c70478552d323b3ff"}, + {file = "zope.interface-6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e30506bcb03de8983f78884807e4fd95d8db6e65b69257eea05d13d519b83ac0"}, + {file = "zope.interface-6.1-cp312-cp312-win_amd64.whl", hash = "sha256:e33e86fd65f369f10608b08729c8f1c92ec7e0e485964670b4d2633a4812d36b"}, + {file = "zope.interface-6.1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:2f8d89721834524a813f37fa174bac074ec3d179858e4ad1b7efd4401f8ac45d"}, + {file = "zope.interface-6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13b7d0f2a67eb83c385880489dbb80145e9d344427b4262c49fbf2581677c11c"}, + {file = "zope.interface-6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef43ee91c193f827e49599e824385ec7c7f3cd152d74cb1dfe02cb135f264d83"}, + {file = "zope.interface-6.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e441e8b7d587af0414d25e8d05e27040d78581388eed4c54c30c0c91aad3a379"}, + {file = "zope.interface-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89b28772fc2562ed9ad871c865f5320ef761a7fcc188a935e21fe8b31a38ca9"}, + {file = "zope.interface-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70d2cef1bf529bff41559be2de9d44d47b002f65e17f43c73ddefc92f32bf00f"}, + {file = "zope.interface-6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ad54ed57bdfa3254d23ae04a4b1ce405954969c1b0550cc2d1d2990e8b439de1"}, + {file = "zope.interface-6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef467d86d3cfde8b39ea1b35090208b0447caaabd38405420830f7fd85fbdd56"}, + {file = "zope.interface-6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af47f10cfc54c2ba2d825220f180cc1e2d4914d783d6fc0cd93d43d7bc1c78b"}, + {file = "zope.interface-6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9559138690e1bd4ea6cd0954d22d1e9251e8025ce9ede5d0af0ceae4a401e43"}, + {file = "zope.interface-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:964a7af27379ff4357dad1256d9f215047e70e93009e532d36dcb8909036033d"}, + {file = "zope.interface-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:387545206c56b0315fbadb0431d5129c797f92dc59e276b3ce82db07ac1c6179"}, + {file = "zope.interface-6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57d0a8ce40ce440f96a2c77824ee94bf0d0925e6089df7366c2272ccefcb7941"}, + {file = "zope.interface-6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ebc4d34e7620c4f0da7bf162c81978fce0ea820e4fa1e8fc40ee763839805f3"}, + {file = "zope.interface-6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a804abc126b33824a44a7aa94f06cd211a18bbf31898ba04bd0924fbe9d282d"}, + {file = "zope.interface-6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f294a15f7723fc0d3b40701ca9b446133ec713eafc1cc6afa7b3d98666ee1ac"}, + {file = "zope.interface-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a41f87bb93b8048fe866fa9e3d0c51e27fe55149035dcf5f43da4b56732c0a40"}, + {file = "zope.interface-6.1.tar.gz", hash = "sha256:2fdc7ccbd6eb6b7df5353012fbed6c3c5d04ceaca0038f75e601060e95345309"}, ] [package.dependencies] setuptools = "*" [package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface"] +docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] From 3e16aac3331bd57839aa534a42450ca00f45e3fd Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 19:45:40 +0000 Subject: [PATCH 269/301] logic for #45 --- soscan/spiders/jsonldspider.py | 43 +++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 0239748e..33b497d4 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -54,6 +54,7 @@ def __init__(self, *args, **kwargs): if not urls is None: self.sitemap_urls = urls.split(" ") self.lastmod_filter = kwargs.get("lastmod", None) + self.start_point = kwargs.get("start_point", None) if len(self.sitemap_urls) < 1: raise ValueError("At least one sitemap URL is required.") if self.lastmod_filter is not None: @@ -96,6 +97,8 @@ def from_crawler(cls, crawler, *args, **kwargs): _cs[s], settings={"RETURN_AS_TIMEZONE_AWARE": True}, ) + if s in "start_point": + spider.start_point = _cs.get(s, None) return spider def sitemap_filter(self, entries): @@ -114,24 +117,32 @@ def sitemap_filter(self, entries): Returns: None """ + i = 0 for entry in entries: - ts = entry.get("lastmod", None) - if not ts is None: - # convert TS to a datetime for comparison - ts = dateparser.parse( - ts, - settings={"RETURN_AS_TIMEZONE_AWARE": True}, - ) - # preserve the converted timestamp in the entry - entry["lastmod"] = ts - - if self.lastmod_filter is not None and ts is not None: - if ts > self.lastmod_filter: - yield entry + i += 1 + if ((self.start_point is not None) and (self.start_point >= i)) or (self.start_point is None): + if self.start_point == i: + self.logger.info(f'Starting scrape at record {i}') + ts = entry.get("lastmod", None) + if not ts is None: + # convert TS to a datetime for comparison + ts = dateparser.parse( + ts, + settings={"RETURN_AS_TIMEZONE_AWARE": True}, + ) + # preserve the converted timestamp in the entry + entry["lastmod"] = ts + + if self.lastmod_filter is not None and ts is not None: + if ts > self.lastmod_filter: + yield entry + else: + self.logger.debug(f'lastmod_filter skipping record {i}: {entry}') else: - self.logger.debug(f'lastmod_filter skipping {entry}') - else: - yield entry + yield entry + if (self.start_point is not None) and (self.start_point < i): + if i == 1: + self.logger.info(f'Skipping to start_point at record {self.start_point}') def parse(self, response, **kwargs): """ From a2235cbd928e0685acccb931b4c3a93e4d04d56f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 19:52:57 +0000 Subject: [PATCH 270/301] Added debug logging to `sitemap_filter` (#45) --- soscan/spiders/jsonldspider.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 33b497d4..4c3ff7d6 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -135,6 +135,7 @@ def sitemap_filter(self, entries): if self.lastmod_filter is not None and ts is not None: if ts > self.lastmod_filter: + self.logger.debug(f'Yielding record {i}: {entry}') yield entry else: self.logger.debug(f'lastmod_filter skipping record {i}: {entry}') @@ -143,6 +144,7 @@ def sitemap_filter(self, entries): if (self.start_point is not None) and (self.start_point < i): if i == 1: self.logger.info(f'Skipping to start_point at record {self.start_point}') + self.logger.debug(f'start_point skipping record {i}: {entry}') def parse(self, response, **kwargs): """ From 08ac602297264125af82b9300544a9ac59661ba0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 19:59:55 +0000 Subject: [PATCH 271/301] adding timestamp to debug message (#45) --- soscan/spiders/jsonldspider.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 4c3ff7d6..bbd8ddc1 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -135,10 +135,10 @@ def sitemap_filter(self, entries): if self.lastmod_filter is not None and ts is not None: if ts > self.lastmod_filter: - self.logger.debug(f'Yielding record {i}: {entry}') + self.logger.debug(f'Yielding record {i}: (ts {ts}) {entry}') yield entry else: - self.logger.debug(f'lastmod_filter skipping record {i}: {entry}') + self.logger.debug(f'lastmod_filter skipping record {i}: (ts {ts}) {entry}') else: yield entry if (self.start_point is not None) and (self.start_point < i): From ed7b18b39a4f521ebace07d12f3bb1ab277d9b19 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 20:47:08 +0000 Subject: [PATCH 272/301] updating test sitemap (#45, DataONEorg/sonormal#4) --- tests/testHDsitemap.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/testHDsitemap.xml b/tests/testHDsitemap.xml index 051e1c66..a512fbad 100644 --- a/tests/testHDsitemap.xml +++ b/tests/testHDsitemap.xml @@ -8,4 +8,8 @@ https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/XFUVJJ 2023-09-26 + + https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/4NLGYN + 2021-05-10 + \ No newline at end of file From 9b2c0c0da9f9e5b584bc99f41b1349b1b35b34c8 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 20:54:27 +0000 Subject: [PATCH 273/301] switching gt/lt signs (#45) --- soscan/spiders/jsonldspider.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index bbd8ddc1..de26a1f4 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -120,7 +120,7 @@ def sitemap_filter(self, entries): i = 0 for entry in entries: i += 1 - if ((self.start_point is not None) and (self.start_point >= i)) or (self.start_point is None): + if ((self.start_point is not None) and (self.start_point <= i)) or (self.start_point is None): if self.start_point == i: self.logger.info(f'Starting scrape at record {i}') ts = entry.get("lastmod", None) @@ -141,7 +141,7 @@ def sitemap_filter(self, entries): self.logger.debug(f'lastmod_filter skipping record {i}: (ts {ts}) {entry}') else: yield entry - if (self.start_point is not None) and (self.start_point < i): + if (self.start_point is not None) and (self.start_point > i): if i == 1: self.logger.info(f'Skipping to start_point at record {self.start_point}') self.logger.debug(f'start_point skipping record {i}: {entry}') From afee14306af48e7c8c8cb1563aeb86c338deed0c Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 21:03:00 +0000 Subject: [PATCH 274/301] adding more verbose logging for #45 --- soscan/spiders/jsonldspider.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index de26a1f4..d1f3c51c 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -135,11 +135,12 @@ def sitemap_filter(self, entries): if self.lastmod_filter is not None and ts is not None: if ts > self.lastmod_filter: - self.logger.debug(f'Yielding record {i}: (ts {ts}) {entry}') + self.logger.debug(f'Yielding record {i}: {entry}') yield entry else: self.logger.debug(f'lastmod_filter skipping record {i}: (ts {ts}) {entry}') else: + self.logger.debug(f'Yielding record {i}: {entry}') yield entry if (self.start_point is not None) and (self.start_point > i): if i == 1: From b6d98e5dd71e6b0379aa8e4bf5be98646e534bc3 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 22:16:17 +0000 Subject: [PATCH 275/301] fixing no identifier bug (#47) --- soscan/sonormalizepipeline.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index 0953f0f4..cdc52c1b 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -62,16 +62,36 @@ def process_item(self, item, spider): # Use the first identifier value provided for series_id # PID will be computed from the object checksum - item["alt_identifiers"] = None + item["series_id"] = None + item["alt_identifiers"] = [] if len(ids) > 0: + self.logger.debug(f"ids found: {ids}") if len(ids[0]["identifier"]) > 0: item["series_id"] = ids[0]["identifier"][0] + self.logger.debug(f'Using first identifier for series_id: {item["series_id"]}') if len(ids[0]["identifier"]) > 1: item["alt_identifiers"] = ids[0]["identifier"][1:] - elif require_identifier: - raise scrapy.exceptions.DropItem( - f"JSON-LD no identifier: {item['url']}" - ) + self.logger.debug(f'alt_identifiers: {item["alt_identifiers"]}') + else: + # if the first identifier is an empty list, we need to look for others + self.logger.debug(f'Empty identifier in first grouping') + g = 0 + for group in ids: + g += 1 + self.logger.debug(f'Grouping {g}: {group}') + if len(group["identifier"]) > 0: + if item["series_id"] is None: + item["series_id"] = group["identifier"][0] + self.logger.debug(f'Using identifier {g} for series_id: {item["series_id"]}') + if len(group["identifier"]) > 1: + item["alt_identifiers"].append(group["identifier"][1:]) + else: + item["alt_identifiers"].append(group["identifier"][0:]) + self.logger.debug(f'alt_identifiers: {item["alt_identifiers"]}') + if require_identifier and item["series_id"] is None: + raise scrapy.exceptions.DropItem( + f"JSON-LD no identifier: {item['url']}" + ) item["identifier"] = None item["normalized"] = normalized item["format_id"] = opersist.rdfutils.DATASET_FORMATID From 836ad07c0fd32ad5bd4751608876fd6833dde871 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 22:55:33 +0000 Subject: [PATCH 276/301] changing logging levels for #47 --- soscan/sonormalizepipeline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index cdc52c1b..761cbb9b 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -74,11 +74,11 @@ def process_item(self, item, spider): self.logger.debug(f'alt_identifiers: {item["alt_identifiers"]}') else: # if the first identifier is an empty list, we need to look for others - self.logger.debug(f'Empty identifier in first grouping') + self.logger.warning(f'Empty identifier in first Dataset grouping') g = 0 for group in ids: g += 1 - self.logger.debug(f'Grouping {g}: {group}') + self.logger.info(f'Dataset grouping {g}: {group}') if len(group["identifier"]) > 0: if item["series_id"] is None: item["series_id"] = group["identifier"][0] From 606b46a6e4db71443b1beb8b2e153663a5e7eed9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Fri, 10 Nov 2023 22:58:52 +0000 Subject: [PATCH 277/301] changing logging levels for #47 --- soscan/sonormalizepipeline.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index cdc52c1b..f4dff469 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -74,15 +74,15 @@ def process_item(self, item, spider): self.logger.debug(f'alt_identifiers: {item["alt_identifiers"]}') else: # if the first identifier is an empty list, we need to look for others - self.logger.debug(f'Empty identifier in first grouping') + self.logger.warning(f'Empty identifier in first Dataset grouping') g = 0 for group in ids: g += 1 - self.logger.debug(f'Grouping {g}: {group}') + self.logger.info(f'Dataset grouping {g}: {group}') if len(group["identifier"]) > 0: if item["series_id"] is None: item["series_id"] = group["identifier"][0] - self.logger.debug(f'Using identifier {g} for series_id: {item["series_id"]}') + self.logger.info(f'Using identifier {g} for series_id: {item["series_id"]}') if len(group["identifier"]) > 1: item["alt_identifiers"].append(group["identifier"][1:]) else: From 01ed5d0730eeb053c0373eea061199fea25dcc3f Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 16 Nov 2023 22:24:04 +0000 Subject: [PATCH 278/301] addressing #49 --- soscan/sonormalizepipeline.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index f4dff469..8d24b7e0 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -92,6 +92,10 @@ def process_item(self, item, spider): raise scrapy.exceptions.DropItem( f"JSON-LD no identifier: {item['url']}" ) + if item["series_id"] == "doi:": + raise scrapy.exceptions.DropItem( + f"JSON-LD identifier empty: {item['url']}" + ) item["identifier"] = None item["normalized"] = normalized item["format_id"] = opersist.rdfutils.DATASET_FORMATID From 1a1e941081b2cc2def25dc2ea457edf85dbec7ca Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Nov 2023 15:48:24 +0000 Subject: [PATCH 279/301] adding code for #50 --- soscan/spiders/jsonldspider.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index d1f3c51c..644d737c 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -54,7 +54,8 @@ def __init__(self, *args, **kwargs): if not urls is None: self.sitemap_urls = urls.split(" ") self.lastmod_filter = kwargs.get("lastmod", None) - self.start_point = kwargs.get("start_point", None) + self.start_point = None + self.url_match = None if len(self.sitemap_urls) < 1: raise ValueError("At least one sitemap URL is required.") if self.lastmod_filter is not None: @@ -99,6 +100,8 @@ def from_crawler(cls, crawler, *args, **kwargs): ) if s in "start_point": spider.start_point = _cs.get(s, None) + if s in "url_match": + spider.url_match = _cs.get(s, None) return spider def sitemap_filter(self, entries): @@ -135,13 +138,27 @@ def sitemap_filter(self, entries): if self.lastmod_filter is not None and ts is not None: if ts > self.lastmod_filter: - self.logger.debug(f'Yielding record {i}: {entry}') - yield entry + if self.url_match: + if self.url_match in entry['loc']: + self.logger.debug(f'Yielding record {i}: {entry}') + yield entry + else: + self.logger.debug(f'url_match skipping record {i}: {self.url_match} not in {entry}') + else: + self.logger.debug(f'Yielding record {i}: {entry}') + yield entry else: self.logger.debug(f'lastmod_filter skipping record {i}: (ts {ts}) {entry}') else: - self.logger.debug(f'Yielding record {i}: {entry}') - yield entry + if self.url_match: + if self.url_match in entry['loc']: + self.logger.debug(f'Yielding record {i}: {entry}') + yield entry + else: + self.logger.debug(f'url_match skipping record {i}: {self.url_match} not in {entry}') + else: + self.logger.debug(f'Yielding record {i}: {entry["loc"]}') + yield entry if (self.start_point is not None) and (self.start_point > i): if i == 1: self.logger.info(f'Skipping to start_point at record {self.start_point}') From 8ca1987d82941b7f7a173fd6d588e9fb333f83f6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Nov 2023 15:58:49 +0000 Subject: [PATCH 280/301] adding logic for #51 --- soscan/spiders/jsonldspider.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 644d737c..d8f73a68 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -56,6 +56,7 @@ def __init__(self, *args, **kwargs): self.lastmod_filter = kwargs.get("lastmod", None) self.start_point = None self.url_match = None + self.reversed = None if len(self.sitemap_urls) < 1: raise ValueError("At least one sitemap URL is required.") if self.lastmod_filter is not None: @@ -102,6 +103,8 @@ def from_crawler(cls, crawler, *args, **kwargs): spider.start_point = _cs.get(s, None) if s in "url_match": spider.url_match = _cs.get(s, None) + if s in "reversed": + spider.reversed = _cs.get(s, None) return spider def sitemap_filter(self, entries): @@ -121,6 +124,8 @@ def sitemap_filter(self, entries): Returns: None """ i = 0 + if self.reversed: + entries = reversed(entries) for entry in entries: i += 1 if ((self.start_point is not None) and (self.start_point <= i)) or (self.start_point is None): From 888ee6c73191863e540b1d644cdc4eac50065382 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Nov 2023 16:04:17 +0000 Subject: [PATCH 281/301] adding enhanced logging for #51 --- soscan/spiders/jsonldspider.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index d8f73a68..051c7bc7 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -123,8 +123,11 @@ def sitemap_filter(self, entries): Returns: None """ + y = 0 i = 0 + self.logger.info(f'Total number of sitemap entries: {len(entries)}') if self.reversed: + self.logger.info(f'Reading the sitemap in reverse order') entries = reversed(entries) for entry in entries: i += 1 @@ -146,11 +149,13 @@ def sitemap_filter(self, entries): if self.url_match: if self.url_match in entry['loc']: self.logger.debug(f'Yielding record {i}: {entry}') + y += 1 yield entry else: self.logger.debug(f'url_match skipping record {i}: {self.url_match} not in {entry}') else: self.logger.debug(f'Yielding record {i}: {entry}') + y += 1 yield entry else: self.logger.debug(f'lastmod_filter skipping record {i}: (ts {ts}) {entry}') @@ -158,16 +163,19 @@ def sitemap_filter(self, entries): if self.url_match: if self.url_match in entry['loc']: self.logger.debug(f'Yielding record {i}: {entry}') + y += 1 yield entry else: self.logger.debug(f'url_match skipping record {i}: {self.url_match} not in {entry}') else: self.logger.debug(f'Yielding record {i}: {entry["loc"]}') + y += 1 yield entry if (self.start_point is not None) and (self.start_point > i): if i == 1: self.logger.info(f'Skipping to start_point at record {self.start_point}') self.logger.debug(f'start_point skipping record {i}: {entry}') + self.logger.info(f'Yielded entries from sitemap: {y}') def parse(self, response, **kwargs): """ From f9fcc6f74e4b6c4882a4b220fa2540ffde233ae5 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Nov 2023 16:20:12 +0000 Subject: [PATCH 282/301] debugging for #51 --- soscan/spiders/jsonldspider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 051c7bc7..d276e079 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -125,7 +125,6 @@ def sitemap_filter(self, entries): """ y = 0 i = 0 - self.logger.info(f'Total number of sitemap entries: {len(entries)}') if self.reversed: self.logger.info(f'Reading the sitemap in reverse order') entries = reversed(entries) @@ -175,6 +174,7 @@ def sitemap_filter(self, entries): if i == 1: self.logger.info(f'Skipping to start_point at record {self.start_point}') self.logger.debug(f'start_point skipping record {i}: {entry}') + self.logger.info(f'Total number of sitemap entries: {i}') self.logger.info(f'Yielded entries from sitemap: {y}') def parse(self, response, **kwargs): From 9cf0b94682ed34343deffda3d235a24517640c77 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Nov 2023 16:35:35 +0000 Subject: [PATCH 283/301] debugging for #51 --- soscan/spiders/jsonldspider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index d276e079..a85ebf17 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -127,7 +127,7 @@ def sitemap_filter(self, entries): i = 0 if self.reversed: self.logger.info(f'Reading the sitemap in reverse order') - entries = reversed(entries) + entries = reversed(entries.__iter__()) for entry in entries: i += 1 if ((self.start_point is not None) and (self.start_point <= i)) or (self.start_point is None): From 451dca45deaa23182034b31eba439fd48ea63f67 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Nov 2023 16:40:11 +0000 Subject: [PATCH 284/301] more debugging for #51; reversing generator --- soscan/spiders/jsonldspider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index a85ebf17..1263bebf 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -127,7 +127,7 @@ def sitemap_filter(self, entries): i = 0 if self.reversed: self.logger.info(f'Reading the sitemap in reverse order') - entries = reversed(entries.__iter__()) + entries = reversed(list(entries.__iter__())) for entry in entries: i += 1 if ((self.start_point is not None) and (self.start_point <= i)) or (self.start_point is None): From 737c92351e6126f21ebb2707ef462df98b7caf22 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 20 Nov 2023 16:44:24 +0000 Subject: [PATCH 285/301] enhanced logging for #51 --- soscan/spiders/jsonldspider.py | 1 + 1 file changed, 1 insertion(+) diff --git a/soscan/spiders/jsonldspider.py b/soscan/spiders/jsonldspider.py index 1263bebf..b1e73db6 100644 --- a/soscan/spiders/jsonldspider.py +++ b/soscan/spiders/jsonldspider.py @@ -128,6 +128,7 @@ def sitemap_filter(self, entries): if self.reversed: self.logger.info(f'Reading the sitemap in reverse order') entries = reversed(list(entries.__iter__())) + self.logger.info(f'Entries in reversed sitemap list: {len(entries)}') for entry in entries: i += 1 if ((self.start_point is not None) and (self.start_point <= i)) or (self.start_point is None): From 157c72ed1be23e81f5fdb0cdde62047a3c54b506 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 22 Nov 2023 22:46:28 +0000 Subject: [PATCH 286/301] logic for #52 --- soscan/sonormalizepipeline.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index 8d24b7e0..2ce47ec4 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -4,6 +4,18 @@ import json import opersist.rdfutils +def consolidate_list(l: list, sep: str=', '): + """ + Takes a list of strings and returns a list with one consolidated string, + separated by ``sep``. This can help when a repository has mistakenly + split their description/title strings. + """ + consolidated = '' + for li in l: + consolidated += sep + consolidated += li + return [consolidated] + class SoscanNormalizePipeline: """ @@ -46,6 +58,19 @@ def process_item(self, item, spider): except Exception as e: raise scrapy.exceptions.DropItem(f"JSON-LD normalization failed: {e}") + # consolidate any lists that might cause the indexer to misfire + if (isinstance(normalized["@graph"]["name"], list)) and (len(normalized["@graph"]["name"]) > 1): + l = normalized["@graph"]["name"] + self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"]["name"]: {l}') + normalized["@graph"]["name"] = consolidate_list(normalized["@graph"]["name"]) + self.logger.debug(f'New list at ["@graph"]["name"]: {normalized["@graph"]["name"]}') + + if (isinstance(normalized["@graph"]["description"], list)) and (len(normalized["@graph"]["description"]) > 1): + l = normalized["@graph"]["description"] + self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"]["description"]: {l}') + normalized["@graph"]["description"] = consolidate_list(normalized["@graph"]["description"]) + self.logger.debug(f'New list at ["@graph"]["description"]: {normalized["@graph"]["description"]}') + ids = [] try: _framed = sonormal.normalize.frameSODataset(normalized, options=options) From 4494316988bcb0e4bd5b738a33d7310351ed747d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 22 Nov 2023 22:57:54 +0000 Subject: [PATCH 287/301] debugging for #52 --- soscan/sonormalizepipeline.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index 2ce47ec4..9e608fff 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -59,17 +59,17 @@ def process_item(self, item, spider): raise scrapy.exceptions.DropItem(f"JSON-LD normalization failed: {e}") # consolidate any lists that might cause the indexer to misfire - if (isinstance(normalized["@graph"]["name"], list)) and (len(normalized["@graph"]["name"]) > 1): - l = normalized["@graph"]["name"] - self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"]["name"]: {l}') - normalized["@graph"]["name"] = consolidate_list(normalized["@graph"]["name"]) - self.logger.debug(f'New list at ["@graph"]["name"]: {normalized["@graph"]["name"]}') + if (isinstance(normalized["@graph"][0]["name"], list)) and (len(normalized["@graph"][0]["name"]) > 1): + l = normalized["@graph"][0]["name"] + self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"][0]["name"]: {l}') + normalized["@graph"][0]["name"] = consolidate_list(normalized["@graph"][0]["name"]) + self.logger.debug(f'New list at ["@graph"][0]["name"]: {normalized["@graph"][0]["name"]}') - if (isinstance(normalized["@graph"]["description"], list)) and (len(normalized["@graph"]["description"]) > 1): - l = normalized["@graph"]["description"] - self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"]["description"]: {l}') - normalized["@graph"]["description"] = consolidate_list(normalized["@graph"]["description"]) - self.logger.debug(f'New list at ["@graph"]["description"]: {normalized["@graph"]["description"]}') + if (isinstance(normalized["@graph"][0]["description"], list)) and (len(normalized["@graph"][0]["description"]) > 1): + l = normalized["@graph"][0]["description"] + self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"][0]["description"]: {l}') + normalized["@graph"][0]["description"] = consolidate_list(normalized["@graph"][0]["description"]) + self.logger.debug(f'New list at ["@graph"][0]["description"]: {normalized["@graph"][0]["description"]}') ids = [] try: From eefc496ec7560696905eaeb36aacf655375c7411 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 22 Nov 2023 23:03:45 +0000 Subject: [PATCH 288/301] moving jsonld correction before normalization (#52) --- soscan/sonormalizepipeline.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index 9e608fff..a86af54f 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -53,23 +53,25 @@ def process_item(self, item, spider): jldversion = f'json-ld-{version}' self.logger.debug(f"process_item: version {jldversion}") options = {"base": item["url"], "processingMode": jldversion} - try: - normalized = sonormal.sosoNormalize(jsonld, options=options) - except Exception as e: - raise scrapy.exceptions.DropItem(f"JSON-LD normalization failed: {e}") # consolidate any lists that might cause the indexer to misfire - if (isinstance(normalized["@graph"][0]["name"], list)) and (len(normalized["@graph"][0]["name"]) > 1): - l = normalized["@graph"][0]["name"] + if (isinstance(jsonld["@graph"][0]["name"], list)) and (len(jsonld["@graph"][0]["name"]) > 1): + l = jsonld["@graph"][0]["name"] self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"][0]["name"]: {l}') - normalized["@graph"][0]["name"] = consolidate_list(normalized["@graph"][0]["name"]) - self.logger.debug(f'New list at ["@graph"][0]["name"]: {normalized["@graph"][0]["name"]}') + jsonld["@graph"][0]["name"] = consolidate_list(jsonld["@graph"][0]["name"]) + self.logger.debug(f'New list at ["@graph"][0]["name"]: {jsonld["@graph"][0]["name"]}') - if (isinstance(normalized["@graph"][0]["description"], list)) and (len(normalized["@graph"][0]["description"]) > 1): - l = normalized["@graph"][0]["description"] + if (isinstance(jsonld["@graph"][0]["description"], list)) and (len(jsonld["@graph"][0]["description"]) > 1): + l = jsonld["@graph"][0]["description"] self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"][0]["description"]: {l}') - normalized["@graph"][0]["description"] = consolidate_list(normalized["@graph"][0]["description"]) - self.logger.debug(f'New list at ["@graph"][0]["description"]: {normalized["@graph"][0]["description"]}') + jsonld["@graph"][0]["description"] = consolidate_list(jsonld["@graph"][0]["description"]) + self.logger.debug(f'New list at ["@graph"][0]["description"]: {jsonld["@graph"][0]["description"]}') + + try: + normalized = sonormal.sosoNormalize(jsonld, options=options) + except Exception as e: + raise scrapy.exceptions.DropItem(f"JSON-LD normalization failed: {e}") + ids = [] try: From 5da7462de7692d5272f885a141bf71cf798138b6 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 22 Nov 2023 23:11:01 +0000 Subject: [PATCH 289/301] adding a first-time-through exception (#52) --- soscan/sonormalizepipeline.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index a86af54f..8045d7e4 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -12,7 +12,8 @@ def consolidate_list(l: list, sep: str=', '): """ consolidated = '' for li in l: - consolidated += sep + if consolidated != '': + consolidated += sep consolidated += li return [consolidated] From 41b6602137b93b124b9129dceb91b379ffd14c86 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Mon, 27 Nov 2023 19:09:18 +0000 Subject: [PATCH 290/301] handling #52 in cases where jsonld has no `@graph` --- soscan/sonormalizepipeline.py | 53 +++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/soscan/sonormalizepipeline.py b/soscan/sonormalizepipeline.py index 8045d7e4..5ab21682 100644 --- a/soscan/sonormalizepipeline.py +++ b/soscan/sonormalizepipeline.py @@ -56,17 +56,48 @@ def process_item(self, item, spider): options = {"base": item["url"], "processingMode": jldversion} # consolidate any lists that might cause the indexer to misfire - if (isinstance(jsonld["@graph"][0]["name"], list)) and (len(jsonld["@graph"][0]["name"]) > 1): - l = jsonld["@graph"][0]["name"] - self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"][0]["name"]: {l}') - jsonld["@graph"][0]["name"] = consolidate_list(jsonld["@graph"][0]["name"]) - self.logger.debug(f'New list at ["@graph"][0]["name"]: {jsonld["@graph"][0]["name"]}') - - if (isinstance(jsonld["@graph"][0]["description"], list)) and (len(jsonld["@graph"][0]["description"]) > 1): - l = jsonld["@graph"][0]["description"] - self.logger.debug(f'Consolidating list of {len(l)} items at ["@graph"][0]["description"]: {l}') - jsonld["@graph"][0]["description"] = consolidate_list(jsonld["@graph"][0]["description"]) - self.logger.debug(f'New list at ["@graph"][0]["description"]: {jsonld["@graph"][0]["description"]}') + name = jsonld.get('name', None) + desc = jsonld.get('description', None) + nstr, dstr = '[none]', '[none]' + if name == None: + graph = jsonld.get('@graph', None) + if graph and isinstance(graph, list): + name = graph[0].get('name', None) + desc = graph[0].get('description', None) + nstr = 'jsonld["@graph"][0]["name"]' + dstr = 'jsonld["@graph"][0]["description"]' + elif graph: + # this probably doesn't exist..? try to get vars anyway + self.logger.warn(f'Something weird has happened: the dataset graph at jsonld["@graph"] is not a list but instead {type(graph)}\nURL: {item["url"]}') + self.logger.debug(f'Content of jsonld["@graph"]: {graph}') + try: + name = graph.get('name', None) + desc = graph.get('description', None) + except Exception as e: + raise scrapy.exceptions.DropItem(f"JSON-LD error ({repr(e)}): {e} - URL: {item['url']}") + nstr = 'jsonld["@graph"]["name"]' + dstr = 'jsonld["@graph"]["description"]' + else: + nstr = 'jsonld["name"]' + dstr = 'jsonld["description"]' + + if name: + if (isinstance(name, list)) and (len(name) > 1): + self.logger.debug(f'Consolidating list of {len(name)} items at {nstr}: {name}') + # can't think of a better way to do this + exec(f'{nstr} = consolidate_list(name)') + self.logger.debug(f'New list at {nstr}: {name}') + else: + raise scrapy.exceptions.DropItem(f"JSON-LD no dataset name found: {item['url']}") + + if desc: + if (isinstance(desc, list)) and (len(desc) > 1): + self.logger.debug(f'Consolidating list of {len(desc)} items at {dstr}: {desc}') + exec(f'{dstr} = consolidate_list(desc)') + self.logger.debug(f'New list at {dstr}: {desc}') + else: + self.logger.warning(f'JSON-LD no dataset description found: {item["url"]}') + try: normalized = sonormal.sosoNormalize(jsonld, options=options) From 142b6f7e43f65f1e2de86ef59796bc87f9a72da9 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 10 Jan 2024 22:21:55 +0000 Subject: [PATCH 291/301] addressing #54 --- mnonboard/cli.py | 2 +- mnonboard/defs.py | 3 +++ mnonboard/utils.py | 10 ++++++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/mnonboard/cli.py b/mnonboard/cli.py index 87ea24e4..7fcbfbc4 100644 --- a/mnonboard/cli.py +++ b/mnonboard/cli.py @@ -72,7 +72,7 @@ def run(cfg): loc=loc, ssh=cfg['ssh']) time.sleep(0.5) - utils.upload_xml(ssh=ssh, server=SO_SRVR[cfg['mode']], files=files, node_id=node_id, loc=loc) + utils.upload_xml(ssh=ssh, server=CN_SRVR[cfg['mode']], files=files, node_id=node_id, loc=loc) # create and validate the subject in the accounts service (step 16) utils.create_subj_in_acct_svc(ssh=ssh, cert=cfg['cert_loc'], files=files, cn=cfg['cn_url'], loc=loc) utils.validate_subj_in_acct_svc(ssh=ssh, cert=cfg['cert_loc'], names=names, cn=cfg['cn_url'], loc=loc) diff --git a/mnonboard/defs.py b/mnonboard/defs.py index fde450e0..bdcd39fa 100644 --- a/mnonboard/defs.py +++ b/mnonboard/defs.py @@ -1,3 +1,4 @@ +import os, pwd from mnonboard import __version__ ORCID_PREFIX = 'http://orcid.org/' @@ -44,6 +45,8 @@ The location of the coordinating node. """ +USER_NAME = pwd.getpwuid(os.getuid())[0] + CN_SRVR_BASEURL = 'https://%s/cn' """ The URL format of the CN API. diff --git a/mnonboard/utils.py b/mnonboard/utils.py index fede21a3..c9b68a99 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -7,7 +7,7 @@ import xmltodict from pathlib import Path -from mnonboard.defs import SCHEDULES, NAMES_DICT, SUBJECT_PREFIX, SUBJECT_POSTFIX +from mnonboard.defs import SCHEDULES, NAMES_DICT, SUBJECT_PREFIX, SUBJECT_POSTFIX, USER_NAME from mnonboard import NODE_PATH_REL, CUR_PATH_ABS, LOG_DIR, HARVEST_LOG_NAME, HM_DATE, L from mnonboard.info_chx import cn_subj_lookup, local_subj_lookup, enter_schedule, orcid_name, set_role @@ -355,7 +355,7 @@ def start_ssh(server: str, node_id, loc: str, ssh: bool=True): L.error('%s running %s. Details: %s' % (repr(e), op, e)) return None, local_xml_dir, node_id -def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, server: str=None): +def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, usern: str=USER_NAME, server: str=None): """ Format subject XML documents and return list of names. @@ -377,10 +377,11 @@ def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, server: str= scp.put(files=files, remote_path=target_dir) else: cmd_fn = f"{loc}/commands.sh" + write_cmd_to(fn=cmd_fn, cmd=f'## Commands to be run on the MN:') write_cmd_to(fn=cmd_fn, cmd=f'mkdir -p {target_dir}', desc='Copy xml files from so server to cn', mode='w') - write_cmd_to(fn=cmd_fn, cmd=f'cd {target_dir}') + write_cmd_to(fn=cmd_fn, cmd=f'cd {target_dir}', desc=" ") for f in files: - command = f"scp mnlite@{server}:{f} {target_dir}" + command = f"scp {f} {usern}@{server}:{target_dir}" write_cmd_to(fn=cmd_fn, cmd=command) except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) @@ -409,6 +410,7 @@ def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str, loc else: L.debug(f'Command: {command}') L.info(f'Writing cmd to {cmd_fn}: subject creation') + write_cmd_to(fn=cmd_fn, cmd="## Commands to be run on the CN:") write_cmd_to(fn=cmd_fn, cmd=command, desc=f"Create subject: {f}") def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str, loc: str): From 7d1b97e78333af855fb99057d5c35d966aaa4efb Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Wed, 10 Jan 2024 22:41:56 +0000 Subject: [PATCH 292/301] cleaning up #54 fix --- mnonboard/utils.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mnonboard/utils.py b/mnonboard/utils.py index c9b68a99..07b6b0f1 100644 --- a/mnonboard/utils.py +++ b/mnonboard/utils.py @@ -377,12 +377,15 @@ def upload_xml(ssh: SSHClient, files: list, node_id: str, loc: str, usern: str=U scp.put(files=files, remote_path=target_dir) else: cmd_fn = f"{loc}/commands.sh" - write_cmd_to(fn=cmd_fn, cmd=f'## Commands to be run on the MN:') - write_cmd_to(fn=cmd_fn, cmd=f'mkdir -p {target_dir}', desc='Copy xml files from so server to cn', mode='w') - write_cmd_to(fn=cmd_fn, cmd=f'cd {target_dir}', desc=" ") + write_cmd_to(fn=cmd_fn, cmd=f'## Commands to be run on the CN:', mode='w') + write_cmd_to(fn=cmd_fn, cmd=f'mkdir -p {target_dir}', desc='Create and enter dir for xml files') + write_cmd_to(fn=cmd_fn, cmd=f'cd {target_dir}') + write_cmd_to(fn=cmd_fn, cmd=f'\n') + write_cmd_to(fn=cmd_fn, cmd=f'## Run on MN to transfer subject xml files to the CN (make sure username is correct):') for f in files: command = f"scp {f} {usern}@{server}:{target_dir}" write_cmd_to(fn=cmd_fn, cmd=command) + write_cmd_to(fn=cmd_fn, cmd=f'\n') except Exception as e: L.error('%s running %s. Details: %s' % (repr(e), op, e)) exit(1) @@ -410,7 +413,7 @@ def create_subj_in_acct_svc(ssh: SSHClient, cert: str, files: list, cn: str, loc else: L.debug(f'Command: {command}') L.info(f'Writing cmd to {cmd_fn}: subject creation') - write_cmd_to(fn=cmd_fn, cmd="## Commands to be run on the CN:") + write_cmd_to(fn=cmd_fn, cmd="## Commands to be run by an admin on the CN:") write_cmd_to(fn=cmd_fn, cmd=command, desc=f"Create subject: {f}") def validate_subj_in_acct_svc(ssh: SSHClient, cert: str, names: dict, cn: str, loc: str): From f6f9cdaf7cfe4227957238911373d89dfaa48f34 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 7 Mar 2024 00:12:17 +0000 Subject: [PATCH 293/301] adding test USAP-DC sitemap and JSON-LD --- tests/USAP-DC.jsonld | 79 +++++++++++++++++++++++++++++++++++++++ tests/testUSAPsitemap.xml | 7 ++++ 2 files changed, 86 insertions(+) create mode 100644 tests/USAP-DC.jsonld create mode 100644 tests/testUSAPsitemap.xml diff --git a/tests/USAP-DC.jsonld b/tests/USAP-DC.jsonld new file mode 100644 index 00000000..afada309 --- /dev/null +++ b/tests/USAP-DC.jsonld @@ -0,0 +1,79 @@ +{ + "@context": "https://schema.org/", + "@type": "Dataset", + "@id": "doi:TBD", + "additionalType": [ + "geolink:Dataset", + "vivo:Dataset" + ], + "name": "Polar MM5 model output over Antarctica and high-latitude Southern Ocean during 1993", + "description": "This gridded dataset consists of output from the Polar MM5, a version of the Pennsylvania State University / National Center for Atmospheric Research Fifth Generation Mesoscale Model (MM5; version 2) modified for use over extensive ice sheets. More information on the Polar MM5, including a model description and validation studies, is available at http://www-bprc.mps.ohio-state.edu. A series of 72-h non-hydrostatic forecasts are run for a 1-y period (Jan 1993-Dec 1993) overAntarctica and the high-latitude Southern Ocean. The first 24-h of each forecast are discarded for spin up. The horizontal grid resolution is 60-km, with 120 grid points in the x and y direction. The model topography data are interpolated from a 5-km resolution digital elevation model. The ice shelves are manually identified from climatic maps, and represented as permanent ice. The vertical resolution is represented by 28 sigma levels, with the lowest at 11-m above ground level. The initial and boundary conditions include 12-hourly ECMWF TOGA (2.5 deg) global analysis for the surface and upper air variables, 6-hourly ECMWF TOGA (1.125 deg) global analysis for sea surface temperature, and daily DMSP SSM/I polar gridded sea ice concentration (25-km) from the National Snow and Ice Data Center. Model output is in native MM5 format, and available variables are numerous, The reader is referred to the MM5 website for a complete list of variables, as well as detailed documentation and tools for reading and plotting the data. Go to the MM5 homepage at http://www.mmm.ucar.edu/mm5/mm5-home.html. This dataset is currently available upon request from the Polar Meteorology Group, Byrd Polar Research Center, Columbus, OH. Email David Bromwich (bromwich@polarmet1.mps.ohio-state.edu).", + "citation": "Bromwich, D. (1993) \"Polar MM5 model output over Antarctica and high-latitude Southern Ocean during 1993\" U.S. Antarctic Program (USAP) Data Center. doi: https://doi.org/.", + "datePublished": "1993-01-01", + "keywords": [], + "creator": [{ + "@type": "Person", + "additionalType": "geolink:Person", + "name": "Bromwich, David", + "email": "bromwich.1@osu.edu", + "affiliation": { + "@type": "Organization", + "name": null + } + }], + "distribution": [{ + "@type": "DataDownload", + "additionalType": "http://www.w3.org/ns/dcat#DataCatalog", + "encodingFormat": "text/xml", + "name": "ISO Metadata Document", + "url": "https://www.usap-dc.org/metadata/isoxml/600001iso.xml", + "contentUrl": "/dataset/filename" + }, + { + "@type": "DataDownload", + "@id": "http://dx.doi.org/TBD", + "additionalType": "dcat:distribution", + "url": "http://dx.doi.org/TBD", + "name": "landing page", + "description": "Link to a web page related to the resource.. Service Protocol: Link to a web page related to the resource.. Link Function: information", + "contentUrl": "/dataset/filename", + "encodingFormat": "text/html" + }, + { + "@type": "DataDownload", + "@id": "/view/dataset/600001", + "additionalType": "dcat:distribution", + "url": "/view/dataset/600001", + "name": "landing page", + "description": "Link to a web page related to the resource.. Service Protocol: Link to a web page related to the resource.. Link Function: information", + "contentUrl": "/dataset/filename", + "encodingFormat": "text/html" + }], + "identifier": { + "@type": "PropertyValue", + "propertyID": "dataset identifier", + "value": "doi:TBD" + }, + "contributor": [], + "license": [{ + "@type": "CreativeWork", + "URL": "https://creativecommons.org/licenses/by-nc-sa/3.0/us/", + "name": "MD_Constraints", + "description": "useLimitation: Creative Commons Attribution-NonCommercial-Share Alike 3.0 United States [CC BY-NC-SA 3.0]. " + }, + { + "@type": "CreativeWork", + "name": "MD_LegalConstraints", + "description": "accessConstraints: license. otherConstraints: Creative Commons Attribution-NonCommercial-Share Alike 3.0 United States [CC BY-NC-SA 3.0]. " + }, + { + "@type": "CreativeWork", + "name": "MD_SecurityConstraints", + "description": "classification: " + }], + "publisher": { + "@type": "Organization", + "name": "U.S. Antarctic Program (USAP) Data Center" + }, + "spatialCoverage": [] +} \ No newline at end of file diff --git a/tests/testUSAPsitemap.xml b/tests/testUSAPsitemap.xml new file mode 100644 index 00000000..99a8fd22 --- /dev/null +++ b/tests/testUSAPsitemap.xml @@ -0,0 +1,7 @@ + + + + https://github.com/DataONEorg/mnlite/blob/develop/tests/USAP-DC.jsonld + 2024-03-06 + + \ No newline at end of file From cf37370bc8580906755bcb5130dec16862986e20 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 7 Mar 2024 00:15:40 +0000 Subject: [PATCH 294/301] correcting test USAP sitemap url --- tests/testUSAPsitemap.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testUSAPsitemap.xml b/tests/testUSAPsitemap.xml index 99a8fd22..d79fc288 100644 --- a/tests/testUSAPsitemap.xml +++ b/tests/testUSAPsitemap.xml @@ -1,7 +1,7 @@ - https://github.com/DataONEorg/mnlite/blob/develop/tests/USAP-DC.jsonld + https://raw.githubusercontent.com/DataONEorg/mnlite/develop/tests/USAP-DC.jsonld 2024-03-06 \ No newline at end of file From b39b486189832673c92e53d6510744ecbf538038 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 7 Mar 2024 00:42:01 +0000 Subject: [PATCH 295/301] trying html embed instead of raw jsonld --- tests/{USAP-DC.jsonld => testUSAPjsonld.html} | 16 +++++++++++++++- tests/testUSAPsitemap.xml | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) rename tests/{USAP-DC.jsonld => testUSAPjsonld.html} (86%) diff --git a/tests/USAP-DC.jsonld b/tests/testUSAPjsonld.html similarity index 86% rename from tests/USAP-DC.jsonld rename to tests/testUSAPjsonld.html index afada309..e5f6159d 100644 --- a/tests/USAP-DC.jsonld +++ b/tests/testUSAPjsonld.html @@ -1,3 +1,13 @@ + + + + United States Antarctic Program Data Center (USAP-DC) + + + + + + + + + \ No newline at end of file diff --git a/tests/testUSAPsitemap.xml b/tests/testUSAPsitemap.xml index d79fc288..d2dc601d 100644 --- a/tests/testUSAPsitemap.xml +++ b/tests/testUSAPsitemap.xml @@ -1,7 +1,7 @@ - https://raw.githubusercontent.com/DataONEorg/mnlite/develop/tests/USAP-DC.jsonld + https://raw.githubusercontent.com/DataONEorg/mnlite/develop/tests/testUSAPjsonld.html 2024-03-06 \ No newline at end of file From 7c7ab45198394b06398bfe6ff36a07c04632293d Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 7 Mar 2024 01:06:05 +0000 Subject: [PATCH 296/301] adding second USAP dataset page with recommended changes --- ...tUSAPjsonld.html => testUSAPjsonld01.html} | 0 tests/testUSAPjsonld02.html | 94 +++++++++++++++++++ tests/testUSAPsitemap.xml | 6 +- 3 files changed, 99 insertions(+), 1 deletion(-) rename tests/{testUSAPjsonld.html => testUSAPjsonld01.html} (100%) create mode 100644 tests/testUSAPjsonld02.html diff --git a/tests/testUSAPjsonld.html b/tests/testUSAPjsonld01.html similarity index 100% rename from tests/testUSAPjsonld.html rename to tests/testUSAPjsonld01.html diff --git a/tests/testUSAPjsonld02.html b/tests/testUSAPjsonld02.html new file mode 100644 index 00000000..fd6b7da8 --- /dev/null +++ b/tests/testUSAPjsonld02.html @@ -0,0 +1,94 @@ + + + + United States Antarctic Program Data Center (USAP-DC) + + + + + + + + + \ No newline at end of file diff --git a/tests/testUSAPsitemap.xml b/tests/testUSAPsitemap.xml index d2dc601d..5d67a8b6 100644 --- a/tests/testUSAPsitemap.xml +++ b/tests/testUSAPsitemap.xml @@ -1,7 +1,11 @@ - https://raw.githubusercontent.com/DataONEorg/mnlite/develop/tests/testUSAPjsonld.html + https://raw.githubusercontent.com/DataONEorg/mnlite/develop/tests/testUSAPjsonld01.html + 2024-03-06 + + + https://raw.githubusercontent.com/DataONEorg/mnlite/develop/tests/testUSAPjsonld02.html 2024-03-06 \ No newline at end of file From 863edb86b55f1ae393245cd80a25e3563f8df432 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 7 Mar 2024 01:12:10 +0000 Subject: [PATCH 297/301] removing duplicate `@id` field --- tests/testUSAPjsonld02.html | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/testUSAPjsonld02.html b/tests/testUSAPjsonld02.html index fd6b7da8..a72f36b3 100644 --- a/tests/testUSAPjsonld02.html +++ b/tests/testUSAPjsonld02.html @@ -11,7 +11,6 @@ { "@context": "https://schema.org/", "@type": "Dataset", - "@id": "http://www.usap-dc.org/view/dataset/600001", "additionalType": [ "geolink:Dataset", "vivo:Dataset" @@ -36,14 +35,14 @@ "additionalType": "http://www.w3.org/ns/dcat#DataCatalog", "encodingFormat": "text/xml", "name": "ISO Metadata Document", - "url": "https://www.usap-dc.org/metadata/isoxml/600001iso.xml", + "url": "https://www.usap-dc.org/metadata/isoxml/600002iso.xml", "contentUrl": "/dataset/filename" }, { "@type": "DataDownload", - "@id": "http://dx.doi.org/600001", + "@id": "http://dx.doi.org/600002", "additionalType": "dcat:distribution", - "url": "http://dx.doi.org/600001", + "url": "http://dx.doi.org/600002", "name": "landing page", "description": "Link to a web page related to the resource.. Service Protocol: Link to a web page related to the resource.. Link Function: information", "contentUrl": "/dataset/filename", @@ -51,19 +50,19 @@ }, { "@type": "DataDownload", - "@id": "http://www.usap-dc.org/view/dataset/600001", + "@id": "http://www.usap-dc.org/view/dataset/600002", "additionalType": "dcat:distribution", - "url": "http://www.usap-dc.org/view/dataset/600001", + "url": "http://www.usap-dc.org/view/dataset/600002", "name": "landing page", "description": "Link to a web page related to the resource.. Service Protocol: Link to a web page related to the resource.. Link Function: information", "contentUrl": "/dataset/filename", "encodingFormat": "text/html" }], "identifier": { - "@id": "http://www.usap-dc.org/view/dataset/600001", + "@id": "http://www.usap-dc.org/view/dataset/600002", "@type": "PropertyValue", "propertyID": "dataset identifier", - "value": "doi:600001" + "value": "doi:600002" }, "contributor": [], "license": [{ From 9a93767f73855cf9376e7e0fc823b86245c17621 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 7 Mar 2024 01:39:57 +0000 Subject: [PATCH 298/301] removing duplicate `@id` field --- tests/testUSAPjsonld02.html | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/testUSAPjsonld02.html b/tests/testUSAPjsonld02.html index a72f36b3..5f0c8c05 100644 --- a/tests/testUSAPjsonld02.html +++ b/tests/testUSAPjsonld02.html @@ -11,6 +11,7 @@ { "@context": "https://schema.org/", "@type": "Dataset", + "@id": "http://www.usap-dc.org/view/dataset/601212", "additionalType": [ "geolink:Dataset", "vivo:Dataset" @@ -35,14 +36,14 @@ "additionalType": "http://www.w3.org/ns/dcat#DataCatalog", "encodingFormat": "text/xml", "name": "ISO Metadata Document", - "url": "https://www.usap-dc.org/metadata/isoxml/600002iso.xml", + "url": "https://www.usap-dc.org/metadata/isoxml/601212iso.xml", "contentUrl": "/dataset/filename" }, { "@type": "DataDownload", - "@id": "http://dx.doi.org/600002", + "@id": "http://dx.doi.org/601212", "additionalType": "dcat:distribution", - "url": "http://dx.doi.org/600002", + "url": "http://dx.doi.org/601212", "name": "landing page", "description": "Link to a web page related to the resource.. Service Protocol: Link to a web page related to the resource.. Link Function: information", "contentUrl": "/dataset/filename", @@ -50,19 +51,20 @@ }, { "@type": "DataDownload", - "@id": "http://www.usap-dc.org/view/dataset/600002", + "@id": "http://www.usap-dc.org/view/dataset/601212", "additionalType": "dcat:distribution", - "url": "http://www.usap-dc.org/view/dataset/600002", + "url": "http://www.usap-dc.org/view/dataset/601212", "name": "landing page", "description": "Link to a web page related to the resource.. Service Protocol: Link to a web page related to the resource.. Link Function: information", "contentUrl": "/dataset/filename", "encodingFormat": "text/html" }], "identifier": { - "@id": "http://www.usap-dc.org/view/dataset/600002", + "@type": "PropertyValue", "propertyID": "dataset identifier", - "value": "doi:600002" + "value": "doi:10.15784/601212", + "url": "https://doi.org/10.15784/601212" }, "contributor": [], "license": [{ From 986a1712da6b2a746dbba3d94c44a639f56b39e0 Mon Sep 17 00:00:00 2001 From: Ian Nesbitt Date: Thu, 7 Mar 2024 01:49:37 +0000 Subject: [PATCH 299/301] adding a giant first jsonld datacenter descripto to test real repo conditions --- tests/testUSAPjsonld01.html | 116 ++++++++++++++++++++++++++++++++++++ tests/testUSAPjsonld02.html | 116 ++++++++++++++++++++++++++++++++++++ 2 files changed, 232 insertions(+) diff --git a/tests/testUSAPjsonld01.html b/tests/testUSAPjsonld01.html index e5f6159d..08d6a3c0 100644 --- a/tests/testUSAPjsonld01.html +++ b/tests/testUSAPjsonld01.html @@ -8,6 +8,122 @@ + +