From 622eb816f17ea337259c2eb990f238c79e372145 Mon Sep 17 00:00:00 2001 From: Gary Yendell Date: Wed, 1 Feb 2023 13:28:07 +0000 Subject: [PATCH 1/5] Allow inserting feature flag macros on info fields --- docs/api.rst | 11 ++++++++--- epicsdbbuilder/recordbase.py | 24 +++++++++++++++++------- test/expected_output.db | 13 +++++++++++-- test/expected_output_alphabetical.db | 13 +++++++++++-- test/test_a_file.py | 1 + 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 93931f3..aa95324 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -45,7 +45,7 @@ Record Output Note that the leading ``#`` comments are added to any header that is passed - If `alphabetical` then records, their fields and aliases will be sorted + If `alphabetical` then records, their fields and aliases will be sorted alphabetically, otherwise the records and aliases will be in insertion order and fields in DBD order. @@ -347,18 +347,23 @@ Record Class like comments, and will be emitted in the same order, but have ``'#% '`` prepended to them. They can be used by processing tools. - .. method:: add_info(name, value) + .. method:: add_info(name, value, feature_flag="") This method causes an EPICS ``info`` statement to be added to the database. Its value can be either a a dictionary structure which will be converted to JSON (e.g. for ``info(Q:group, {...})``) or something else which will be double quoted (e.g. for ``info(autosaveFields, "VAL")``). + If `feature_flag` is provided, the info field will be escaped with a + macro of the form `$(=#)`, such that the template can be + expanded with the feature flag macro set to an empty string to enable the + feature, while if it is not set at all it will default to being commented + out. Using other dbCore functions ---------------------------- -Advanced usage may require using other functions from the dbCore library to +Advanced usage may require using other functions from the dbCore library to get extra introspection information about records. .. py:currentmodule:: epicsdbbuilder.mydbstatic diff --git a/epicsdbbuilder/recordbase.py b/epicsdbbuilder/recordbase.py index 2ab0552..5a59712 100644 --- a/epicsdbbuilder/recordbase.py +++ b/epicsdbbuilder/recordbase.py @@ -142,8 +142,8 @@ def add_comment(self, comment): def add_metadata(self, metadata): self.__comments.append('#% ' + metadata) - def add_info(self, name, info): - self.__infos.append((name, info)) + def add_info(self, name, info, feature_flag=""): + self.__infos.append((name, info, feature_flag)) def __dbd_order(self, fields): field_set = set(fields) @@ -176,9 +176,17 @@ def Print(self, output, alphabetical=True): sort = sorted if alphabetical else list for alias in sort(self.__aliases.keys()): print(' alias("%s")' % alias, file = output) - for name, info in self.__infos: - value = self.__FormatFieldForDb(name, info) - print(' info(%s, %s)' % (name, value), file = output) + for name, info, feature_flag in self.__infos: + feature_flag_macro = ( + "$(%s=#)" % feature_flag if feature_flag else "" + ) + value = self.__FormatFieldForDb( + name, info, line_prefix=feature_flag_macro + ) + print( + '%s info(%s, %s)' % (feature_flag_macro, name, value), + file = output + ) print('}', file = output) @@ -227,13 +235,15 @@ def __ValidateField(self, fieldname, value): self._validate.ValidFieldValue(fieldname, str(value)) # Field formatting - def __FormatFieldForDb(self, fieldname, value): + def __FormatFieldForDb(self, fieldname, value, line_prefix=""): if hasattr(value, 'FormatDb'): return value.FormatDb(self, fieldname) elif isinstance(value, dict): # JSON values in EPICS database as per # https://epics.anl.gov/base/R7-0/6-docs/links.html - return '\n '.join(json.dumps(value, indent=4).splitlines()) + return '\n{} '.format(line_prefix).join( + json.dumps(value, indent=4).splitlines() + ) else: return quote_string(str(value)) diff --git a/test/expected_output.db b/test/expected_output.db index 0d56631..5b9a8ad 100644 --- a/test/expected_output.db +++ b/test/expected_output.db @@ -1,7 +1,7 @@ # This file was automatically generated on Thu 25 Nov 2021 10:35:33 GMT. -# +# # *** Please do not edit this file: edit the source file instead. *** -# +# #% macro, DEVICE, Device name #% macro, P, A parameter #% macro, Q, A number @@ -100,6 +100,15 @@ record(waveform, "$(DEVICE):FIELD:WITH_CONST_ARRAY") } } }) +$(V4=#) info(Q:group, { +$(V4=#) "MYTABLE2": { +$(V4=#) "+id": "epics:nt/NTTable:1.0", +$(V4=#) "labels": { +$(V4=#) "+type": "plain", +$(V4=#) "+channel": "VAL" +$(V4=#) } +$(V4=#) } +$(V4=#) }) } record(ai, "$(DEVICE):FIELD:WITH_JSON_LINK") diff --git a/test/expected_output_alphabetical.db b/test/expected_output_alphabetical.db index d52da3a..282a411 100644 --- a/test/expected_output_alphabetical.db +++ b/test/expected_output_alphabetical.db @@ -1,7 +1,7 @@ # This file was automatically generated on Mon 08 Nov 2021 09:23:43 GMT. -# +# # *** Please do not edit this file: edit the source file instead. *** -# +# #% macro, DEVICE, Device name #% macro, P, A parameter #% macro, Q, A number @@ -23,6 +23,15 @@ record(waveform, "$(DEVICE):FIELD:WITH_CONST_ARRAY") } } }) +$(V4=#) info(Q:group, { +$(V4=#) "MYTABLE2": { +$(V4=#) "+id": "epics:nt/NTTable:1.0", +$(V4=#) "labels": { +$(V4=#) "+type": "plain", +$(V4=#) "+channel": "VAL" +$(V4=#) } +$(V4=#) } +$(V4=#) }) } record(ai, "$(DEVICE):FIELD:WITH_JSON_LINK") diff --git a/test/test_a_file.py b/test/test_a_file.py index 7ad0ed8..7c9884b 100644 --- a/test/test_a_file.py +++ b/test/test_a_file.py @@ -74,6 +74,7 @@ def test_output(tmp_path): ("+channel", "VAL") ]))]) w.add_info("Q:group", {"MYTABLE": td}) + w.add_info("Q:group", {"MYTABLE2": td}, "V4") # And json links with readbacks a = records.ai( 'FIELD:WITH_JSON_LINK', From 8a364874a130ad36793886725e578b3379331135 Mon Sep 17 00:00:00 2001 From: Gary Yendell Date: Tue, 7 Feb 2023 16:55:31 +0000 Subject: [PATCH 2/5] Apply patch to fix EPICS base build in CI --- .github/workflows/code.yml | 7 +- .github/workflows/epics-base-R3.14.12.7.patch | 127 ++++++++++++++++++ .github/workflows/epics-base-R3.15.8.patch | 127 ++++++++++++++++++ 3 files changed, 259 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/epics-base-R3.14.12.7.patch create mode 100644 .github/workflows/epics-base-R3.15.8.patch diff --git a/.github/workflows/code.yml b/.github/workflows/code.yml index 64571f0..feb6ac1 100644 --- a/.github/workflows/code.yml +++ b/.github/workflows/code.yml @@ -61,8 +61,11 @@ jobs: run: | wget -nv https://github.com/epics-base/epics-base/archive/${{ matrix.epics }}.tar.gz tar -zxf ${{ matrix.epics }}.tar.gz - make -sj -C epics-base-${{ matrix.epics }} - echo "EPICS_BASE=`pwd`/epics-base-${{ matrix.epics }}" >> $GITHUB_ENV + cp .github/workflows/epics-base-${{ matrix.epics }}.patch epics-base-${{ matrix.epics }} + cd epics-base-${{ matrix.epics }} + patch -p1 < epics-base-${{ matrix.epics }}.patch + make -sj + echo "EPICS_BASE=`pwd`" >> $GITHUB_ENV - name: Install Python Dependencies # Pin pipenv so it works on python2.7 diff --git a/.github/workflows/epics-base-R3.14.12.7.patch b/.github/workflows/epics-base-R3.14.12.7.patch new file mode 100644 index 0000000..4036fe2 --- /dev/null +++ b/.github/workflows/epics-base-R3.14.12.7.patch @@ -0,0 +1,127 @@ +diff --git a/src/cas/generic/caServerI.h b/src/cas/generic/caServerI.h +index b45d9373a..e31b210a7 100644 +--- a/src/cas/generic/caServerI.h ++++ b/src/cas/generic/caServerI.h +@@ -88,8 +88,8 @@ public: + private: + clientBufMemoryManager clientBufMemMgr; + tsFreeList < casMonitor, 1024 > casMonitorFreeList; +- tsDLList < casStrmClient > clientList; +- tsDLList < casIntfOS > intfList; ++ ::tsDLList < casStrmClient > clientList; ++ ::tsDLList < casIntfOS > intfList; + mutable epicsMutex mutex; + mutable epicsMutex diagnosticCountersMutex; + caServer & adapter; +diff --git a/src/cas/generic/casPVI.cc b/src/cas/generic/casPVI.cc +index 0b02a6cbf..8d2d27096 100644 +--- a/src/cas/generic/casPVI.cc ++++ b/src/cas/generic/casPVI.cc +@@ -286,7 +286,7 @@ void casPVI::postEvent ( const casEventMask & select, const gdd & event ) + } + + caStatus casPVI::installMonitor ( +- casMonitor & mon, tsDLList < casMonitor > & monitorList ) ++ casMonitor & mon, ::tsDLList < casMonitor > & monitorList ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + assert ( this->nMonAttached < UINT_MAX ); +@@ -302,7 +302,7 @@ caStatus casPVI::installMonitor ( + } + + casMonitor * casPVI::removeMonitor ( +- tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ) ++ ::tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + casMonitor * pMon = 0; +@@ -359,8 +359,8 @@ void casPVI::installChannel ( chanIntfForPV & chan ) + } + + void casPVI::removeChannel ( +- chanIntfForPV & chan, tsDLList < casMonitor > & src, +- tsDLList < casMonitor > & dest ) ++ chanIntfForPV & chan, ::tsDLList < casMonitor > & src, ++ ::tsDLList < casMonitor > & dest ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + src.removeAll ( dest ); +@@ -374,7 +374,7 @@ void casPVI::removeChannel ( + } + } + +-void casPVI::clearOutstandingReads ( tsDLList < casAsyncIOI > & ioList ) ++void casPVI::clearOutstandingReads ( ::tsDLList < casAsyncIOI > & ioList ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + +@@ -394,7 +394,7 @@ void casPVI::clearOutstandingReads ( tsDLList < casAsyncIOI > & ioList ) + } + } + +-void casPVI::destroyAllIO ( tsDLList < casAsyncIOI > & ioList ) ++void casPVI::destroyAllIO ( ::tsDLList < casAsyncIOI > & ioList ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + while ( casAsyncIOI * pIO = ioList.get() ) { +@@ -406,7 +406,7 @@ void casPVI::destroyAllIO ( tsDLList < casAsyncIOI > & ioList ) + } + + void casPVI::installIO ( +- tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) ++ ::tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + ioList.add ( io ); +@@ -415,7 +415,7 @@ void casPVI::installIO ( + } + + void casPVI::uninstallIO ( +- tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) ++ ::tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) + { + { + epicsGuard < epicsMutex > guard ( this->mutex ); +diff --git a/src/cas/generic/casPVI.h b/src/cas/generic/casPVI.h +index feea79d23..7ecf588b8 100644 +--- a/src/cas/generic/casPVI.h ++++ b/src/cas/generic/casPVI.h +@@ -49,21 +49,21 @@ public: + caStatus attachToServer ( caServerI & cas ); + aitIndex nativeCount (); + bool ioIsPending () const; +- void clearOutstandingReads ( tsDLList < class casAsyncIOI > &); ++ void clearOutstandingReads ( ::tsDLList < class casAsyncIOI > &); + void destroyAllIO ( +- tsDLList < casAsyncIOI > & ); ++ ::tsDLList < casAsyncIOI > & ); + void installIO ( +- tsDLList < casAsyncIOI > &, casAsyncIOI & ); ++ ::tsDLList < casAsyncIOI > &, casAsyncIOI & ); + void uninstallIO ( +- tsDLList < casAsyncIOI > &, casAsyncIOI & ); ++ ::tsDLList < casAsyncIOI > &, casAsyncIOI & ); + void installChannel ( chanIntfForPV & chan ); + void removeChannel ( +- chanIntfForPV & chan, tsDLList < casMonitor > & src, +- tsDLList < casMonitor > & dest ); ++ chanIntfForPV & chan, ::tsDLList < casMonitor > & src, ++ ::tsDLList < casMonitor > & dest ); + caStatus installMonitor ( +- casMonitor & mon, tsDLList < casMonitor > & monitorList ); ++ casMonitor & mon, ::tsDLList < casMonitor > & monitorList ); + casMonitor * removeMonitor ( +- tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ); ++ ::tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ); + void deleteSignal (); + void postEvent ( const casEventMask & select, const gdd & event ); + caServer * getExtServer () const; +@@ -84,7 +84,7 @@ public: + + private: + mutable epicsMutex mutex; +- tsDLList < chanIntfForPV > chanList; ++ ::tsDLList < chanIntfForPV > chanList; + gddEnumStringTable enumStrTbl; + caServerI * pCAS; + casPV * pPV; diff --git a/.github/workflows/epics-base-R3.15.8.patch b/.github/workflows/epics-base-R3.15.8.patch new file mode 100644 index 0000000..b28bccb --- /dev/null +++ b/.github/workflows/epics-base-R3.15.8.patch @@ -0,0 +1,127 @@ +diff --git a/src/ca/legacy/pcas/generic/caServerI.h b/src/ca/legacy/pcas/generic/caServerI.h +index 012233693..bfedf55ae 100644 +--- a/src/ca/legacy/pcas/generic/caServerI.h ++++ b/src/ca/legacy/pcas/generic/caServerI.h +@@ -88,8 +88,8 @@ public: + private: + clientBufMemoryManager clientBufMemMgr; + tsFreeList < casMonitor, 1024 > casMonitorFreeList; +- tsDLList < casStrmClient > clientList; +- tsDLList < casIntfOS > intfList; ++ ::tsDLList < casStrmClient > clientList; ++ ::tsDLList < casIntfOS > intfList; + mutable epicsMutex mutex; + mutable epicsMutex diagnosticCountersMutex; + caServer & adapter; +diff --git a/src/ca/legacy/pcas/generic/casPVI.cc b/src/ca/legacy/pcas/generic/casPVI.cc +index 245c51e01..5ae1f522e 100644 +--- a/src/ca/legacy/pcas/generic/casPVI.cc ++++ b/src/ca/legacy/pcas/generic/casPVI.cc +@@ -291,7 +291,7 @@ void casPVI::postEvent ( const casEventMask & select, const gdd & event ) + } + + caStatus casPVI::installMonitor ( +- casMonitor & mon, tsDLList < casMonitor > & monitorList ) ++ casMonitor & mon, ::tsDLList < casMonitor > & monitorList ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + assert ( this->nMonAttached < UINT_MAX ); +@@ -307,7 +307,7 @@ caStatus casPVI::installMonitor ( + } + + casMonitor * casPVI::removeMonitor ( +- tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ) ++ ::tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + casMonitor * pMon = 0; +@@ -364,8 +364,8 @@ void casPVI::installChannel ( chanIntfForPV & chan ) + } + + void casPVI::removeChannel ( +- chanIntfForPV & chan, tsDLList < casMonitor > & src, +- tsDLList < casMonitor > & dest ) ++ chanIntfForPV & chan, ::tsDLList < casMonitor > & src, ++ ::tsDLList < casMonitor > & dest ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + src.removeAll ( dest ); +@@ -379,7 +379,7 @@ void casPVI::removeChannel ( + } + } + +-void casPVI::clearOutstandingReads ( tsDLList < casAsyncIOI > & ioList ) ++void casPVI::clearOutstandingReads ( ::tsDLList < casAsyncIOI > & ioList ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + +@@ -399,7 +399,7 @@ void casPVI::clearOutstandingReads ( tsDLList < casAsyncIOI > & ioList ) + } + } + +-void casPVI::destroyAllIO ( tsDLList < casAsyncIOI > & ioList ) ++void casPVI::destroyAllIO ( ::tsDLList < casAsyncIOI > & ioList ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + while ( casAsyncIOI * pIO = ioList.get() ) { +@@ -411,7 +411,7 @@ void casPVI::destroyAllIO ( tsDLList < casAsyncIOI > & ioList ) + } + + void casPVI::installIO ( +- tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) ++ ::tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) + { + epicsGuard < epicsMutex > guard ( this->mutex ); + ioList.add ( io ); +@@ -420,7 +420,7 @@ void casPVI::installIO ( + } + + void casPVI::uninstallIO ( +- tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) ++ ::tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io ) + { + { + epicsGuard < epicsMutex > guard ( this->mutex ); +diff --git a/src/ca/legacy/pcas/generic/casPVI.h b/src/ca/legacy/pcas/generic/casPVI.h +index feea79d23..7ecf588b8 100644 +--- a/src/ca/legacy/pcas/generic/casPVI.h ++++ b/src/ca/legacy/pcas/generic/casPVI.h +@@ -49,21 +49,21 @@ public: + caStatus attachToServer ( caServerI & cas ); + aitIndex nativeCount (); + bool ioIsPending () const; +- void clearOutstandingReads ( tsDLList < class casAsyncIOI > &); ++ void clearOutstandingReads ( ::tsDLList < class casAsyncIOI > &); + void destroyAllIO ( +- tsDLList < casAsyncIOI > & ); ++ ::tsDLList < casAsyncIOI > & ); + void installIO ( +- tsDLList < casAsyncIOI > &, casAsyncIOI & ); ++ ::tsDLList < casAsyncIOI > &, casAsyncIOI & ); + void uninstallIO ( +- tsDLList < casAsyncIOI > &, casAsyncIOI & ); ++ ::tsDLList < casAsyncIOI > &, casAsyncIOI & ); + void installChannel ( chanIntfForPV & chan ); + void removeChannel ( +- chanIntfForPV & chan, tsDLList < casMonitor > & src, +- tsDLList < casMonitor > & dest ); ++ chanIntfForPV & chan, ::tsDLList < casMonitor > & src, ++ ::tsDLList < casMonitor > & dest ); + caStatus installMonitor ( +- casMonitor & mon, tsDLList < casMonitor > & monitorList ); ++ casMonitor & mon, ::tsDLList < casMonitor > & monitorList ); + casMonitor * removeMonitor ( +- tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ); ++ ::tsDLList < casMonitor > & list, ca_uint32_t clientIdIn ); + void deleteSignal (); + void postEvent ( const casEventMask & select, const gdd & event ); + caServer * getExtServer () const; +@@ -84,7 +84,7 @@ public: + + private: + mutable epicsMutex mutex; +- tsDLList < chanIntfForPV > chanList; ++ ::tsDLList < chanIntfForPV > chanList; + gddEnumStringTable enumStrTbl; + caServerI * pCAS; + casPV * pPV; From b394df5722b5ae8a021e1b307ea2f9c9e622fbc4 Mon Sep 17 00:00:00 2001 From: Gary Yendell Date: Wed, 8 Feb 2023 13:20:11 +0000 Subject: [PATCH 3/5] Update to codecov-action@v3 --- .github/workflows/code.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code.yml b/.github/workflows/code.yml index feb6ac1..45036d5 100644 --- a/.github/workflows/code.yml +++ b/.github/workflows/code.yml @@ -106,7 +106,7 @@ jobs: run: twine upload dist/* - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v3 with: name: ${{ matrix.os }}/${{ matrix.python }}/${{ matrix.epics }} files: cov.xml From ebe96690f4c33d817a6d3235247937d51a96c10f Mon Sep 17 00:00:00 2001 From: Gary Yendell Date: Fri, 10 Feb 2023 12:20:45 +0000 Subject: [PATCH 4/5] Remove python 2.7 and 3.6 support Add 3.9 to supported list, as it is tested in CI --- .github/workflows/code.yml | 8 -------- setup.cfg | 3 +-- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/code.yml b/.github/workflows/code.yml index 45036d5..65cdfb0 100644 --- a/.github/workflows/code.yml +++ b/.github/workflows/code.yml @@ -10,14 +10,6 @@ jobs: fail-fast: false matrix: include: - # DLS RHEL7 legacy - - os: ubuntu-latest - python: "2.7" - publish: true - epics: "R3.14.12.7" - # sphinx deps don't work on 2.7, so install manually - pipenv: "--skip-lock && pipenv run pip install pytest-cov pytest-flake8" - # DLS RHEL7 python3 current - os: ubuntu-latest python: "3.7" diff --git a/setup.cfg b/setup.cfg index a14769b..2f4d70a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,10 +10,9 @@ long_description_content_type = text/x-rst classifiers = Development Status :: 5 - Production/Stable License :: OSI Approved :: Apache Software License - Programming Language :: Python :: 2.7 - Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 [options] packages = find: From 50cf4cf7b4458adf3125bbd065dbedfebd5356bf Mon Sep 17 00:00:00 2001 From: Gary Yendell Date: Tue, 7 Feb 2023 11:54:47 +0000 Subject: [PATCH 5/5] Help pipenv to regenerate Pipfile.lock --- Pipfile | 6 +- Pipfile.lock | 366 ++++++++++++++++++++++++++------------------------- 2 files changed, 192 insertions(+), 180 deletions(-) diff --git a/Pipfile b/Pipfile index 4927103..fc5a7dc 100644 --- a/Pipfile +++ b/Pipfile @@ -12,7 +12,11 @@ atomicwrites = "*" # Test and docs deps pytest-cov = "*" -pytest-flake8 = "*" +# remove this dependency once flake8 has dropped "importlib-metadata <=4.3" +# https://github.com/PyCQA/flake8/pull/1438 +flake8 = "<=3.9.2" +importlib-metadata = "<5" +pytest-flake8 = "<=1.1.0" sphinx-rtd-theme = "*" [packages] diff --git a/Pipfile.lock b/Pipfile.lock index e0060b4..7e3b4ac 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "440ec49dc40f84e7b23248902e0cb3d7759fb34675a28f38f395fcdd789e3fdf" + "sha256": "c249d113c89c0ed6ede32cbcba80ecf245b89f10d4134ebe4b5a2b8d6364ab4c" }, "pipfile-spec": 6, "requires": {}, @@ -37,124 +37,126 @@ }, "attrs": { "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" + "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", + "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" ], - "version": "==20.3.0" + "version": "==22.1.0" }, "babel": { "hashes": [ - "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9", - "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0" + "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe", + "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6" ], - "version": "==2.9.1" + "version": "==2.11.0" }, "certifi": { "hashes": [ - "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", - "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" + "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", + "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" ], - "version": "==2020.12.5" + "version": "==2022.12.7" }, - "chardet": { + "charset-normalizer": { "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" + "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", + "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" ], - "version": "==4.0.0" + "version": "==2.1.1" }, "coverage": { - "hashes": [ - "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c", - "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6", - "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45", - "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a", - "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03", - "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529", - "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a", - "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a", - "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2", - "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6", - "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759", - "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53", - "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a", - "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4", - "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff", - "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502", - "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793", - "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb", - "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905", - "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821", - "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b", - "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81", - "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0", - "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b", - "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3", - "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184", - "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701", - "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a", - "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82", - "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638", - "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5", - "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083", - "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6", - "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90", - "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465", - "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a", - "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3", - "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e", - "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066", - "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf", - "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b", - "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae", - "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669", - "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873", - "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b", - "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6", - "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb", - "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160", - "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c", - "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079", - "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d", - "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6" - ], - "version": "==5.5" + "extras": [ + "toml" + ], + "hashes": [ + "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79", + "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a", + "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f", + "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a", + "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa", + "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398", + "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba", + "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d", + "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf", + "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b", + "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518", + "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d", + "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795", + "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2", + "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e", + "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32", + "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745", + "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b", + "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e", + "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d", + "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f", + "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660", + "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62", + "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6", + "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04", + "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c", + "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5", + "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef", + "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc", + "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae", + "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578", + "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466", + "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4", + "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91", + "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0", + "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4", + "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b", + "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe", + "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b", + "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75", + "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b", + "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c", + "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72", + "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b", + "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f", + "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e", + "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53", + "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3", + "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84", + "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987" + ], + "version": "==6.5.0" }, "docutils": { "hashes": [ - "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af", - "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc" + "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125", + "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61" ], - "version": "==0.16" + "version": "==0.17.1" }, "flake8": { "hashes": [ - "sha256:1aa8990be1e689d96c745c5682b687ea49f2e05a443aff1f8251092b0014e378", - "sha256:3b9f848952dddccf635be78098ca75010f073bfe14d2c6bda867154bea728d2a" + "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", + "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" ], - "version": "==3.9.1" + "index": "pypi", + "version": "==3.9.2" }, "idna": { "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" ], - "version": "==2.10" + "version": "==3.4" }, "imagesize": { "hashes": [ - "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1", - "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1" + "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" ], - "version": "==1.2.0" + "version": "==1.4.1" }, "importlib-metadata": { "hashes": [ - "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581", - "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d" + "sha256:175f4ee440a0317f6e8d81b7f8d4869f93316170a65ad2b007d2929186c8052c", + "sha256:e0bc84ff355328a4adfc5240c4f211e0ab386f80aa640d1b11f0618a1d282094" ], - "markers": "python_version < '3.8' and python_version < '3.8'", - "version": "==4.0.1" + "index": "pypi", + "version": "==4.11.1" }, "iniconfig": { "hashes": [ @@ -165,48 +167,55 @@ }, "jinja2": { "hashes": [ - "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419", - "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6" + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" ], - "version": "==2.11.3" + "version": "==3.1.2" }, "markupsafe": { "hashes": [ - "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", - "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", - "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", - "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", - "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", - "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", - "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", - "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", - "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", - "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", - "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", - "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", - "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", - "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", - "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", - "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", - "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", - "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", - "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", - "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", - "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", - "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", - "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", - "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", - "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", - "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", - "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", - "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", - "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", - "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", - "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" - ], - "version": "==1.1.1" + "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003", + "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88", + "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5", + "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7", + "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a", + "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603", + "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1", + "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135", + "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247", + "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6", + "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601", + "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77", + "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02", + "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e", + "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63", + "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f", + "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980", + "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b", + "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812", + "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff", + "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96", + "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1", + "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925", + "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a", + "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6", + "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e", + "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f", + "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4", + "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f", + "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3", + "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c", + "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a", + "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417", + "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a", + "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a", + "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37", + "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452", + "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933", + "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a", + "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7" + ], + "version": "==2.1.1" }, "mccabe": { "hashes": [ @@ -217,24 +226,24 @@ }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", + "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" ], - "version": "==20.9" + "version": "==21.3" }, "pluggy": { "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" ], - "version": "==0.13.1" + "version": "==1.0.0" }, "py": { "hashes": [ - "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", - "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" + "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" ], - "version": "==1.10.0" + "version": "==1.11.0" }, "pycodestyle": { "hashes": [ @@ -252,32 +261,32 @@ }, "pygments": { "hashes": [ - "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f", - "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e" + "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1", + "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42" ], - "version": "==2.9.0" + "version": "==2.13.0" }, "pyparsing": { "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", + "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" ], - "version": "==2.4.7" + "version": "==3.0.9" }, "pytest": { "hashes": [ - "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634", - "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc" + "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7", + "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39" ], - "version": "==6.2.3" + "version": "==7.1.3" }, "pytest-cov": { "hashes": [ - "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7", - "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da" + "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b", + "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470" ], "index": "pypi", - "version": "==2.11.1" + "version": "==4.0.0" }, "pytest-flake8": { "hashes": [ @@ -289,31 +298,31 @@ }, "pytz": { "hashes": [ - "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da", - "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798" + "sha256:2c0784747071402c6e99f0bafdb7da0fa22645f06554c7ae06bf6358897e9c91", + "sha256:48ce799d83b6f8aab2020e369b627446696619e79645419610b9facd909b3174" ], - "version": "==2021.1" + "version": "==2022.4" }, "requests": { "hashes": [ - "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", - "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" + "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", + "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" ], - "version": "==2.25.1" + "version": "==2.28.1" }, "snowballstemmer": { "hashes": [ - "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2", - "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914" + "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", + "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" ], - "version": "==2.1.0" + "version": "==2.2.0" }, "sphinx": { "hashes": [ - "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1", - "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8" + "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6", + "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226" ], - "version": "==3.5.4" + "version": "==4.5.0" }, "sphinx-multiversion": { "editable": true, @@ -322,11 +331,11 @@ }, "sphinx-rtd-theme": { "hashes": [ - "sha256:32bd3b5d13dc8186d7a42fc816a23d32e83a4827d7d9882948e7b837c232da5a", - "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f" + "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8", + "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c" ], "index": "pypi", - "version": "==0.5.2" + "version": "==1.0.0" }, "sphinxcontrib-applehelp": { "hashes": [ @@ -344,10 +353,10 @@ }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f", - "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b" + "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", + "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2" ], - "version": "==1.0.3" + "version": "==2.0.0" }, "sphinxcontrib-jsmath": { "hashes": [ @@ -365,40 +374,39 @@ }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc", - "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a" + "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", + "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" ], - "version": "==1.1.4" + "version": "==1.1.5" }, - "toml": { + "tomli": { "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "version": "==0.10.2" + "version": "==2.0.1" }, "typing-extensions": { "hashes": [ - "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", - "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", - "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", + "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" ], "markers": "python_version < '3.8'", - "version": "==3.10.0.0" + "version": "==4.4.0" }, "urllib3": { "hashes": [ - "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", - "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" + "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", + "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" ], - "version": "==1.26.5" + "version": "==1.26.12" }, "zipp": { "hashes": [ - "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", - "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" + "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb", + "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980" ], - "version": "==3.4.1" + "version": "==3.9.0" } } }