From dc2b385fb51c3662fb07ebee8bc9acc46143b34f Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Fri, 2 Sep 2022 11:29:51 +0100 Subject: [PATCH 01/13] Initial commit Temp .gitignore Update README Update readme Pip and make Add profiles template --- .circleci/config.yml | 82 ++ .gitignore | 8 +- .sqlfluff | 113 ++ .sqlfluffignore | 2 + Makefile | 37 + Pipfile | 19 + Pipfile.lock | 1026 +++++++++++++++++ README.md | 61 +- dbt_project.yml | 13 +- .../macros/sensitive/get_meta_columns.sql | 29 + jaffle_shop/macros/sensitive/get_salt.sql | 3 + .../macros/sensitive/hash_of_column.sql | 13 + .../sensitive/hash_sensitive_columns.sql | 11 + jaffle_shop/macros/sensitive/macros.md | 22 + jaffle_shop/macros/sensitive/macros.yml | 45 + .../sensitive/nohash_sensitive_columns.sql | 13 + .../seeds}/raw_customers.csv | 0 {seeds => jaffle_shop/seeds}/raw_orders.csv | 0 {seeds => jaffle_shop/seeds}/raw_payments.csv | 0 package_projects/dbt_project_evaluator.yml | 87 ++ packages.yml | 9 + seeds/.gitkeep | 0 selectors.yml | 15 + testing/profiles.yml | 10 + testing/test_structure.py | 1 + 25 files changed, 1563 insertions(+), 56 deletions(-) create mode 100644 .circleci/config.yml create mode 100644 .sqlfluff create mode 100644 .sqlfluffignore create mode 100644 Makefile create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 jaffle_shop/macros/sensitive/get_meta_columns.sql create mode 100644 jaffle_shop/macros/sensitive/get_salt.sql create mode 100644 jaffle_shop/macros/sensitive/hash_of_column.sql create mode 100644 jaffle_shop/macros/sensitive/hash_sensitive_columns.sql create mode 100644 jaffle_shop/macros/sensitive/macros.md create mode 100644 jaffle_shop/macros/sensitive/macros.yml create mode 100644 jaffle_shop/macros/sensitive/nohash_sensitive_columns.sql rename {seeds => jaffle_shop/seeds}/raw_customers.csv (100%) rename {seeds => jaffle_shop/seeds}/raw_orders.csv (100%) rename {seeds => jaffle_shop/seeds}/raw_payments.csv (100%) create mode 100644 package_projects/dbt_project_evaluator.yml create mode 100644 packages.yml delete mode 100644 seeds/.gitkeep create mode 100644 selectors.yml create mode 100644 testing/profiles.yml create mode 100644 testing/test_structure.py diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..c7ee0722c --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,82 @@ +version: 2.1 + +executors: + standard: + docker: + - image: circleci/python:3.8 + working_directory: "~/lib" + +# ----------------- +# Reusable commands +# ----------------- + +commands: + checkout_source: + steps: + - restore_cache: + keys: + - source-{{ .Branch }}-{{ .Revision }} + - source-{{ .Branch }}- + - source- + - checkout + - save_cache: + key: source-{{ .Branch }}-{{ .Revision }} + paths: + - "./.git" + + update_virtualenv: + steps: + - restore_cache: + keys: + - virtualenv-{{ .Environment.CACHE_VERSION }}-{{ .Branch }}-{{ checksum "Pipfile.lock" }} + - virtualenv-{{ .Environment.CACHE_VERSION }}-{{ .Branch }}- + - virtualenv-{{ .Environment.CACHE_VERSION }}- + - run: + name: Install Python packages + command: pipenv install --dev --system + - save_cache: + key: virtualenv-{{ .Environment.CACHE_VERSION }}-{{ .Branch }}-{{ checksum "Pipfile.lock" }} + paths: + - "./.venv" + + prepare_dbt: + steps: + - run: + name: Installing Simba + UnixODBC + command: | + sudo mkdir -p /opt/simba/spark/lib/64/ + sudo tar -xf driver/simba.tar.gz -C /opt/simba/spark/lib/64/ + sudo apt-get install unixodbc-dev -y +# -------------- +# Pipeline tasks +# -------------- + +jobs: + run-python-tests: + executor: standard + steps: + - checkout + - update_virtualenv + - run: + name: Run Python tests + command: make run-python-tests + run-dbt-project-evaluator: + executor: standard + environment: + SALT: himalayan + DBT_PROFILES_DIR: ~/lib/testing/ + TESTING_PROFILE_NAME: jaffle_shop + steps: + - checkout + - update_virtualenv + - run: + name: Run dbt-project-evaluator package + command: make run-dbt-project-evaluator + + +# Orchestrate our job run sequence +workflows: + test: + jobs: + - run-python-tests + - run-dbt-project-evaluator \ No newline at end of file diff --git a/.gitignore b/.gitignore index 716442207..2d9126631 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ - target/ dbt_modules/ +dbt_packages/ logs/ + **/.DS_Store +.env + +# Python temp files +*.pyc +__pycache__ diff --git a/.sqlfluff b/.sqlfluff new file mode 100644 index 000000000..bf3f02fe8 --- /dev/null +++ b/.sqlfluff @@ -0,0 +1,113 @@ +[sqlfluff] +verbose = 0 +nocolor = False +dialect = databricks +templater = dbt +rules = None +exclude_rules = L031 +recurse = 0 +output_line_length = 80 +runaway_limit = 10 +ignore_templated_areas = True +encoding = autodetect +disable_noqa = False +# Comma separated list of file extensions to lint. +# NB: This config will only apply in the root folder. +sql_file_exts = .sql,.sql.j2,.dml,.ddl + +[sqlfluff:indentation] +indented_joins = False +indented_using_on = True +template_blocks_indent = True + +[sqlfluff:templater] +unwrap_wrapped_queries = True + +[sqlfluff:templater:dbt] +apply_dbt_builtins = True +load_macros_from_path = core/macros,oegb/macros/,oejp/macros + +[sqlfluff:templater:dbt:context] +# DATABRICKS_TARGET=$(eval "echo ${CIRCLE_BRANCH}_ci | tr /- _")_${CIRCLE_SHA1}_$PROJECT +# tbl_name=my_table + +[sqlfluff:templater:dbt:macros] +# Macros provided as builtins for dbt projects +dbt_ref = {% macro ref(model_ref) %}{{model_ref}}{% endmacro %} +dbt_source = {% macro source(source_name, table) %}{{source_name}}_{{table}}{% endmacro %} +dbt_config = {% macro config() %}{% for k in kwargs %}{% endfor %}{% endmacro %} +dbt_var = {% macro var(variable, default='') %}item{% endmacro %} +dbt_is_incremental = {% macro is_incremental() %}True{% endmacro %} + +# Some rules can be configured directly from the config common to other rules. +[sqlfluff:rules] +tab_space_size = 2 +max_line_length = 99 +indent_unit = space +allow_scalar = True +single_table_references = consistent +unquoted_identifiers_policy = all +indented_on_contents = False + +# Some rules have their own specific config. +[sqlfluff:rules:L007] # Keywords +operator_new_lines = after + +[sqlfluff:rules:L010] # Keywords +capitalisation_policy = upper +extended_capitalisation_policy = upper + +[sqlfluff:rules:L011] # Aliasing +aliasing = explicit + +[sqlfluff:rules:L012] # Aliasing +aliasing = explicit + +[sqlfluff:rules:L014] # Unquoted identifiers +extended_capitalisation_policy = consistent + +[sqlfluff:rules:L016] +ignore_comment_lines = False + +[sqlfluff:rules:L019] +comma_style = leading + +[sqlfluff:rules:L026] +force_enable = False + +[sqlfluff:rules:L028] +force_enable = False + +[sqlfluff:rules:L029] # Keyword identifiers +unquoted_identifiers_policy = aliases +quoted_identifiers_policy = none + +[sqlfluff:rules:L030] # Function names +capitalisation_policy = upper +extended_capitalisation_policy = upper + +[sqlfluff:rules:L038] +select_clause_trailing_comma = forbid + +[sqlfluff:rules:L040] # Null & Boolean Literals +capitalisation_policy = upper + +[sqlfluff:rules:L042] +# By default, allow subqueries in from clauses, but not join clauses. +forbid_subquery_in = both + +[sqlfluff:rules:L047] # Consistent syntax to count all rows +prefer_count_1 = False +prefer_count_0 = False + +[sqlfluff:rules:L052] # Semi-colon formatting approach. +multiline_newline = False +require_final_semicolon = False + +[sqlfluff:rules:L054] # GROUP BY/ORDER BY column references. +group_by_and_order_by_style = explicit + +[sqlfluff:rules:L057] # Special characters in identifiers +unquoted_identifiers_policy = all +quoted_identifiers_policy = all +allow_space_in_identifier = False \ No newline at end of file diff --git a/.sqlfluffignore b/.sqlfluffignore new file mode 100644 index 000000000..a620ffcdc --- /dev/null +++ b/.sqlfluffignore @@ -0,0 +1,2 @@ +target/ +dbt_packages/ diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..a7587bcce --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +init: + pipenv update + pipenv run dbt deps + +clean-env: + :> .env + +env-development-salt: + echo SALT=maldon >> .env + +env-target: + echo DATABRICKS_TARGET=$$(git symbolic-ref --short HEAD | tr /- _) >> .env + +package-project: + for PACKAGE in dbt_project_evaluator ; do \ + cp package_projects/$$PACKAGE.yml dbt_packages/$$PACKAGE/dbt_project.yml ; \ + done + +build-env: clean-env env-development-salt env-target package-project + +dbt-deps: + pipenv run dbt deps + +dbt-build: build-env + pipenv run dbt build --selector jaffle_shop + +run-dbt-project-evaluator: dbt-deps build-env + pipenv run dbt --warn-error build --select package:dbt_project_evaluator dbt_project_evaluator_exceptions + +lint: build-env + pipenv run sqlfluff lint + +format: build-env + pipenv run sqlfluff fix + +run-python-tests: + pipenv run pytest -vvvvv \ No newline at end of file diff --git a/Pipfile b/Pipfile new file mode 100644 index 000000000..2499387dd --- /dev/null +++ b/Pipfile @@ -0,0 +1,19 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +dbt-core = "==1.1.0" +dbt-databricks = {extras = ["odbc"]} +sqlfluff = "1.0.0" +sqlfluff-templater-dbt = "*" +pytest-mock = "*" +glob2 = "*" + +[dev-packages] +pytest = "*" +pytest-mock = "*" + +[requires] +python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 000000000..92e86275b --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,1026 @@ +{ + "_meta": { + "hash": { + "sha256": "15b089ccba32ecfb980c6e7bc58853976090e07cd776f55151d2a34fd1b212c8" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "agate": { + "hashes": [ + "sha256:2d568fd68a8eb8b56c805a1299ba4bc30ca0434563be1bea309c9d1c1c8401f4", + "sha256:e0f2f813f7e12311a4cdccc97d6ba0a6781e9c1aa8eca0ab00d5931c0113a308" + ], + "version": "==1.6.3" + }, + "appdirs": { + "hashes": [ + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + ], + "version": "==1.4.4" + }, + "attrs": { + "hashes": [ + "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", + "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" + ], + "markers": "python_version >= '3.5'", + "version": "==22.1.0" + }, + "babel": { + "hashes": [ + "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51", + "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb" + ], + "markers": "python_version >= '3.6'", + "version": "==2.10.3" + }, + "certifi": { + "hashes": [ + "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d", + "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412" + ], + "markers": "python_version >= '3.6'", + "version": "==2022.6.15" + }, + "cffi": { + "hashes": [ + "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", + "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", + "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", + "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", + "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", + "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", + "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", + "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", + "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", + "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", + "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", + "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", + "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", + "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", + "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", + "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", + "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", + "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", + "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", + "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", + "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", + "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", + "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", + "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", + "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", + "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", + "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", + "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", + "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", + "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", + "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", + "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", + "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", + "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", + "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", + "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", + "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", + "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", + "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", + "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", + "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", + "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", + "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", + "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", + "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", + "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", + "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", + "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", + "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", + "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", + "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", + "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", + "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", + "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", + "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", + "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", + "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", + "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", + "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", + "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", + "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", + "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", + "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + ], + "version": "==1.15.1" + }, + "chardet": { + "hashes": [ + "sha256:0368df2bfd78b5fc20572bb4e9bb7fb53e2c094f60ae9993339e8671d0afb8aa", + "sha256:d3e64f022d254183001eccc5db4040520c0f23b1a3f33d6413e099eb7f126557" + ], + "markers": "python_version >= '3.6'", + "version": "==5.0.0" + }, + "charset-normalizer": { + "hashes": [ + "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", + "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" + ], + "markers": "python_version >= '3.6'", + "version": "==2.1.1" + }, + "click": { + "hashes": [ + "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", + "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.3" + }, + "colorama": { + "hashes": [ + "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", + "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.4.4" + }, + "databricks-sql-connector": { + "hashes": [ + "sha256:a0db589ac35446989e129aef51b22f615dc1f65b143e90717aa85320d7f82284", + "sha256:f744fe26010d7798e4bb7a9c6106a2bf2cb6da63381b8e2e7b0a4beae374c0cd" + ], + "markers": "python_version < '4' and python_full_version >= '3.7.1'", + "version": "==2.0.5" + }, + "dbt-core": { + "hashes": [ + "sha256:3e33ce5be74e0d4f9f28ad76b4b1de55cb343d4c53c3a8f98c24551881aedf3e", + "sha256:4af9124e6ec188db2ce9a32d6b26757fd42c2e14238770ca0661d8963f1ba7ea" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "dbt-databricks": { + "extras": [ + "odbc" + ], + "hashes": [ + "sha256:81e091146eaa988aa7ff423ced7572414d97a8dd4288ae72bf0b4b679fc045d9", + "sha256:95e7f9d2ccb80da6d6139c5ab76e2e6577318f5593779f91017be40fb5d654a9" + ], + "index": "pypi", + "version": "==1.1.3" + }, + "dbt-extractor": { + "hashes": [ + "sha256:037907a7c7ae0391045d81338ca77ddaef899a91d80f09958f09fe374594e19b", + "sha256:34783d788b133f223844e280e37b3f5244f2fb60acc457aa75c2667e418d5442", + "sha256:35265a0ae0a250623b0c2e3308b2738dc8212e40e0aa88407849e9ea090bb312", + "sha256:3fe8d8e28a7bd3e0884896147269ca0202ca432d8733113386bdc84c824561bf", + "sha256:4dc715bd740e418d8dc1dd418fea508e79208a24cf5ab110b0092a3cbe96bf71", + "sha256:554d27741a54599c39e5c0b7dbcab77400d83f908caba284a3e960db812e5814", + "sha256:75b1c665699ec0f1ffce1ba3d776f7dfce802156f22e70a7b9c8f0b4d7e80f42", + "sha256:76872cdee659075d6ce2df92dc62e59a74ba571be62acab2e297ca478b49d766", + "sha256:7c291f9f483eae4f60dd5859097d7ba51d5cb6c4725f08973ebd18cdea89d758", + "sha256:7d7c47774dc051b8c18690281a55e2e3d3320e823b17e04b06bc3ff81b1874ba", + "sha256:81435841610be1b07806d72cd89b1956c6e2a84c360b9ceb3f949c62a546d569", + "sha256:822b1e911db230e1b9701c99896578e711232001027b518c44c32f79a46fa3f9", + "sha256:9da211869a1220ea55c5552c1567a3ea5233a6c52fa89ca87a22465481c37bc9", + "sha256:a805d51a25317f53cbff951c79b9cf75421cf48e4b3e1dfb3e9e8de6d824b76c", + "sha256:bc9e0050e3a2f4ea9fe58e8794bc808e6709a0c688ed710fc7c5b6ef3e5623ec", + "sha256:cad90ddc708cb4182dc16fe2c87b1f088a1679877b93e641af068eb68a25d582" + ], + "markers": "python_full_version >= '3.6.1'", + "version": "==0.4.1" + }, + "dbt-spark": { + "hashes": [ + "sha256:1c8808347c41f760280d6aed54a564e8e8055d6c3377283b6d862100cb0153c8", + "sha256:cbf5b788e185c0d4b22b69ef9b8a09a49b78c327feda84b2d2fe2ccd098377e5" + ], + "markers": "python_version >= '3.7'", + "version": "==1.1.0" + }, + "diff-cover": { + "hashes": [ + "sha256:8c3bb13812e9667bc83f8c7606402511e9c2fe79d6786f129522e79693ee096b", + "sha256:ad602868ff14969563216866fc249f068df54892bd6c989201110bbb837dab06" + ], + "markers": "python_version < '4' and python_full_version >= '3.6.2'", + "version": "==6.5.1" + }, + "future": { + "hashes": [ + "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.18.2" + }, + "glob2": { + "hashes": [ + "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c" + ], + "index": "pypi", + "version": "==0.7" + }, + "hologram": { + "hashes": [ + "sha256:2911b59115bebd0504eb089532e494fa22ac704989afe41371c5361780433bfe", + "sha256:fd67bd069e4681e1d2a447df976c65060d7a90fee7f6b84d133fd9958db074ec" + ], + "version": "==0.0.14" + }, + "idna": { + "hashes": [ + "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", + "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" + ], + "markers": "python_version >= '3.5'", + "version": "==3.3" + }, + "importlib-metadata": { + "hashes": [ + "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670", + "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23" + ], + "markers": "python_version >= '3.7'", + "version": "==4.12.0" + }, + "iniconfig": { + "hashes": [ + "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", + "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + ], + "version": "==1.1.1" + }, + "isodate": { + "hashes": [ + "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96", + "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9" + ], + "version": "==0.6.1" + }, + "jinja2": { + "hashes": [ + "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419", + "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==2.11.3" + }, + "jinja2-simple-tags": { + "hashes": [ + "sha256:53b1a0a4095958f6874cfe0a4df74e15587d85a0248be588009e23aa0fdba3bd", + "sha256:cdebf4ed86dc2f8cfe832734817c5a7c6eb75761a9325e12184a93f8da5040aa" + ], + "markers": "python_version >= '3.6'", + "version": "==0.4.0" + }, + "jsonschema": { + "hashes": [ + "sha256:2fa0684276b6333ff3c0b1b27081f4b2305f0a36cf702a23db50edb141893c3f", + "sha256:94c0a13b4a0616458b42529091624e66700a17f847453e52279e35509a5b7631" + ], + "version": "==3.1.1" + }, + "leather": { + "hashes": [ + "sha256:5e741daee96e9f1e9e06081b8c8a10c4ac199301a0564cdd99b09df15b4603d2", + "sha256:b43e21c8fa46b2679de8449f4d953c06418666dc058ce41055ee8a8d3bb40918" + ], + "version": "==0.3.4" + }, + "logbook": { + "hashes": [ + "sha256:0cf2cdbfb65a03b5987d19109dacad13417809dcf697f66e1a7084fb21744ea9", + "sha256:2dc85f1510533fddb481e97677bb7bca913560862734c0b3b289bfed04f78c92", + "sha256:56ee54c11df3377314cedcd6507638f015b4b88c0238c2e01b5eb44fd3a6ad1b", + "sha256:66f454ada0f56eae43066f604a222b09893f98c1adc18df169710761b8f32fe8", + "sha256:7c533eb728b3d220b1b5414ba4635292d149d79f74f6973b4aa744c850ca944a", + "sha256:8f76a2e7b1f72595f753228732f81ce342caf03babc3fed6bbdcf366f2f20f18", + "sha256:94e2e11ff3c2304b0d09a36c6208e5ae756eb948b210e5cbd63cd8d27f911542", + "sha256:97fee1bd9605f76335b169430ed65e15e457a844b2121bd1d90a08cf7e30aba0", + "sha256:e18f7422214b1cf0240c56f884fd9c9b4ff9d0da2eabca9abccba56df7222f66" + ], + "version": "==1.5.3" + }, + "markupsafe": { + "hashes": [ + "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298", + "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64", + "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b", + "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194", + "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567", + "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff", + "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724", + "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74", + "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646", + "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35", + "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6", + "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a", + "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6", + "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad", + "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26", + "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38", + "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac", + "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7", + "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6", + "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047", + "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75", + "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f", + "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b", + "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135", + "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8", + "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a", + "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", + "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1", + "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9", + "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864", + "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914", + "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee", + "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f", + "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18", + "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8", + "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2", + "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d", + "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b", + "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b", + "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86", + "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6", + "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f", + "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb", + "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833", + "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28", + "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e", + "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415", + "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902", + "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f", + "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d", + "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9", + "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d", + "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145", + "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066", + "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c", + "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1", + "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a", + "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207", + "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f", + "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53", + "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd", + "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134", + "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85", + "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9", + "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5", + "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94", + "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509", + "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51", + "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872" + ], + "markers": "python_version >= '3.6'", + "version": "==2.0.1" + }, + "mashumaro": { + "hashes": [ + "sha256:343b6e2d3e432e31973688c4c8821dcd6ef41fd33264b992afc4aecbfd155f18", + "sha256:f616df410d82936b8bb2b4d32af570556685d77f49acf4228134b50230a69799" + ], + "markers": "python_version >= '3.6'", + "version": "==2.9" + }, + "minimal-snowplow-tracker": { + "hashes": [ + "sha256:acabf7572db0e7f5cbf6983d495eef54081f71be392330eb3aadb9ccb39daaa4" + ], + "version": "==0.0.2" + }, + "msgpack": { + "hashes": [ + "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467", + "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae", + "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92", + "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef", + "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624", + "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227", + "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88", + "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9", + "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8", + "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd", + "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6", + "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55", + "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e", + "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2", + "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44", + "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6", + "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9", + "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab", + "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae", + "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa", + "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9", + "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e", + "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250", + "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce", + "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075", + "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236", + "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae", + "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e", + "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f", + "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08", + "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6", + "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d", + "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43", + "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1", + "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6", + "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0", + "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c", + "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff", + "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db", + "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243", + "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661", + "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba", + "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e", + "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb", + "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52", + "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6", + "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1", + "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f", + "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da", + "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f", + "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c", + "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8" + ], + "version": "==1.0.4" + }, + "networkx": { + "hashes": [ + "sha256:2a30822761f34d56b9a370d96a4bf4827a535f5591a4078a453425caeba0c5bb", + "sha256:bd2b7730300860cbd2dafe8e5af89ff5c9a65c3975b352799d87a6238b4301a6" + ], + "markers": "python_version >= '3.8'", + "version": "==2.8.6" + }, + "numpy": { + "hashes": [ + "sha256:17e5226674f6ea79e14e3b91bfbc153fdf3ac13f5cc54ee7bc8fdbe820a32da0", + "sha256:2bd879d3ca4b6f39b7770829f73278b7c5e248c91d538aab1e506c628353e47f", + "sha256:4f41f5bf20d9a521f8cab3a34557cd77b6f205ab2116651f12959714494268b0", + "sha256:5593f67e66dea4e237f5af998d31a43e447786b2154ba1ad833676c788f37cde", + "sha256:5e28cd64624dc2354a349152599e55308eb6ca95a13ce6a7d5679ebff2962913", + "sha256:633679a472934b1c20a12ed0c9a6c9eb167fbb4cb89031939bfd03dd9dbc62b8", + "sha256:806970e69106556d1dd200e26647e9bee5e2b3f1814f9da104a943e8d548ca38", + "sha256:806cc25d5c43e240db709875e947076b2826f47c2c340a5a2f36da5bb10c58d6", + "sha256:8247f01c4721479e482cc2f9f7d973f3f47810cbc8c65e38fd1bbd3141cc9842", + "sha256:8ebf7e194b89bc66b78475bd3624d92980fca4e5bb86dda08d677d786fefc414", + "sha256:8ecb818231afe5f0f568c81f12ce50f2b828ff2b27487520d85eb44c71313b9e", + "sha256:8f9d84a24889ebb4c641a9b99e54adb8cab50972f0166a3abc14c3b93163f074", + "sha256:909c56c4d4341ec8315291a105169d8aae732cfb4c250fbc375a1efb7a844f8f", + "sha256:9b83d48e464f393d46e8dd8171687394d39bc5abfe2978896b77dc2604e8635d", + "sha256:ac987b35df8c2a2eab495ee206658117e9ce867acf3ccb376a19e83070e69418", + "sha256:b78d00e48261fbbd04aa0d7427cf78d18401ee0abd89c7559bbf422e5b1c7d01", + "sha256:b8b97a8a87cadcd3f94659b4ef6ec056261fa1e1c3317f4193ac231d4df70215", + "sha256:bd5b7ccae24e3d8501ee5563e82febc1771e73bd268eef82a1e8d2b4d556ae66", + "sha256:bdc02c0235b261925102b1bd586579b7158e9d0d07ecb61148a1799214a4afd5", + "sha256:be6b350dfbc7f708d9d853663772a9310783ea58f6035eec649fb9c4371b5389", + "sha256:c403c81bb8ffb1c993d0165a11493fd4bf1353d258f6997b3ee288b0a48fce77", + "sha256:cf8c6aed12a935abf2e290860af8e77b26a042eb7f2582ff83dc7ed5f963340c", + "sha256:d98addfd3c8728ee8b2c49126f3c44c703e2b005d4a95998e2167af176a9e722", + "sha256:dc76bca1ca98f4b122114435f83f1fcf3c0fe48e4e6f660e07996abf2f53903c", + "sha256:dec198619b7dbd6db58603cd256e092bcadef22a796f778bf87f8592b468441d", + "sha256:df28dda02c9328e122661f399f7655cdcbcf22ea42daa3650a26bce08a187450", + "sha256:e603ca1fb47b913942f3e660a15e55a9ebca906857edfea476ae5f0fe9b457d5", + "sha256:ecfdd68d334a6b97472ed032b5b37a30d8217c097acfff15e8452c710e775524" + ], + "markers": "python_version < '3.10' and platform_machine != 'aarch64' and platform_machine != 'arm64'", + "version": "==1.23.2" + }, + "packaging": { + "hashes": [ + "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", + "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" + ], + "markers": "python_version >= '3.6'", + "version": "==21.3" + }, + "pandas": { + "hashes": [ + "sha256:050aada67a5ec6699a7879e769825b510018a95fb9ac462bb1867483d0974a97", + "sha256:0959c41004e3d2d16f39c828d6da66ebee329836a7ecee49fb777ac9ad8a7501", + "sha256:4591cadd06fbbbd16fafc2de6e840c1aaefeae3d5864b688004777ef1bbdede3", + "sha256:51c424ca134fdaeac9a4acd719d1ab48046afc60943a489028f0413fdbe9ef1c", + "sha256:785e878a6e6d8ddcdb8c181e600855402750052497d7fc6d6b508894f6b8830b", + "sha256:799e6a25932df7e6b1f8dabf63de064e2205dc309abb75956126a0453fd88e97", + "sha256:7cd1d69a387f7d5e1a5a06a87574d9ef2433847c0e78113ab51c84d3a8bcaeaa", + "sha256:87b4194f344dcd14c0f885cecb22005329b38bda10f1aaf7b9596a00ec8a4768", + "sha256:8d4d2fe2863ecddb0ba1979bdda26c8bc2ea138f5a979abe3ba80c0fa4015c91", + "sha256:94f2ed1fd51e545ebf71da1e942fe1822ee01e10d3dd2a7276d01351333b7c6b", + "sha256:9d2a7a3c1fea668d56bd91edbd5f2732e0af8feb9d2bf8d9bfacb2dea5fa9536", + "sha256:9d805bce209714b1c1fa29bfb1e42ad87e4c0a825e4b390c56a3e71593b7e8d8", + "sha256:a08ceb59db499864c58a9bf85ab6219d527d91f14c0240cc25fa2c261032b2a7", + "sha256:a981cfabf51c318a562deb4ae7deec594c07aee7cf18b4594a92c23718ec8275", + "sha256:ab6c0d738617b675183e5f28db32b5148b694ad9bba0a40c3ea26d96b431db67", + "sha256:afbddad78a98ec4d2ce08b384b81730de1ccc975b99eb663e6dac43703f36d98", + "sha256:c4bb8b0ab9f94207d07e401d24baebfc63057246b1a5e0cd9ee50df85a656871", + "sha256:ce35f947202b0b99c660221d82beb91d2e6d553d55a40b30128204e3e2c63848", + "sha256:d0022fe6a313df1c4869b5edc012d734c6519a6fffa3cf70930f32e6a1078e49", + "sha256:e7cc960959be28d064faefc0cb2aef854d46b827c004ebea7e79b5497ed83e7d", + "sha256:ee6f1848148ed3204235967613b0a32be2d77f214e9623f554511047705c1e04" + ], + "markers": "python_version >= '3.8'", + "version": "==1.4.4" + }, + "parsedatetime": { + "hashes": [ + "sha256:3d817c58fb9570d1eec1dd46fa9448cd644eeed4fb612684b02dfda3a79cb84b", + "sha256:9ee3529454bf35c40a77115f5a596771e59e1aee8c53306f346c461b8e913094" + ], + "version": "==2.4" + }, + "pathspec": { + "hashes": [ + "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93", + "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d" + ], + "markers": "python_version >= '3.7'", + "version": "==0.10.1" + }, + "pluggy": { + "hashes": [ + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, + "py": { + "hashes": [ + "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.11.0" + }, + "pyarrow": { + "hashes": [ + "sha256:0238998dc692efcb4e41ae74738d7c1234723271ccf520bd8312dca07d49ef8d", + "sha256:02b820ecd1da02012092c180447de449fc688d0c3f9ff8526ca301cdd60dacd0", + "sha256:1c5a073a930c632058461547e0bc572da1e724b17b6b9eb31a97da13f50cb6e0", + "sha256:29eb3e086e2b26202f3a4678316b93cfb15d0e2ba20f3ec12db8fd9cc07cde63", + "sha256:2c715eca2092273dcccf6f08437371e04d112f9354245ba2fbe6c801879450b7", + "sha256:2e753f8fcf07d8e3a0efa0c8bd51fef5c90281ffd4c5637c08ce42cd0ac297de", + "sha256:3eef8a981f45d89de403e81fb83b8119c20824caddf1404274e41a5d66c73806", + "sha256:4eebdab05afa23d5d5274b24c1cbeb1ba017d67c280f7d39fd8a8f18cbad2ec9", + "sha256:5526a3bfb404ff6d31d62ea582cf2466c7378a474a99ee04d1a9b05de5264541", + "sha256:55328348b9139c2b47450d512d716c2248fd58e2f04e2fc23a65e18726666d42", + "sha256:767cafb14278165ad539a2918c14c1b73cf20689747c21375c38e3fe62884902", + "sha256:7fa56cbd415cef912677270b8e41baad70cde04c6d8a8336eeb2aba85aa93706", + "sha256:7fb02bebc13ab55573d1ae9bb5002a6d20ba767bf8569b52fce5301d42495ab7", + "sha256:81a60bb291a964f63b2717fb1b28f6615ffab7e8585322bfb8a6738e6b321282", + "sha256:8ad430cee28ebc4d6661fc7315747c7a18ae2a74e67498dcb039e1c762a2fb67", + "sha256:92f3977e901db1ef5cba30d6cc1d7942b8d94b910c60f89013e8f7bb86a86eef", + "sha256:9cef618159567d5f62040f2b79b1c7b38e3885f4ffad0ec97cd2d86f88b67cef", + "sha256:a5b390bdcfb8c5b900ef543f911cdfec63e88524fafbcc15f83767202a4a2491", + "sha256:d9eb04db626fa24fdfb83c00f76679ca0d98728cdbaa0481b6402bf793a290c0", + "sha256:da3e0f319509a5881867effd7024099fb06950a0768dad0d6873668bb88cfaba", + "sha256:f11a645a41ee531c3a5edda45dea07c42267f52571f818d388971d33fc7e2d4a", + "sha256:f241bd488c2705df930eedfe304ada71191dcf67d6b98ceda0cc934fd2a8388e", + "sha256:f59bcd5217a3ae1e17870792f82b2ff92df9f3862996e2c78e156c13e56ff62e", + "sha256:f8c46bde1030d704e2796182286d1c56846552c50a39ad5bf5a20c0d8159fc35", + "sha256:fc856628acd8d281652c15b6268ec7f27ebcb015abbe99d9baad17f02adc51f1", + "sha256:fe2ce795fa1d95e4e940fe5661c3c58aee7181c730f65ac5dd8794a77228de59" + ], + "markers": "python_version >= '3.7'", + "version": "==9.0.0" + }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" + }, + "pygments": { + "hashes": [ + "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1", + "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42" + ], + "markers": "python_version >= '3.6'", + "version": "==2.13.0" + }, + "pyparsing": { + "hashes": [ + "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", + "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" + ], + "markers": "python_full_version >= '3.6.8'", + "version": "==3.0.9" + }, + "pyrsistent": { + "hashes": [ + "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c", + "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc", + "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e", + "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26", + "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec", + "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286", + "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045", + "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec", + "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8", + "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c", + "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca", + "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22", + "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a", + "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96", + "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc", + "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1", + "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07", + "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6", + "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b", + "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5", + "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6" + ], + "markers": "python_version >= '3.7'", + "version": "==0.18.1" + }, + "pytest": { + "hashes": [ + "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7", + "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39" + ], + "markers": "python_version >= '3.7'", + "version": "==7.1.3" + }, + "pytest-mock": { + "hashes": [ + "sha256:77f03f4554392558700295e05aed0b1096a20d4a60a4f3ddcde58b0c31c8fca2", + "sha256:8a9e226d6c0ef09fcf20c94eb3405c388af438a90f3e39687f84166da82d5948" + ], + "index": "pypi", + "version": "==3.8.2" + }, + "python-dateutil": { + "hashes": [ + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.8.2" + }, + "python-slugify": { + "hashes": [ + "sha256:272d106cb31ab99b3496ba085e3fea0e9e76dcde967b5e9992500d1f785ce4e1", + "sha256:7b2c274c308b62f4269a9ba701aa69a797e9bca41aeee5b3a9e79e36b6656927" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==6.1.2" + }, + "pytimeparse": { + "hashes": [ + "sha256:04b7be6cc8bd9f5647a6325444926c3ac34ee6bc7e69da4367ba282f076036bd", + "sha256:e86136477be924d7e670646a98561957e8ca7308d44841e21f5ddea757556a0a" + ], + "version": "==1.1.8" + }, + "pytz": { + "hashes": [ + "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197", + "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5" + ], + "version": "==2022.2.1" + }, + "pyyaml": { + "hashes": [ + "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", + "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", + "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", + "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", + "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", + "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", + "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", + "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", + "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", + "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", + "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", + "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", + "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", + "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", + "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", + "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", + "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", + "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", + "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", + "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", + "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", + "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", + "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", + "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", + "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", + "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", + "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", + "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", + "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", + "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", + "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", + "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", + "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0" + }, + "regex": { + "hashes": [ + "sha256:02b6dc102123f5178796dcdb5a90f6e88895607fd1a1d115d8de1af8161ca2b4", + "sha256:0843cc977b9cc00eb2299b624db6481d25e7f5b093f7a7c2bb727028d4a26eda", + "sha256:085ca3dc9360c0210e0a70e5d34d66454a06077644e7679fef6358b1f053e62e", + "sha256:0a9d5a64e974bc5f160f30f76aaf993d49eeddb405676be6bf76a5a2c131e185", + "sha256:0de0ce11c0835e1117eacbfe8fa6fa98dc0e8e746b486735cb0fdebe46a02222", + "sha256:1418d3506a9582b23a27373f125ea2b0da523c581e7cf678a6f036254d134faa", + "sha256:14750172c0a616140a8f496dfef28ed24080e87d06d5838e008f959ad307a8c5", + "sha256:1b6d2c579ffdcbb3d93f63b6a7f697364594e1c1b6856958b3e61e3ca22c140a", + "sha256:1df31eaf147ecff3665ba861acb8f78221cd5501df072c9151dfa341dd24599f", + "sha256:21b6f939916aa61beea56393ebc8a9999060632ac22b8193c2cb67d6fd7cb2c3", + "sha256:2240fce3af236e4586a045c1be8bbf16c4f8831e68b7df918b72fc31a80143be", + "sha256:242f546fc5e49bb7395624ac3b4fc168bf454e11ace9804c58c4c3a90d84e38f", + "sha256:25bffa248b99b53a61b1f20fc7d19f711e38e9f0bc90d44c26670f8dc282ad7d", + "sha256:2ada67e02fa3fcca9e3b90cf24c2c6bc77f0abc126209937956aea10eeba40c7", + "sha256:2c198921afc811bc0f105c6e5150fbdebf9520c9b7d43cfc0ab156ca97f506d7", + "sha256:370b1d7aed26e29915c3fb3e72e327f194824a76cedb60c0b9f6c6af53e89d72", + "sha256:3aafbbf5076f2a48bcf31ceb42b410323daaa0ddb42544640592957bc906ace6", + "sha256:3d3d769b3d485b28d6a591b46723dbacc696e6503f48a3ef52e6fc2c90edb482", + "sha256:3d83fd6dd4263595d0e4f595d4abd54397cbed52c0147f7dd148a7b72910301e", + "sha256:45cb798095b886e4df6ff4a1f7661eb70620ccdef127e3c3e00a1aaa22d30e53", + "sha256:4bd9443f7ff6e6288dd4496215c5d903f851e55cbc09d5963587af0c6d565a0a", + "sha256:4bdfd016ab12c4075ef93f025b3cf4c8962b9b7a5e52bb7039ab64cb7755930c", + "sha256:4c6554073e3e554fbb3dff88376ada3da32ca789ea1b9e381f684d49ddb61199", + "sha256:4dad9d68574e93e1e23be53b4ecfb0f083bd5cc08cc7f1984a4ee3ebf12aa446", + "sha256:4e12a3c2d4781ee5d03f229c940934fa1e4ea4f4995e68ab97a2815b139e0804", + "sha256:53c9eca0d6070a8a3de42182ad26daf90ba12132eb74a2f45702332762aff84e", + "sha256:5910bb355f9517309f77101238dbacb7151ede3434a2f1fad26ecc62f13d8324", + "sha256:5c77eab46f3a2b2cd8bbe06467df783543bf7396df431eb4a144cc4b89e9fb3c", + "sha256:5d541bc430a74c787684d1ebcd205a5212a88c3de73848143e77489b2c25b911", + "sha256:5e7c8f9f8824143c219dd93cdc733c20d2c12f154034c89bcb4911db8e45bd92", + "sha256:5f14430535645712f546f1e07013507d1cc0c8abd851811dacce8c7fb584bf52", + "sha256:6059ae91667932d256d9dc03abd3512ebcade322b3a42d1b8354bd1db7f66dcc", + "sha256:61f6966371fa1cbf26c6209771a02bef80336cdaca0c0af4dfa33d51019c0b93", + "sha256:62d56a9d3c1e5a83076db4da060dad7ea35ac2f3cbd3c53ba5a51fe0caedb500", + "sha256:634f090a388351eadf1dcc1d168a190718fb68efb4b8fdc1b119cf837ca01905", + "sha256:64ecfcc386420192fbe98fdde777d993f7f2dfec9552e4f4024d3447d3a3e637", + "sha256:6af38997f178889d417851bae8fb5c00448f7405cfcab38734d771f1dd5d5973", + "sha256:6b30c8d299ba48ee919064628fd8bc296bdc6e4827d315491bea39437130d3e1", + "sha256:6f0c8807bac16984901c0573725bad786f2f004f9bd5df8476c6431097b6c5b3", + "sha256:6f62c8a59f6b8e608880c61b138ae22668184bc266b025d33200dcf2cebe0872", + "sha256:74d4aabd612d32282f3cb3ebb4436046fb840d25c754157a755bc9f66e7cd307", + "sha256:7658d2dfc1dabfb008ffe12ae47b98559e2aedd8237bee12f5aafb74d90479e3", + "sha256:777ceea2860a48e9e362a4e2a9a691782ea97bd05c24627c92e876fdd2c22e61", + "sha256:79f34d5833cd0d53ecf48bc030e4da3216bd4846224d17eeb64509be5cb098fd", + "sha256:7a52d547259495a53e61e37ffc6d5cecf8d298aeb1bc0d9b25289d65ddb31183", + "sha256:840063aa8eeb1dda07d7d7dee15648838bffef1d415f5f79061854a182a429aa", + "sha256:8e8ec94d1b1a0a297c2c69a0bf000baf9a79607ca0c084f577f811a9b447c319", + "sha256:95fb62a3980cf43e76c2fe95edab06ec70dc495b8aa660975eb9f0b2ffdae1e1", + "sha256:9668da78bcc219542467f51c2cd01894222be6aceec4b5efb806705900b794d8", + "sha256:99a7c5786de9e92ff5ffee2e8bed745f5d25495206f3f14656c379031e518334", + "sha256:a1e283ad918df44bad3ccf042c2fe283c63d17617570eb91b8c370ef677b0b83", + "sha256:a25d251546acb5edb1635631c4ae0e330fa4ec7c6316c01d256728fbfb9bbff2", + "sha256:abe1adb32e2535aaa171e8b2b2d3f083f863c9974a3e6e7dae6bf4827fc8b983", + "sha256:ae85112da2d826b65aa7c7369c56ca41d9a89644312172979cbee5cf788e0b09", + "sha256:b3379a83dc63fe06538c751961f9ed730b5d7f08f96a57bbad8d52db5820df1f", + "sha256:b3c7c6c4aac19b964c1d12784aecae7f0315314640b0f41dd6f0d4e2bf439072", + "sha256:b7ddecc80e87acf12c2cf12bf3721def47188c403f04e706f104b5e71fed2f31", + "sha256:bbaf6785d3f1cd3e617b9d0fb3c5528023ef7bc7cc1356234801dc1941df8ce9", + "sha256:be6f5b453f7ed2219a9555bb6840663950b9ab1dc034216f68eac64db66633c2", + "sha256:c2b6404631b22617b5127c6de2355393ccda693ca733a098b6802e7dabb3457a", + "sha256:c4f6609f6e867a58cdf173e1cbe1f3736d25962108bd5cb01ad5a130875ff2c8", + "sha256:c76dd2c0615a28de21c97f9f6862e84faef58ff4d700196b4e395ef6a52291e4", + "sha256:c78c72f7878071a78337510ec78ab856d60b4bdcd3a95fd68b939e7cb30434b3", + "sha256:cb0c9a1476d279524538ba9a00ecec9eadcef31a6a60b2c8bd2f29f62044a559", + "sha256:ccb986e80674c929f198464bce55e995178dea26833421e2479ff04a6956afac", + "sha256:cfa62063c5eafb04e4435459ce15746b4ae6c14efeae8f16bd0e3d2895dad698", + "sha256:d13bd83284b46c304eb10de93f8a3f2c80361f91f4e8a4e1273caf83e16c4409", + "sha256:d76e585368388d99ddd2f95989e6ac80a8fe23115e93931faad99fa34550612f", + "sha256:dc32029b9cc784a529f9201289d4f841cc24a2ae3126a112cd467bc41bbc2f10", + "sha256:e0b55651db770b4b5a6c7d015f24d1a6ede307296bbdf0c47fc5f6a6adc7abee", + "sha256:e37886929ee83a5fa5c73164abada00e7f3cc1cbf3f8f6e1e8cfecae9d6cfc47", + "sha256:f7b88bc7306136b123fd1a9beed16ca02900ee31d1c36e73fa33d9e525a5562d", + "sha256:fac611bde2609a46fcbd92da7171286faa2f5c191f84d22f61cd7dc27213f51d", + "sha256:fafed60103132e74cdfbd651abe94801eb87a9765ce275b3dca9af8f3e06622a" + ], + "markers": "python_version >= '3.6'", + "version": "==2022.8.17" + }, + "requests": { + "hashes": [ + "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", + "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + ], + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==2.28.1" + }, + "setuptools": { + "hashes": [ + "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82", + "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57" + ], + "markers": "python_version >= '3.7'", + "version": "==65.3.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sqlfluff": { + "hashes": [ + "sha256:2f3e3daff41c4c61f8021f33ebcd4f0eba1a874bbb51e49f38da692794d0cf2e", + "sha256:47dff29a8a533dabc543b573f23a9c4371c1ff9fb346ed1cc83d1f4cf23a1962" + ], + "index": "pypi", + "version": "==1.3.0" + }, + "sqlfluff-templater-dbt": { + "hashes": [ + "sha256:91b7176fa5dabe0ad69fd88b365aa70a0155ec72c8a6550bd6e3bd4bf5b16590", + "sha256:c4feb48e0303b7fd70f05fa7f2ff2f8e5ce1533a7f49e5a1e6acb3117ea6cda9" + ], + "index": "pypi", + "version": "==1.3.0" + }, + "sqlparams": { + "hashes": [ + "sha256:79e4136cf4333ccbcd559793058740479df2386fbaedb0d03ff2b3c0e1c53b1a", + "sha256:bab69f000493013a1d563ffff2a22e2b18a69cf72fc1036431c2e59db3d4d9fb" + ], + "markers": "python_version >= '3.7'", + "version": "==5.0.0" + }, + "sqlparse": { + "hashes": [ + "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae", + "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d" + ], + "markers": "python_version >= '3.5'", + "version": "==0.4.2" + }, + "tblib": { + "hashes": [ + "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c", + "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.7.0" + }, + "text-unidecode": { + "hashes": [ + "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", + "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93" + ], + "version": "==1.3" + }, + "thrift": { + "hashes": [ + "sha256:9af1c86bf73433afc6010ed376a6c6aca2b54099cc0d61895f640870a9ae7d89" + ], + "version": "==0.13.0" + }, + "toml": { + "hashes": [ + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.1" + }, + "tqdm": { + "hashes": [ + "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4", + "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==4.64.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02", + "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6" + ], + "markers": "python_version >= '3.7'", + "version": "==4.3.0" + }, + "urllib3": { + "hashes": [ + "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", + "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'", + "version": "==1.26.12" + }, + "werkzeug": { + "hashes": [ + "sha256:1ce08e8093ed67d638d63879fd1ba3735817f7a80de3674d293f5984f25fb6e6", + "sha256:72a4b735692dd3135217911cbeaa1be5fa3f62bffb8745c5215420a03dc55255" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.2" + }, + "zipp": { + "hashes": [ + "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2", + "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009" + ], + "markers": "python_version >= '3.7'", + "version": "==3.8.1" + } + }, + "develop": { + "attrs": { + "hashes": [ + "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", + "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" + ], + "markers": "python_version >= '3.5'", + "version": "==22.1.0" + }, + "iniconfig": { + "hashes": [ + "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", + "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + ], + "version": "==1.1.1" + }, + "packaging": { + "hashes": [ + "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", + "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" + ], + "markers": "python_version >= '3.6'", + "version": "==21.3" + }, + "pluggy": { + "hashes": [ + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, + "py": { + "hashes": [ + "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.11.0" + }, + "pyparsing": { + "hashes": [ + "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", + "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" + ], + "markers": "python_full_version >= '3.6.8'", + "version": "==3.0.9" + }, + "pytest": { + "hashes": [ + "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7", + "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39" + ], + "markers": "python_version >= '3.7'", + "version": "==7.1.3" + }, + "pytest-mock": { + "hashes": [ + "sha256:77f03f4554392558700295e05aed0b1096a20d4a60a4f3ddcde58b0c31c8fca2", + "sha256:8a9e226d6c0ef09fcf20c94eb3405c388af438a90f3e39687f84166da82d5948" + ], + "index": "pypi", + "version": "==3.8.2" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.1" + } + } +} diff --git a/README.md b/README.md index e39f9dc1c..70b0a64ac 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,32 @@ ## Testing dbt project: `jaffle_shop` -`jaffle_shop` is a fictional ecommerce store. This dbt project transforms raw data from an app database into a customers and orders model ready for analytics. - +`jaffle_shop` is a fictional ecommerce store. This dbt project transforms raw data from an app database into customers and orders warehouse models and some basic analytics models. ### What is this repo? What this repo _is_: -- A self-contained playground dbt project, useful for testing out scripts, and communicating some of the core dbt concepts. +- A repo for aspiring dbt gatekeepers to put their learnings to the test and transform a seemingly unstructured repo into one fit for the Octopus datalake. What this repo _is not_: - A tutorial — check out the [Getting Started Tutorial](https://docs.getdbt.com/tutorial/setting-up) for that. Notably, this repo contains some anti-patterns to make it self-contained, namely the use of seeds instead of sources. -- A demonstration of best practices — check out the [dbt Learn Demo](https://github.com/dbt-labs/dbt-learn-demo) repo instead. We want to keep this project as simple as possible. As such, we chose not to implement: - - our standard file naming patterns (which make more sense on larger projects, rather than this five-model project) - - a pull request flow - - CI/CD integrations -- A demonstration of using dbt for a high-complex project, or a demo of advanced features (e.g. macros, packages, hooks, operations) — we're just trying to keep things simple here! +- A demonstration of using dbt for a high-complex project, or a demo of advanced features — some of these are included and we'll add to them over time but for now we're just trying to keep things simple here! ### What's in this repo? This repo contains [seeds](https://docs.getdbt.com/docs/building-a-dbt-project/seeds) that includes some (fake) raw data from a fictional app. The raw data consists of customers, orders, and payments, with the following entity-relationship diagram: - +0 ![Jaffle Shop ERD](/etc/jaffle_shop_erd.png) +### How to use this repo and become a gatekeeper? -### Running this project -To get up and running with this project: -1. Install dbt using [these instructions](https://docs.getdbt.com/docs/installation). - -2. Clone this repository. - -3. Change into the `jaffle_shop` directory from the command line: -```bash -$ cd jaffle_shop -``` - -4. Set up a profile called `jaffle_shop` to connect to a data warehouse by following [these instructions](https://docs.getdbt.com/docs/configure-your-profile). If you have access to a data warehouse, you can use those credentials – we recommend setting your [target schema](https://docs.getdbt.com/docs/configure-your-profile#section-populating-your-profile) to be a new schema (dbt will create the schema for you, as long as you have the right privileges). If you don't have access to an existing data warehouse, you can also setup a local postgres database and connect to it in your profile. - -5. Ensure your profile is setup correctly from the command line: -```bash -$ dbt debug -``` - -6. Load the CSVs with the demo data set. This materializes the CSVs as tables in your target schema. Note that a typical dbt project **does not require this step** since dbt assumes your raw data is already in your warehouse. -```bash -$ dbt seed -``` - -7. Run the models: -```bash -$ dbt run -``` - -> **NOTE:** If this steps fails, it might mean that you need to make small changes to the SQL in the models folder to adjust for the flavor of SQL of your target database. Definitely consider this if you are using a community-contributed adapter. +In its base state the repo is not fit for purpose. While it works, it doesn't comply with many of the conventions we enforce at octopus so your goal is to remedy that. -8. Test the output of the models: -```bash -$ dbt test -``` +When you make a PR from your branch CircleCI will run tests to ensure that your changes comply with Octopus conventions. +If all your tests pass... Congrats, You're a gatekeeper! Let one of the @dbt_gatekeepers know and send them a link to your PR. +Remember not to merge it, the repo is broken on purpose! -9. Generate documentation for the project: -```bash -$ dbt docs generate -``` +### So what needs doing to the repo? -10. View the documentation for the project: -```bash -$ dbt docs serve -``` +The point of being a gatekeeper is being able to look at a PR and know where to look for possible convention breaches. Check the [data platform docs](http://docs.eks.octopus.engineering/reference/dbt_gatekeeper_checklist/) site for tips on how to gatekeep. ### What is a jaffle? A jaffle is a toasted sandwich with crimped, sealed edges. Invented in Bondi in 1949, the humble jaffle is an Australian classic. The sealed edges allow jaffle-eaters to enjoy liquid fillings inside the sandwich, which reach temperatures close to the core of the earth during cooking. Often consumed at home after a night out, the most classic filling is tinned spaghetti, while my personal favourite is leftover beef stew with melted cheese. diff --git a/dbt_project.yml b/dbt_project.yml index acdce4c57..1fb8ada90 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -5,11 +5,10 @@ version: '0.1' profile: 'jaffle_shop' -model-paths: ["models"] -seed-paths: ["seeds"] -test-paths: ["tests"] -analysis-paths: ["analysis"] -macro-paths: ["macros"] +macro-paths: ["jaffle_shop/macros"] +model-paths: ["jaffle_shop/models"] +seed-paths: ["jaffle_shop/seeds"] +snapshot-paths: ["jaffle_shop/snapshots"] target-path: "target" clean-targets: @@ -19,6 +18,10 @@ clean-targets: require-dbt-version: [">=1.0.0", "<2.0.0"] +dispatch: + - macro_namespace: dbt_utils + search_order: ['dbt_project_evaluator', 'spark_utils', 'dbt_utils'] + models: jaffle_shop: materialized: table diff --git a/jaffle_shop/macros/sensitive/get_meta_columns.sql b/jaffle_shop/macros/sensitive/get_meta_columns.sql new file mode 100644 index 000000000..9f7544224 --- /dev/null +++ b/jaffle_shop/macros/sensitive/get_meta_columns.sql @@ -0,0 +1,29 @@ +{% macro get_meta_columns(model_name, meta_key=none, node_type='model', project='jaffle_shop') %} + + {% if execute %} + + {% set meta_columns = [] %} + + {% set fqname = node_type ~ '.' ~ project ~ '.' ~ model_name %} + {% set columns = graph.nodes[fqname]['columns'] %} + + {% for column in columns %} + {% if meta_key is not none %} + + {% if graph.nodes[fqname]['columns'][column]['meta'][meta_key] == true %} + + {# {% do log("Sensitive: " ~ column, info=true) %} #} + + {% do meta_columns.append(column) %} + + {% endif %} + {% else %} + {% do meta_columns.append(column) %} + {% endif %} + {% endfor %} + + {{ return(meta_columns) }} + + {% endif %} + +{% endmacro %} diff --git a/jaffle_shop/macros/sensitive/get_salt.sql b/jaffle_shop/macros/sensitive/get_salt.sql new file mode 100644 index 000000000..93a44a862 --- /dev/null +++ b/jaffle_shop/macros/sensitive/get_salt.sql @@ -0,0 +1,3 @@ +{% macro get_salt(column_name) %} + {{ return( env_var("SALT") ) }} +{% endmacro %} diff --git a/jaffle_shop/macros/sensitive/hash_of_column.sql b/jaffle_shop/macros/sensitive/hash_of_column.sql new file mode 100644 index 000000000..af53dc504 --- /dev/null +++ b/jaffle_shop/macros/sensitive/hash_of_column.sql @@ -0,0 +1,13 @@ +{% macro hash_of_column(column) %} + + SHA2( + TRIM( + LOWER( + CAST({{ column|lower }} AS {{ dbt_utils.type_string() }}) + || '{{ jaffle_shop.get_salt(column|lower) }}' + ) + ), + 256 + ) AS {{column|lower}}_hash, + +{% endmacro %} diff --git a/jaffle_shop/macros/sensitive/hash_sensitive_columns.sql b/jaffle_shop/macros/sensitive/hash_sensitive_columns.sql new file mode 100644 index 000000000..8deb33457 --- /dev/null +++ b/jaffle_shop/macros/sensitive/hash_sensitive_columns.sql @@ -0,0 +1,11 @@ +{% macro hash_sensitive_columns(source_table, project='jaffle_shop') %} + + {% set pii_columns = jaffle_shop.get_meta_columns(source_table, "sensitive", project=project) %} + + {%- for column in pii_columns %} + {{ jaffle_shop.hash_of_column(column) }} + {% endfor %} + + {{ dbt_utils.star(from=ref(source_table), except=pii_columns) }} + +{% endmacro %} diff --git a/jaffle_shop/macros/sensitive/macros.md b/jaffle_shop/macros/sensitive/macros.md new file mode 100644 index 000000000..abe48f089 --- /dev/null +++ b/jaffle_shop/macros/sensitive/macros.md @@ -0,0 +1,22 @@ +{% docs get_meta_columns %} +This macro will fetch and return the column names which have the passed `meta_key` equal to True. It reads the graph and can fetch column data from models and sources. +{% enddocs %} + +{% docs hash_of_column %} +This macro hashes the column passed in with an obscured salt that it derives from the `get_salt` macro. +{% enddocs %} + +{% docs hash_sensitive_columns %} +This macro calls the `get_meta_columns` macro to fetch the columns to be hashed. By default it is looking for the key `sensitive`. It iterates through the columns and performs a sha2 hash on them using the `hash_of_column` macro. It then selects the remaining columns from the provided source table and does a select star without the hashed columns. + +This is meant to be used in parallel with `nohash_sensitive_columns`. +{% enddocs %} + + +{% docs nohash_sensitive_columns %} +This macro calls the `get_meta_columns` macro to fetches the columns sensitive columns. It takes the `join_key` passed and hashes it with sha2 using the `hash_of_column` macro. This is so data can be joined when `hash_sensitive_columns` is used. It then iterates through the sensitive columns and prints them out with no change. +{% enddocs %} + +{% docs get_salt %} +This macro returns a salt from the environment variable. +{% enddocs %} diff --git a/jaffle_shop/macros/sensitive/macros.yml b/jaffle_shop/macros/sensitive/macros.yml new file mode 100644 index 000000000..2e8684da0 --- /dev/null +++ b/jaffle_shop/macros/sensitive/macros.yml @@ -0,0 +1,45 @@ +version: 2 + +macros: + - name: get_meta_columns + description: '{{ doc("get_meta_columns") }}' + arguments: + - name: model_name + type: string + description: Name of the dbt model. Typically the file name. + - name: meta_key + type: string + description: The key to look for in the `meta` dictionary. + - name: node_type + type: string + description: Defaults to model. Could be source. + - name: project + type: string + description: Defaults to `datalake_models`. Could be something else. + - name: hash_sensitive_columns + description: '{{ doc("hash_sensitive_columns") }}' + arguments: + - name: source_table + type: string + description: The name of the model to select from. + - name: nohash_sensitive_columns + description: '{{ doc("nohash_sensitive_columns") }}' + arguments: + - name: source_table + type: string + description: The name of the model to select from. + - name: join_key + type: string + description: An optional hashed join key, if the joining key is also sensitive. + - name: get_salt + description: '{{ doc("get_salt") }}' + arguments: + - name: column_name + type: string + description: Name of the column to get the salt for. + - name: hash_of_column + description: '{{ doc("hash_of_column") }}' + arguments: + - name: column + type: string + description: Name of the column to get SQL for to hash. diff --git a/jaffle_shop/macros/sensitive/nohash_sensitive_columns.sql b/jaffle_shop/macros/sensitive/nohash_sensitive_columns.sql new file mode 100644 index 000000000..f0edbd268 --- /dev/null +++ b/jaffle_shop/macros/sensitive/nohash_sensitive_columns.sql @@ -0,0 +1,13 @@ +{% macro nohash_sensitive_columns(source_table, join_key=none, project='jaffle_shop') %} + + {% set meta_columns = jaffle_shop.get_meta_columns(source_table, "sensitive", project=project) %} + + {% if join_key is not none -%} + {{ hash_of_column(join_key) }} + {%- endif %} + + {%- for column in meta_columns %} + {{ column }} {% if not loop.last %} , {% endif %} + {%- endfor %} + +{% endmacro %} \ No newline at end of file diff --git a/seeds/raw_customers.csv b/jaffle_shop/seeds/raw_customers.csv similarity index 100% rename from seeds/raw_customers.csv rename to jaffle_shop/seeds/raw_customers.csv diff --git a/seeds/raw_orders.csv b/jaffle_shop/seeds/raw_orders.csv similarity index 100% rename from seeds/raw_orders.csv rename to jaffle_shop/seeds/raw_orders.csv diff --git a/seeds/raw_payments.csv b/jaffle_shop/seeds/raw_payments.csv similarity index 100% rename from seeds/raw_payments.csv rename to jaffle_shop/seeds/raw_payments.csv diff --git a/package_projects/dbt_project_evaluator.yml b/package_projects/dbt_project_evaluator.yml new file mode 100644 index 000000000..12e86f3e4 --- /dev/null +++ b/package_projects/dbt_project_evaluator.yml @@ -0,0 +1,87 @@ +name: 'dbt_project_evaluator' +version: '1.0.0' +config-version: 2 + +require-dbt-version: [">=1.1.0", "<2.0.0"] + +model-paths: ["models"] +analysis-paths: ["analysis"] +test-paths: ["tests"] +seed-paths: ["seeds"] +macro-paths: ["macros"] +snapshot-paths: ["snapshots"] + +target-path: "target" # directory which will store compiled SQL files +clean-targets: # directories to be removed by `dbt clean` + - "target" + - "dbt_packages" + +dispatch: + - macro_namespace: dbt_utils + search_order: ['dbt_project_evaluator', 'spark_utils', 'dbt_utils'] + +models: + dbt_project_evaluator: + marts: + core: + int_all_graph_resources: + +materialized: table + int_direct_relationships: + # required for BigQuery and Redshift for performance/memory reasons + +materialized: "{{ 'table' if target.type in ['bigquery', 'redshift', 'databricks'] else 'view' }}" + int_all_dag_relationships: + # required for BigQuery, Redshift, and Databricks for performance/memory reasons + +materialized: "{{ 'table' if target.type in ['bigquery', 'redshift', 'databricks'] else 'view' }}" + dag: + +materialized: table + staging: + graph: + stg_nodes: + +materialized: table + stg_node_relationships: + +materialized: table + variables: + stg_naming_convention_folders: + # required for Redshift because listagg runs only on tables + +materialized: "{{ 'table' if target.type == 'redshift' else 'view' }}" + stg_naming_convention_prefixes: + # required for Redshift because listagg runs only on tables + +materialized: "{{ 'table' if target.type == 'redshift' else 'view' }}" + + +vars: + + # -- Tests and docs coverage variables -- + documentation_coverage_target: 100 + test_coverage_target: 100 + + # -- DAG variables -- + models_fanout_threshold: 3 + + # -- Naming conventions variables -- + # to add a new "layer", update the variable list_layers + # and create new variables with the names _folder_name and/or _prefixes + model_types: ['staging', 'intermediate', 'warehouse', 'final', 'tests'] + + staging_folder_name: 'staging' + intermediate_folder_name: 'intermediate' + warehouse_folder_name: 'warehouse' + final_folder_name: 'final' + tests_folder_name: 'tests' + + staging_prefixes: ['stg_'] + intermediate_prefixes: ['inter_'] + warehouse_prefixes: ['wh_'] + final_prefixes: ['fnl_'] + tests_prefixes: ['test_'] + + # -- Performance variables -- + chained_views_threshold: 5 + + # -- Warehouse specific variables -- + max_depth_dag: 9 + +seeds: + dbt_project_evaluator: + dbt_project_evaluator_exceptions: + +enabled: false \ No newline at end of file diff --git a/packages.yml b/packages.yml new file mode 100644 index 000000000..81ec273e5 --- /dev/null +++ b/packages.yml @@ -0,0 +1,9 @@ +packages: + - package: dbt-labs/dbt_utils + version: 0.8.6 + - package: dbt-labs/spark_utils + version: 0.3.0 + - package: dbt-labs/codegen + version: 0.7.0 + - package: dbt-labs/dbt_project_evaluator + version: 0.1.3 \ No newline at end of file diff --git a/seeds/.gitkeep b/seeds/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/selectors.yml b/selectors.yml new file mode 100644 index 000000000..1ae4be2b7 --- /dev/null +++ b/selectors.yml @@ -0,0 +1,15 @@ +selectors: + - name: jaffle_shop + description: > + Run all jaffle shop models and ignore packages. + definition: + method: fqn + value: "*" + exclude: + - "package:dbt_project_evaluator" + - name: dbt_project_evaluator + description: > + Run all dbt project evaluator models + definition: + method: package + value: "dbt_project_evaluator" diff --git a/testing/profiles.yml b/testing/profiles.yml new file mode 100644 index 000000000..1701dc714 --- /dev/null +++ b/testing/profiles.yml @@ -0,0 +1,10 @@ +jaffle_shop: + target: jaffle_shop + outputs: + jaffle_shop: + type: databricks + host: "{{ env_var('DATABRICKS_HOST') }}" + token: "{{ env_var('DATABRICKS_TOKEN') }}" + schema: "{{ env_var('DATABRICKS_TARGET') }}" + http_path: "/sql/1.0/endpoints/{{ env_var('DATABRICKS_ENDPOINT') }}" + threads: 300 diff --git a/testing/test_structure.py b/testing/test_structure.py new file mode 100644 index 000000000..bb377e899 --- /dev/null +++ b/testing/test_structure.py @@ -0,0 +1 @@ +import pytest \ No newline at end of file From 70b34e3f1305e90d08206a70e8a4e158b7db3286 Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Tue, 6 Sep 2022 09:47:53 +0100 Subject: [PATCH 02/13] Add linting and structure tests --- testing/__init__.py | 0 testing/lint_models.py | 94 ++++++++++++++++++++ testing/manifests.py | 153 ++++++++++++++++++++++++++++++++ testing/structure.py | 5 ++ testing/test_lint_models.py | 65 ++++++++++++++ testing/test_manifests.py | 169 ++++++++++++++++++++++++++++++++++++ testing/test_structure.py | 58 ++++++++++++- 7 files changed, 543 insertions(+), 1 deletion(-) create mode 100644 testing/__init__.py create mode 100644 testing/lint_models.py create mode 100644 testing/manifests.py create mode 100644 testing/structure.py create mode 100644 testing/test_lint_models.py create mode 100644 testing/test_manifests.py diff --git a/testing/__init__.py b/testing/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/testing/lint_models.py b/testing/lint_models.py new file mode 100644 index 000000000..5e7f8c161 --- /dev/null +++ b/testing/lint_models.py @@ -0,0 +1,94 @@ +import logging +import subprocess +from typing import Callable, List +import sys +import json +import re + + +logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) +logging = logging.getLogger(__name__) + +def get_args(): + # Get args passed to the script from the make file + # so we can differentiate from local dev and CI. + if len(sys.argv) > 1: + args = json.loads(sys.argv[1]) + else: + args = {} + return args + +def dbt_ls_modified_paths_output( + args: dict +) -> List[str]: + if 'docker' in args: + ls_command = ["./dbt_local"] + else: + ls_command = [] + + ls_command.extend(["dbt", + "ls", + "--select", + "state:modified", + "--state", + "production_target/", + "--output", + "path", + ]) + # Add a profile argument for when the script is being run in CI + if 'ci_profile' in args: + ls_command.extend(["--profile", f"{args['ci_profile']}"]) + print(ls_command) + ls_output = subprocess.run(ls_command, capture_output=True) + ls_output_list = ls_output.stdout.decode("utf-8").split("\n") + print(ls_output_list) + return ls_output_list + +def get_modified_lintable_paths(output_lines: List +) -> List[str]: + changed_model_paths = re.findall(r'[\/\w-]+.sql', ' '.join(output_lines)) + if len(changed_model_paths) > 0: + logging.info("Found modified paths...proceeding.") + return changed_model_paths + else: + logging.info("No modified paths found. Exiting.") + +def build_sqlfluff_command( + args: dict, + lintable_paths: List +): + # Specify lint or fix command + if 'docker' in args: + sqlfluff_command = "./dbt_local " + else: + sqlfluff_command = '' + if 'fix' in args: + sqlfluff_command = sqlfluff_command + "sqlfluff fix" + else: + sqlfluff_command = sqlfluff_command + "sqlfluff lint" + # Add additional ci config when run in CI + if 'ci_config_path' in args: + sqlfluff_command = sqlfluff_command + ' --config ' + args['ci_config_path'] + sqlfluff_command = sqlfluff_command + ' ' + ' '.join(lintable_paths) + return sqlfluff_command + +def run_sqlfluff_on_modified_paths(): + args = get_args() + output_lines = dbt_ls_modified_paths_output(args) + lintable_paths = get_modified_lintable_paths(output_lines) + logging.info(lintable_paths) + if lintable_paths: + sqlfluff_command = build_sqlfluff_command(args, lintable_paths) + logging.info(f'Executing: "{sqlfluff_command}"') + res = subprocess.run( + sqlfluff_command, shell=True + ) + if res.returncode != 0: + raise Exception(f"Linting failed.") + else: + logging.info('No lintable paths found.') + + + +if __name__ == "__main__": + run_sqlfluff_on_modified_paths() diff --git a/testing/manifests.py b/testing/manifests.py new file mode 100644 index 000000000..ccf7d0ee7 --- /dev/null +++ b/testing/manifests.py @@ -0,0 +1,153 @@ +import os +import base64 +import json +import logging +import requests +import argparse + +logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) +logging = logging.getLogger(__name__) + + +def delete_previous_merged_build_number(project, circle_ci_token_b64): + previous_merged_build_number = get_merged_build_number(project, circle_ci_token_b64) + url = f"https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar/{project}_CURRENT_MERGED_BUILD_NUMBER_{previous_merged_build_number}" + headers = {"content-type": "application/json", + "authorization": f"Basic '{circle_ci_token_b64}'"} + response = requests.request("DELETE", url, headers=headers) + if response.status_code == 200: + logging.info(f"Deleted previous build number: {previous_merged_build_number}") + logging.info(response.json()) + return response.json() + else: + logging.info("Failed to find previous build number. Continuing.") + logging.info(response.json()) + return response.json() + + +def post_merged_build_number(project, circle_ci_token_b64, circle_build_number): + url = "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar" + headers = {"content-type": "application/json", + "authorization": f"Basic '{circle_ci_token_b64}'"} + data = {"name": f"{project}_CURRENT_MERGED_BUILD_NUMBER_{circle_build_number}", + "value": "a_random_value_of_no_importance"} + response = requests.post(url, headers=headers, json=data) + if response.status_code == 201: + logging.info("Posted new merged build number.") + logging.info(response.json()) + delete_previous_merged_build_number_result = delete_previous_merged_build_number(project, circle_ci_token_b64) + return response.json() + else: + raise Exception(response, f"Failed to post merged build number as env var.") + + +def get_merged_build_number(project, circle_ci_token_b64): + url = "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar" + headers = {"content-type": "application/json", + "authorization": f"Basic '{circle_ci_token_b64}'"} + response = requests.get(url, headers=headers) + if response.status_code == 200: + env_vars = response.json()['items'] + project_build_number_string = [env_var['name'] for env_var in env_vars if + f'{project}_CURRENT_MERGED_BUILD_NUMBER_' in env_var[ + 'name']][0] + project_build_number = int( + project_build_number_string.replace(f'{project}_CURRENT_MERGED_BUILD_NUMBER_', '')) + logging.info(f'Found current merged build number: {project_build_number}') + return project_build_number + else: + raise Exception( + response.status_code, + response.json(), + f"Failed to find merged build number." + ) + + +def get_production_manifest_url(project, circle_ci_token_b64): + project_build_number = get_merged_build_number(project, circle_ci_token_b64) + url = f"https://circleci.com/api/v2/project/github/octoenergy/datalake-models/{project_build_number}/artifacts" + headers = {"content-type": "application/json", + "authorization": f"Basic '{circle_ci_token_b64}'"} + response = requests.get(url, headers=headers) + if response.status_code == 200: + logging.info(f'{response.status_code}: Found production manifest url.') + manifest_url = response.json()['items'][0]['url'] + return manifest_url + else: + raise Exception(response, f"Failed to retrieve production manifest URL.") + + +def get_production_manifest(project, circle_ci_token_b64): + artifact_url = get_production_manifest_url(project, circle_ci_token_b64) + circle_ci_token = base64.b64decode(circle_ci_token_b64).decode('utf-8') + headers = { + "content-type": "application/json", + "Circle-Token": f"{circle_ci_token}" + } + response = requests.get(artifact_url, headers=headers) + if response.status_code == 200: + production_manifest = response.json() + logging.info(f'{response.status_code}: Retrieved production manifest.') + return production_manifest + else: + raise Exception(response.status_code, response.json(), f"Failed to retrieve manifest.") + + +def save_production_manifest_to_state_dir(project, circle_ci_token_b64, state_directory): + production_manifest = get_production_manifest(project, circle_ci_token_b64) + if not os.path.isdir(state_directory): + os.mkdir(state_directory) + with open(f'{state_directory}/manifest.json', 'w') as f: + json.dump(production_manifest, f) + logging.info(f'Manifest saved to {state_directory}/manifest.json') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + 'command', + help='get_production_manifest or post_build_number or save_production_manifest_to_state_dir', + nargs='?', + choices=( + 'post_merged_build_number', + 'get_merged_build_number', + 'save_production_manifest_to_state_dir' + ) + ) + parser.add_argument("project", type=str, help="The project to get the manifest for") + parser.add_argument("token", type=str, help="Base 64 encoded Circle Ci Token") + parser.add_argument( + "--circle_build_number", + type=int, + help="Circle build number to encode and post as an environment variable in CI" + ) + parser.add_argument( + "--state_directory", + type=str, + default='production_target', + help="Directory in which to store the production manifest for comparison." + ) + args = parser.parse_args() + + if not args.project: + raise Exception(f"Must specify a project.") + elif not args.token: + raise Exception(f"Could not find Circle Ci Token environment variable.") + else: + pass + + if args.command == 'post_merged_build_number' and args.circle_build_number: + post_merged_build_number(args.project, args.token, args.circle_build_number) + elif args.command == 'get_merged_build_number': + merged_build_number = get_merged_build_number(args.project, args.token) + print(merged_build_number) + elif args.command == 'save_production_manifest_to_state_dir': + save_production_manifest_to_state_dir(args.project, args.token, args.state_directory) + else: + raise Exception(''' + Must specify one of: + - post_merged_build_number and circle_build_number + - get_merged_build_number + - save_production_manifest_to_state_dir + ''' + ) diff --git a/testing/structure.py b/testing/structure.py new file mode 100644 index 000000000..d06df0637 --- /dev/null +++ b/testing/structure.py @@ -0,0 +1,5 @@ +import os, fnmatch + +def get_directory_structure(path): + return sorted([os.path.join(dp, f) for dp, dn, fn in os.walk(os.path.expanduser(path)) + for f in fn]) \ No newline at end of file diff --git a/testing/test_lint_models.py b/testing/test_lint_models.py new file mode 100644 index 000000000..cd1f3326b --- /dev/null +++ b/testing/test_lint_models.py @@ -0,0 +1,65 @@ +import pytest +from .lint_models import ( + dbt_ls_modified_paths_output, + get_modified_lintable_paths, + build_sqlfluff_command, + run_sqlfluff_on_modified_paths +) + +@pytest.fixture +def subprocess(mocker): + return mocker.patch("testing.lint_models.subprocess") + +@pytest.fixture +def args_lint(): + return {} + +@pytest.fixture +def args_fix(): + return {'fix': 'True'} + +@pytest.fixture +def args_ci(): + return {"ci_profile": "testing", "ci_config_path": ".sqlfluffci"} + +@pytest.fixture +def output_lines(): + return [ + 'blah.yml', + 'core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql', + 'core/models/consumer/staging/src_consumer/stg_django_content_type.sql' + ] + +@pytest.fixture +def modified_lintable_paths(): + return ["core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql", + "core/models/consumer/staging/src_consumer/stg_django_content_type.sql" + ] + +def test_dbt_ls_modified_paths_output_lint(args_lint, subprocess, output_lines): + subprocess.run.return_value.stdout = b'blah.yml\ncore/models/consumer/staging/src_consumer/stg_data_accountapplication.sql\ncore/models/consumer/staging/src_consumer/stg_django_content_type.sql' + output = dbt_ls_modified_paths_output(args_lint) + assert output == output_lines + +def test_dbt_ls_modified_paths_output_ci(args_ci, subprocess, output_lines): + subprocess.run.return_value.stdout = b'blah.yml\ncore/models/consumer/staging/src_consumer/stg_data_accountapplication.sql\ncore/models/consumer/staging/src_consumer/stg_django_content_type.sql' + output = dbt_ls_modified_paths_output(args_ci) + call_args = subprocess.run.call_args[0][0] + assert '--profile' in call_args + assert output == output_lines + +def test_get_modified_lintable_paths(output_lines, modified_lintable_paths): + output = get_modified_lintable_paths(output_lines) + assert output == modified_lintable_paths + +def test_build_sqlfluff_command_lint(args_lint, modified_lintable_paths): + output = build_sqlfluff_command(args_lint, modified_lintable_paths) + assert output == "sqlfluff lint core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql core/models/consumer/staging/src_consumer/stg_django_content_type.sql" + +def test_build_sqlfluff_command_fix(args_fix, modified_lintable_paths): + output = build_sqlfluff_command(args_fix, modified_lintable_paths) + assert output == "sqlfluff fix core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql core/models/consumer/staging/src_consumer/stg_django_content_type.sql" + +def test_build_sqlfluff_command_ci(args_ci, modified_lintable_paths): + output = build_sqlfluff_command(args_ci, modified_lintable_paths) + assert output == "sqlfluff lint --config .sqlfluffci core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql core/models/consumer/staging/src_consumer/stg_django_content_type.sql" diff --git a/testing/test_manifests.py b/testing/test_manifests.py new file mode 100644 index 000000000..d8d359e99 --- /dev/null +++ b/testing/test_manifests.py @@ -0,0 +1,169 @@ +import pytest +from .manifests import ( + delete_previous_merged_build_number, + post_merged_build_number, + get_merged_build_number, + get_production_manifest_url, + get_production_manifest, + save_production_manifest_to_state_dir +) + +@pytest.fixture() +def delete_previous_merged_build_number_response(): + return {'message': 'Environment variable deleted.'} + + +@pytest.fixture() +def post_merged_build_number_request_response(): + return { + 'name': 'oegb_CURRENT_MERGED_BUILD_NUMBER_45451', + 'value': 'xxxxance' + } + + +@pytest.fixture() +def get_merged_build_number_get_request_response(): + return { + 'next_page_token': None, + 'items': [ + {'name': 'oegb_CURRENT_MERGED_BUILD_NUMBER_45451', + 'value': 'xxxxance'}, + ] + } + + +@pytest.fixture() +def get_merged_build_number_expected(): + return 45451 + + +@pytest.fixture() +def get_production_manifest_url_get_request_response(): + return { + 'next_page_token': None, + 'items': [ + { + 'path': 'production_target/manifest.json', + 'node_index': 0, + 'url': 'https://output.circle-artifacts.com/output/job/8ad304ab-b1f9-47e8-b57d-9f2073bad057/artifacts/0/production_target/manifest.json' + } + ] + } + + +@pytest.fixture() +def get_production_manifest_url_expected(): + return 'https://output.circle-artifacts.com/output/job/8ad304ab-b1f9-47e8-b57d-9f2073bad057/artifacts/0/production_target/manifest.json' + + +@pytest.fixture() +def get_production_manifest_get_request_response(): + return { + "metadata": + { + "dbt_schema_version": "some_data", + } + } + +def test_delete_previous_merged_build_number(mocker, delete_previous_merged_build_number_response): + mock_get_merged_build_number = mocker.patch("testing.manifests.get_merged_build_number", + return_value=get_merged_build_number_expected) + + mock_requests = mocker.patch("requests.request") + mock_requests.return_value.status_code = 200 + mock_requests.return_value.json.return_value = post_merged_build_number_request_response + + actual = delete_previous_merged_build_number('oegb', 'token') + mock_requests.assert_called_once_with('DELETE', + f"https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar/oegb_CURRENT_MERGED_BUILD_NUMBER_{get_merged_build_number_expected}", + headers={ + 'content-type': 'application/json', + 'authorization': "Basic 'token'" + }, + + ) + assert actual == post_merged_build_number_request_response + +def test_post_merged_build_number(mocker, post_merged_build_number_request_response): + mock_delete_previous_merged_build_number = mocker.patch("testing.manifests.delete_previous_merged_build_number", + return_value=delete_previous_merged_build_number_response) + + mock_requests = mocker.patch("requests.post") + mock_requests.return_value.status_code = 201 + mock_requests.return_value.json.return_value = post_merged_build_number_request_response + + actual = post_merged_build_number('oegb', 'token', 45451) + mock_requests.assert_called_once_with( + "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar", + headers={ + 'content-type': 'application/json', + 'authorization': "Basic 'token'" + }, + json={ + 'name': 'oegb_CURRENT_MERGED_BUILD_NUMBER_45451', + 'value': 'a_random_value_of_no_importance' + } + ) + assert actual == post_merged_build_number_request_response + + +def test_get_merged_build_number(mocker, get_merged_build_number_get_request_response, + get_merged_build_number_expected): + mock_requests = mocker.patch("requests.get") + mock_requests.return_value.status_code = 200 + mock_requests.return_value.json.return_value = get_merged_build_number_get_request_response + + actual = get_merged_build_number('oegb', 'token') + mock_requests.assert_called_once_with( + "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar", + headers={ + 'content-type': 'application/json', + 'authorization': "Basic 'token'" + } + ) + assert actual == get_merged_build_number_expected + + +def test_get_production_manifest_url(mocker, get_production_manifest_url_get_request_response, + get_production_manifest_url_expected, + get_merged_build_number_expected): + mock_get_merged_build_number = mocker.patch("testing.manifests.get_merged_build_number", + return_value=get_merged_build_number_expected) + + mock_requests = mocker.patch("requests.get") + mock_requests.return_value.status_code = 200 + mock_requests.return_value.json.return_value = get_production_manifest_url_get_request_response + + actual = get_production_manifest_url('oegb', 'token') + mock_requests.assert_called_once_with( + "https://circleci.com/api/v2/project/github/octoenergy/datalake-models/45451/artifacts", + headers={ + 'content-type': 'application/json', + 'authorization': "Basic 'token'" + } + ) + assert actual == get_production_manifest_url_expected + + +def test_get_production_manifest(mocker, get_production_manifest_get_request_response, + get_production_manifest_url_expected): + mock_get_production_manifest_url = mocker.patch( + "testing.manifests.get_production_manifest_url", + return_value=get_production_manifest_url_expected + ) + + mock_requests = mocker.patch("requests.get") + mock_requests.return_value.status_code = 200 + mock_requests.return_value.json.return_value = get_production_manifest_get_request_response + + actual = get_production_manifest('oegb', b'dG9rZW4=') + mock_requests.assert_called_once_with( + get_production_manifest_url_expected, + headers={ + 'content-type': 'application/json', + "Circle-Token": "token" + } + ) + assert actual == get_production_manifest_get_request_response + +# def test_save_production_manifest_to_state_dir(): diff --git a/testing/test_structure.py b/testing/test_structure.py index bb377e899..81f96a6fd 100644 --- a/testing/test_structure.py +++ b/testing/test_structure.py @@ -1 +1,57 @@ -import pytest \ No newline at end of file +import pytest +import glob2 +import fnmatch + +from .structure import get_directory_structure + + +@pytest.fixture +def parent_directory_structure_expected(): + return sorted( + [ + 'jaffle_shop/models/overview.md', + 'jaffle_shop/models/staging/src_seed/schema.yml', + 'jaffle_shop/models/staging/src_seed/stg_customers.sql', + 'jaffle_shop/models/staging/src_seed/stg_payments.sql', + 'jaffle_shop/models/staging/src_seed/stg_orders.sql', + 'jaffle_shop/models/staging/src_seed/sensitive/schema.yml', + 'jaffle_shop/models/staging/src_seed/sensitive/stg_customers_pii.sql', + 'jaffle_shop/models/final/sales/schema.yml', + 'jaffle_shop/models/final/sales/fnl_sales_newcustomers.sql', + 'jaffle_shop/models/final/finance/schema.yml', + 'jaffle_shop/models/final/finance/fnl_finance_customerreturns.sql', + 'jaffle_shop/models/warehouse/schema.yml', + 'jaffle_shop/models/warehouse/docs.md', + 'jaffle_shop/models/warehouse/wh_orders.sql', + 'jaffle_shop/models/warehouse/wh_customers.sql' + ] + ) + +def filter_string_list_by_substring(substring, string_list): + return [str for str in string_list if substring in str] + + +def test_parent_directory_structure(parent_directory_structure_expected): + parent_directory_structure_current = sorted(glob2.glob('jaffle_shop/models/**/*.*')) + assert parent_directory_structure_expected == parent_directory_structure_current, \ + "Found an issue with the overall directory structure. If the issue is not shown in a more specific test when check which files are failing for more information." + +def get_path_filters(): + path_filters = { + "staging": "Found an issue with the staging directory structure. Ensure all staging models are located in a subdirectory named after their source database e.g. models/staging/src_example_db/model_x.sql", + "warehouse": "Found an issue with the warehouse directory structure. Ensure you have a model for both customer and order data as well as a docs.md for documenting the complexity around order statuses.", + "final": "Found an issue with the final directory structure. Ensure each model is located in a sub directory matching the department of the business it relates too e.g. models/final/sales - Each of these directories should have its own schema.yml", + "sensitive" : "Found an issue with sensitive data structure...raw_customers.csv contains PII. Please ensure all sensitive columns have been hashed correctly in the staging layer." + } + for filter, error_message in path_filters.items(): + yield filter, error_message + + +@pytest.mark.parametrize( + "path_filter_pair", get_path_filters(), ids=[i[0] for i in get_path_filters()] +) +def test_sub_directory_structure(parent_directory_structure_expected, path_filter_pair): + path_filter, error_message = path_filter_pair + expected_structure = filter_string_list_by_substring(path_filter, parent_directory_structure_expected) + current_structure = sorted(glob2.glob(f'jaffle_shop/models/**/{path_filter}/**/*.*')) + assert current_structure == expected_structure, error_message \ No newline at end of file From 59ae74b9640ed710285ead1897a6547792f09fd6 Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Tue, 6 Sep 2022 10:03:15 +0100 Subject: [PATCH 03/13] Clarify Makefile --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a7587bcce..341d45c56 100644 --- a/Makefile +++ b/Makefile @@ -34,4 +34,7 @@ format: build-env pipenv run sqlfluff fix run-python-tests: - pipenv run pytest -vvvvv \ No newline at end of file + pipenv run pytest --quiet --show-capture=no --tb=no + +run-python-tests-detailed: + pipenv run pytest \ No newline at end of file From 72398c62afe34ad42c3048e4077d7f7ee19bb86b Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Tue, 6 Sep 2022 10:07:43 +0100 Subject: [PATCH 04/13] Update README --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 70b0a64ac..62a7e3034 100644 --- a/README.md +++ b/README.md @@ -13,20 +13,21 @@ What this repo _is not_: This repo contains [seeds](https://docs.getdbt.com/docs/building-a-dbt-project/seeds) that includes some (fake) raw data from a fictional app. The raw data consists of customers, orders, and payments, with the following entity-relationship diagram: -0 + ![Jaffle Shop ERD](/etc/jaffle_shop_erd.png) ### How to use this repo and become a gatekeeper? In its base state the repo is not fit for purpose. While it works, it doesn't comply with many of the conventions we enforce at octopus so your goal is to remedy that. - -When you make a PR from your branch CircleCI will run tests to ensure that your changes comply with Octopus conventions. +You can use `make run-python-tests` command to see if your changes have worked or alternatively when you make a PR from your branch CircleCI will run tests to ensure that your changes comply with Octopus conventions. If all your tests pass... Congrats, You're a gatekeeper! Let one of the @dbt_gatekeepers know and send them a link to your PR. Remember not to merge it, the repo is broken on purpose! ### So what needs doing to the repo? -The point of being a gatekeeper is being able to look at a PR and know where to look for possible convention breaches. Check the [data platform docs](http://docs.eks.octopus.engineering/reference/dbt_gatekeeper_checklist/) site for tips on how to gatekeep. +The point of being a gatekeeper is being able to look at a PR and know where to look for possible convention breaches. +Check the [data platform docs](http://docs.eks.octopus.engineering/reference/dbt_gatekeeper_checklist/) site for tips on how to gatekeep. +The tests will give some basic pointers for where your fixes are failing. ### What is a jaffle? A jaffle is a toasted sandwich with crimped, sealed edges. Invented in Bondi in 1949, the humble jaffle is an Australian classic. The sealed edges allow jaffle-eaters to enjoy liquid fillings inside the sandwich, which reach temperatures close to the core of the earth during cooking. Often consumed at home after a night out, the most classic filling is tinned spaghetti, while my personal favourite is leftover beef stew with melted cheese. From 87e023db8a786acce539f61a09ebbfac9bbd978d Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Thu, 10 Nov 2022 09:51:48 +0000 Subject: [PATCH 05/13] Move initial models to jaffle_shop dir --- {models => jaffle_shop/models}/customers.sql | 0 {models => jaffle_shop/models}/docs.md | 0 {models => jaffle_shop/models}/orders.sql | 0 {models => jaffle_shop/models}/overview.md | 0 {models => jaffle_shop/models}/schema.yml | 0 {models => jaffle_shop/models}/staging/schema.yml | 0 {models => jaffle_shop/models}/staging/stg_customers.sql | 0 {models => jaffle_shop/models}/staging/stg_orders.sql | 0 {models => jaffle_shop/models}/staging/stg_payments.sql | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename {models => jaffle_shop/models}/customers.sql (100%) rename {models => jaffle_shop/models}/docs.md (100%) rename {models => jaffle_shop/models}/orders.sql (100%) rename {models => jaffle_shop/models}/overview.md (100%) rename {models => jaffle_shop/models}/schema.yml (100%) rename {models => jaffle_shop/models}/staging/schema.yml (100%) rename {models => jaffle_shop/models}/staging/stg_customers.sql (100%) rename {models => jaffle_shop/models}/staging/stg_orders.sql (100%) rename {models => jaffle_shop/models}/staging/stg_payments.sql (100%) diff --git a/models/customers.sql b/jaffle_shop/models/customers.sql similarity index 100% rename from models/customers.sql rename to jaffle_shop/models/customers.sql diff --git a/models/docs.md b/jaffle_shop/models/docs.md similarity index 100% rename from models/docs.md rename to jaffle_shop/models/docs.md diff --git a/models/orders.sql b/jaffle_shop/models/orders.sql similarity index 100% rename from models/orders.sql rename to jaffle_shop/models/orders.sql diff --git a/models/overview.md b/jaffle_shop/models/overview.md similarity index 100% rename from models/overview.md rename to jaffle_shop/models/overview.md diff --git a/models/schema.yml b/jaffle_shop/models/schema.yml similarity index 100% rename from models/schema.yml rename to jaffle_shop/models/schema.yml diff --git a/models/staging/schema.yml b/jaffle_shop/models/staging/schema.yml similarity index 100% rename from models/staging/schema.yml rename to jaffle_shop/models/staging/schema.yml diff --git a/models/staging/stg_customers.sql b/jaffle_shop/models/staging/stg_customers.sql similarity index 100% rename from models/staging/stg_customers.sql rename to jaffle_shop/models/staging/stg_customers.sql diff --git a/models/staging/stg_orders.sql b/jaffle_shop/models/staging/stg_orders.sql similarity index 100% rename from models/staging/stg_orders.sql rename to jaffle_shop/models/staging/stg_orders.sql diff --git a/models/staging/stg_payments.sql b/jaffle_shop/models/staging/stg_payments.sql similarity index 100% rename from models/staging/stg_payments.sql rename to jaffle_shop/models/staging/stg_payments.sql From 8648d4119bdd5d3e2b36e085972b741cd3718f2c Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Thu, 10 Nov 2022 10:50:51 +0000 Subject: [PATCH 06/13] Update readme with guidance on what needs doing to the repo --- README.md | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 62a7e3034..4696baf68 100644 --- a/README.md +++ b/README.md @@ -18,16 +18,95 @@ The raw data consists of customers, orders, and payments, with the following ent ### How to use this repo and become a gatekeeper? -In its base state the repo is not fit for purpose. While it works, it doesn't comply with many of the conventions we enforce at octopus so your goal is to remedy that. -You can use `make run-python-tests` command to see if your changes have worked or alternatively when you make a PR from your branch CircleCI will run tests to ensure that your changes comply with Octopus conventions. -If all your tests pass... Congrats, You're a gatekeeper! Let one of the @dbt_gatekeepers know and send them a link to your PR. -Remember not to merge it, the repo is broken on purpose! +In its base state the repo is not fit for purpose. While it works, it doesn't comply with many of the conventions we enforce at octopus so your goal is to remedy that. + +Use `make init` to get started with running the rest of the make commands. ### So what needs doing to the repo? -The point of being a gatekeeper is being able to look at a PR and know where to look for possible convention breaches. +The point of being a gatekeeper is being able to look at a PR and know where to look for possible convention breaches. Check the [data platform docs](http://docs.eks.octopus.engineering/reference/dbt_gatekeeper_checklist/) site for tips on how to gatekeep. -The tests will give some basic pointers for where your fixes are failing. + +#### Fixes + +Here are the fixes that need implementing: + +1) All `.yml` files should be renamed to specify what they apply to. For example each model directory should contain a `_models.yml` file (the `_` is to ensure the file is top of the directory for easy access) and may or may not contain a `_docs.yml` file for documentation. +2) Staging models should be split by which source they are coming from. As the sources in this repo all come from seeds, the staging models on top of them should be in the `src_seed` directory along with their respective `_models.yml` and `_sources.yml` files. +3) stg_customers contains PII data in the `first_name` and `last_name` columns so these need to be hashed. Move this model into a `src_seed/sensitive` directory and mark each of the sensitive columns as sensitive in the `src_seed/sensitive/_models.yml` using the syntax: + ``` + columns: + - name: customer_id + tests: + - unique + - not_null + - name: first_name + meta: + sensitive: true + - name: last_name + meta: + sensitive: true + ``` +4) The `customers.sql` and `orders.sql` models are traditional warehouse models and should be in a `warehouse` directory with their respective `_docs.md` and `_models.yml` files. +5) We use a package to test the structure of the dbt project called [dbt_project_evaluator](https://github.com/dbt-labs/dbt-project-evaluator) - this tests for lineage issues. One of its major checks is to see if staging models refer to other staging models which is normally not allowed. + + However, we need to do this when hashing sensitive models so we need to make an exception. To do this, create a new seed called `dbt_project_evaluator_exceptions.csv` with the following content: + ``` + fct_name,column_name,id_to_exclude,comment + fct_staging_dependent_on_staging,parent,stg_customers_pii,Scrubbing pii permitted in staging layer. + ``` + This will disable the `fct_staging_dependent_on_staging` test for the `stg_customers_pii` where it is the parent of another staging model and give a reason for why its been omitted: `Scrubbing pii permitted in staging layer.` + + This is a bit niche but dbt_project_evaluator will become a big part of our testing process in future so its important to have an understanding of how it works. +#### New Models + +You've also had a request from the SMT asking for two dashboards, one for finance and one for sales. They need the following shown: +- Finance - Total value of orders returned by customer +- Sales - The customer count by month for customers making their first order + +There are two possible approaches to this: +1) - How we do things at the time of writing - Create a final model per dashboard showing the relevant information and assign an exposure to each with a dummy URL : + ``` + url: https://inksacio.eks.octopus.engineering/my_certification_dashboard/ + ``` + - Put each model into a directory specific to their business unit like `models/final/sales/fnl_sales_newcustomers.sql` + - Make sure to write a `_models.yml` in each directory. +2) How we will do things in future - Make the required data available via [metrics](https://docs.getdbt.com/docs/build/metrics) configured directly on the warehouse model configs or in a `_metrics.yml` file. + + For example: + ``` + metrics: + - name: new_customers + label: New Customers + model: ref('wh_customers') + description: "" + + calculation_method: count_distinct + expression: customer_id + + timestamp: first_order + time_grains: [day, week, month, quarter, year] + + # general properties + config: + enabled: true + + meta: {team: Sales} + ``` + + + + + + + + +You can use `make run-python-tests` command to see if your changes have worked or alternatively when you make a PR from your branch CircleCI will run tests to ensure that your changes comply with Octopus conventions. This will run the first set of tests. + +If all your tests pass... You've passed this section of the certification! Let one of the @dbt_gatekeepers know and send them a link to your PR. +Remember not to merge it, the repo is broken on purpose! + + ### What is a jaffle? A jaffle is a toasted sandwich with crimped, sealed edges. Invented in Bondi in 1949, the humble jaffle is an Australian classic. The sealed edges allow jaffle-eaters to enjoy liquid fillings inside the sandwich, which reach temperatures close to the core of the earth during cooking. Often consumed at home after a night out, the most classic filling is tinned spaghetti, while my personal favourite is leftover beef stew with melted cheese. From 532ebdbb317e60bbbe1fcfc86500a5d52a98cb9d Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Thu, 10 Nov 2022 11:11:36 +0000 Subject: [PATCH 07/13] Update testing to omit fnl Upda --- testing/test_structure.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/testing/test_structure.py b/testing/test_structure.py index 81f96a6fd..43f1af12b 100644 --- a/testing/test_structure.py +++ b/testing/test_structure.py @@ -10,18 +10,14 @@ def parent_directory_structure_expected(): return sorted( [ 'jaffle_shop/models/overview.md', - 'jaffle_shop/models/staging/src_seed/schema.yml', + 'jaffle_shop/models/staging/src_seed/_models.yml', 'jaffle_shop/models/staging/src_seed/stg_customers.sql', 'jaffle_shop/models/staging/src_seed/stg_payments.sql', 'jaffle_shop/models/staging/src_seed/stg_orders.sql', - 'jaffle_shop/models/staging/src_seed/sensitive/schema.yml', + 'jaffle_shop/models/staging/src_seed/sensitive/_models.yml', 'jaffle_shop/models/staging/src_seed/sensitive/stg_customers_pii.sql', - 'jaffle_shop/models/final/sales/schema.yml', - 'jaffle_shop/models/final/sales/fnl_sales_newcustomers.sql', - 'jaffle_shop/models/final/finance/schema.yml', - 'jaffle_shop/models/final/finance/fnl_finance_customerreturns.sql', - 'jaffle_shop/models/warehouse/schema.yml', - 'jaffle_shop/models/warehouse/docs.md', + 'jaffle_shop/models/warehouse/_models.yml', + 'jaffle_shop/models/warehouse/_docs.md', 'jaffle_shop/models/warehouse/wh_orders.sql', 'jaffle_shop/models/warehouse/wh_customers.sql' ] @@ -33,14 +29,15 @@ def filter_string_list_by_substring(substring, string_list): def test_parent_directory_structure(parent_directory_structure_expected): parent_directory_structure_current = sorted(glob2.glob('jaffle_shop/models/**/*.*')) - assert parent_directory_structure_expected == parent_directory_structure_current, \ + # As there are two ways to do the final layer we'll omit this from testing + parent_directory_structure_current_no_fnl = list(filter(lambda x: not x.startswith("jaffle_shop/models/final/"), parent_directory_structure_current)) + assert parent_directory_structure_expected == parent_directory_structure_current_no_fnl, \ "Found an issue with the overall directory structure. If the issue is not shown in a more specific test when check which files are failing for more information." def get_path_filters(): path_filters = { "staging": "Found an issue with the staging directory structure. Ensure all staging models are located in a subdirectory named after their source database e.g. models/staging/src_example_db/model_x.sql", - "warehouse": "Found an issue with the warehouse directory structure. Ensure you have a model for both customer and order data as well as a docs.md for documenting the complexity around order statuses.", - "final": "Found an issue with the final directory structure. Ensure each model is located in a sub directory matching the department of the business it relates too e.g. models/final/sales - Each of these directories should have its own schema.yml", + "warehouse": "Found an issue with the warehouse directory structure. Ensure you have a model for both customer and order data as well as a _docs.md for documenting the complexity around order statuses.", "sensitive" : "Found an issue with sensitive data structure...raw_customers.csv contains PII. Please ensure all sensitive columns have been hashed correctly in the staging layer." } for filter, error_message in path_filters.items(): From 75fbfb319e32a24d52a0019bbd977cfdf420c335 Mon Sep 17 00:00:00 2001 From: jelstongreen Date: Mon, 14 Nov 2022 10:58:06 +0000 Subject: [PATCH 08/13] Remove SQLFluff Not needed for this repo and causing dependency conficts --- .sqlfluff | 113 ------- .sqlfluffignore | 2 - Pipfile | 4 +- Pipfile.lock | 641 +++++++++++++----------------------- testing/lint_models.py | 94 ------ testing/manifests.py | 153 --------- testing/test_lint_models.py | 65 ---- testing/test_manifests.py | 169 ---------- 8 files changed, 232 insertions(+), 1009 deletions(-) delete mode 100644 .sqlfluff delete mode 100644 .sqlfluffignore delete mode 100644 testing/lint_models.py delete mode 100644 testing/manifests.py delete mode 100644 testing/test_lint_models.py delete mode 100644 testing/test_manifests.py diff --git a/.sqlfluff b/.sqlfluff deleted file mode 100644 index bf3f02fe8..000000000 --- a/.sqlfluff +++ /dev/null @@ -1,113 +0,0 @@ -[sqlfluff] -verbose = 0 -nocolor = False -dialect = databricks -templater = dbt -rules = None -exclude_rules = L031 -recurse = 0 -output_line_length = 80 -runaway_limit = 10 -ignore_templated_areas = True -encoding = autodetect -disable_noqa = False -# Comma separated list of file extensions to lint. -# NB: This config will only apply in the root folder. -sql_file_exts = .sql,.sql.j2,.dml,.ddl - -[sqlfluff:indentation] -indented_joins = False -indented_using_on = True -template_blocks_indent = True - -[sqlfluff:templater] -unwrap_wrapped_queries = True - -[sqlfluff:templater:dbt] -apply_dbt_builtins = True -load_macros_from_path = core/macros,oegb/macros/,oejp/macros - -[sqlfluff:templater:dbt:context] -# DATABRICKS_TARGET=$(eval "echo ${CIRCLE_BRANCH}_ci | tr /- _")_${CIRCLE_SHA1}_$PROJECT -# tbl_name=my_table - -[sqlfluff:templater:dbt:macros] -# Macros provided as builtins for dbt projects -dbt_ref = {% macro ref(model_ref) %}{{model_ref}}{% endmacro %} -dbt_source = {% macro source(source_name, table) %}{{source_name}}_{{table}}{% endmacro %} -dbt_config = {% macro config() %}{% for k in kwargs %}{% endfor %}{% endmacro %} -dbt_var = {% macro var(variable, default='') %}item{% endmacro %} -dbt_is_incremental = {% macro is_incremental() %}True{% endmacro %} - -# Some rules can be configured directly from the config common to other rules. -[sqlfluff:rules] -tab_space_size = 2 -max_line_length = 99 -indent_unit = space -allow_scalar = True -single_table_references = consistent -unquoted_identifiers_policy = all -indented_on_contents = False - -# Some rules have their own specific config. -[sqlfluff:rules:L007] # Keywords -operator_new_lines = after - -[sqlfluff:rules:L010] # Keywords -capitalisation_policy = upper -extended_capitalisation_policy = upper - -[sqlfluff:rules:L011] # Aliasing -aliasing = explicit - -[sqlfluff:rules:L012] # Aliasing -aliasing = explicit - -[sqlfluff:rules:L014] # Unquoted identifiers -extended_capitalisation_policy = consistent - -[sqlfluff:rules:L016] -ignore_comment_lines = False - -[sqlfluff:rules:L019] -comma_style = leading - -[sqlfluff:rules:L026] -force_enable = False - -[sqlfluff:rules:L028] -force_enable = False - -[sqlfluff:rules:L029] # Keyword identifiers -unquoted_identifiers_policy = aliases -quoted_identifiers_policy = none - -[sqlfluff:rules:L030] # Function names -capitalisation_policy = upper -extended_capitalisation_policy = upper - -[sqlfluff:rules:L038] -select_clause_trailing_comma = forbid - -[sqlfluff:rules:L040] # Null & Boolean Literals -capitalisation_policy = upper - -[sqlfluff:rules:L042] -# By default, allow subqueries in from clauses, but not join clauses. -forbid_subquery_in = both - -[sqlfluff:rules:L047] # Consistent syntax to count all rows -prefer_count_1 = False -prefer_count_0 = False - -[sqlfluff:rules:L052] # Semi-colon formatting approach. -multiline_newline = False -require_final_semicolon = False - -[sqlfluff:rules:L054] # GROUP BY/ORDER BY column references. -group_by_and_order_by_style = explicit - -[sqlfluff:rules:L057] # Special characters in identifiers -unquoted_identifiers_policy = all -quoted_identifiers_policy = all -allow_space_in_identifier = False \ No newline at end of file diff --git a/.sqlfluffignore b/.sqlfluffignore deleted file mode 100644 index a620ffcdc..000000000 --- a/.sqlfluffignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -dbt_packages/ diff --git a/Pipfile b/Pipfile index 2499387dd..836ef1397 100644 --- a/Pipfile +++ b/Pipfile @@ -4,10 +4,8 @@ verify_ssl = true name = "pypi" [packages] -dbt-core = "==1.1.0" +dbt-core = "==1.3.0" dbt-databricks = {extras = ["odbc"]} -sqlfluff = "1.0.0" -sqlfluff-templater-dbt = "*" pytest-mock = "*" glob2 = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 92e86275b..f8d9c41d4 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "15b089ccba32ecfb980c6e7bc58853976090e07cd776f55151d2a34fd1b212c8" + "sha256": "fdc73e9c032079052e940c732affb9526bddab92ec30d99cc8faaf98c9b67d72" }, "pipfile-spec": 6, "requires": { @@ -23,13 +23,6 @@ ], "version": "==1.6.3" }, - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, "attrs": { "hashes": [ "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", @@ -40,19 +33,19 @@ }, "babel": { "hashes": [ - "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51", - "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb" + "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe", + "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6" ], "markers": "python_version >= '3.6'", - "version": "==2.10.3" + "version": "==2.11.0" }, "certifi": { "hashes": [ - "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d", - "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412" + "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", + "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382" ], "markers": "python_version >= '3.6'", - "version": "==2022.6.15" + "version": "==2022.9.24" }, "cffi": { "hashes": [ @@ -123,14 +116,6 @@ ], "version": "==1.15.1" }, - "chardet": { - "hashes": [ - "sha256:0368df2bfd78b5fc20572bb4e9bb7fb53e2c094f60ae9993339e8671d0afb8aa", - "sha256:d3e64f022d254183001eccc5db4040520c0f23b1a3f33d6413e099eb7f126557" - ], - "markers": "python_version >= '3.6'", - "version": "==5.0.0" - }, "charset-normalizer": { "hashes": [ "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", @@ -149,38 +134,38 @@ }, "colorama": { "hashes": [ - "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", - "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" + "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da", + "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.4.4" + "version": "==0.4.5" }, "databricks-sql-connector": { "hashes": [ - "sha256:a0db589ac35446989e129aef51b22f615dc1f65b143e90717aa85320d7f82284", - "sha256:f744fe26010d7798e4bb7a9c6106a2bf2cb6da63381b8e2e7b0a4beae374c0cd" + "sha256:181007919044c8c21b63232fa8b3d3054a65343f4f37eb40fef93b7fee3ddc19", + "sha256:b936adc8755902347faafab40dea7b3e63b6f2da87a55cfda770e0fb792613f4" ], - "markers": "python_version < '4' and python_full_version >= '3.7.1'", - "version": "==2.0.5" + "markers": "python_full_version >= '3.7.1' and python_full_version < '4.0.0'", + "version": "==2.1.0" }, "dbt-core": { "hashes": [ - "sha256:3e33ce5be74e0d4f9f28ad76b4b1de55cb343d4c53c3a8f98c24551881aedf3e", - "sha256:4af9124e6ec188db2ce9a32d6b26757fd42c2e14238770ca0661d8963f1ba7ea" + "sha256:20d23cf7c20ed16f6d82804d6cf67dafca8ac3c9f2557e5aeaa8c6af9d39c384", + "sha256:63f2f691af87790a4315e15267b863ecdd67828da5c76367c2c2f1cad08c6822" ], "index": "pypi", - "version": "==1.1.0" + "version": "==1.3.0" }, "dbt-databricks": { "extras": [ "odbc" ], "hashes": [ - "sha256:81e091146eaa988aa7ff423ced7572414d97a8dd4288ae72bf0b4b679fc045d9", - "sha256:95e7f9d2ccb80da6d6139c5ab76e2e6577318f5593779f91017be40fb5d654a9" + "sha256:0b0956a597befb574971e45341ca6c37de42cbfa2db61a7aab55bd5236a57206", + "sha256:9debf9280e3a791bc104bd089aa82ff1adfb7f2cddfe1ccd41b99bdf12619258" ], "index": "pypi", - "version": "==1.1.3" + "version": "==1.3.2" }, "dbt-extractor": { "hashes": [ @@ -206,19 +191,19 @@ }, "dbt-spark": { "hashes": [ - "sha256:1c8808347c41f760280d6aed54a564e8e8055d6c3377283b6d862100cb0153c8", - "sha256:cbf5b788e185c0d4b22b69ef9b8a09a49b78c327feda84b2d2fe2ccd098377e5" + "sha256:52362eacf814e0bd5964ec0f67eb818fd596df0328be07a2ce0b9b9d40d072da", + "sha256:99f6dbeec2d135f7a1c91b75abb2ff13aee9fa5285e53a19200ed0ec03f13a9d" ], "markers": "python_version >= '3.7'", - "version": "==1.1.0" + "version": "==1.3.0" }, - "diff-cover": { + "exceptiongroup": { "hashes": [ - "sha256:8c3bb13812e9667bc83f8c7606402511e9c2fe79d6786f129522e79693ee096b", - "sha256:ad602868ff14969563216866fc249f068df54892bd6c989201110bbb837dab06" + "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695", + "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27" ], - "markers": "python_version < '4' and python_full_version >= '3.6.2'", - "version": "==6.5.1" + "markers": "python_version < '3.11'", + "version": "==1.0.2" }, "future": { "hashes": [ @@ -236,26 +221,18 @@ }, "hologram": { "hashes": [ - "sha256:2911b59115bebd0504eb089532e494fa22ac704989afe41371c5361780433bfe", - "sha256:fd67bd069e4681e1d2a447df976c65060d7a90fee7f6b84d133fd9958db074ec" + "sha256:48ca81ed47da1c604b2d3b951424b600eb8a5785b00513e3b8e3ae8101f90145", + "sha256:79b3d04df84d5a9d09c2e669ec5bcc50b1713ec79f4683cfdea85583b41e46f0" ], - "version": "==0.0.14" + "version": "==0.0.15" }, "idna": { "hashes": [ - "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", - "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" ], "markers": "python_version >= '3.5'", - "version": "==3.3" - }, - "importlib-metadata": { - "hashes": [ - "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670", - "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23" - ], - "markers": "python_version >= '3.7'", - "version": "==4.12.0" + "version": "==3.4" }, "iniconfig": { "hashes": [ @@ -273,26 +250,18 @@ }, "jinja2": { "hashes": [ - "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419", - "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6" + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==2.11.3" - }, - "jinja2-simple-tags": { - "hashes": [ - "sha256:53b1a0a4095958f6874cfe0a4df74e15587d85a0248be588009e23aa0fdba3bd", - "sha256:cdebf4ed86dc2f8cfe832734817c5a7c6eb75761a9325e12184a93f8da5040aa" - ], - "markers": "python_version >= '3.6'", - "version": "==0.4.0" + "markers": "python_version >= '3.7'", + "version": "==3.1.2" }, "jsonschema": { "hashes": [ - "sha256:2fa0684276b6333ff3c0b1b27081f4b2305f0a36cf702a23db50edb141893c3f", - "sha256:94c0a13b4a0616458b42529091624e66700a17f847453e52279e35509a5b7631" + "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", + "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" ], - "version": "==3.1.1" + "version": "==3.2.0" }, "leather": { "hashes": [ @@ -317,86 +286,60 @@ }, "markupsafe": { "hashes": [ - "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298", - "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64", - "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b", - "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194", - "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567", - "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff", - "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724", - "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74", - "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646", - "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35", - "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6", - "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a", - "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6", - "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad", - "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26", - "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38", - "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac", - "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7", - "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6", - "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047", - "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75", - "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f", - "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b", - "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135", - "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8", - "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a", - "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", - "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1", - "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9", - "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864", - "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914", - "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee", - "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f", - "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18", - "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8", - "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2", - "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d", - "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b", - "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b", - "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86", - "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6", - "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f", - "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb", - "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833", - "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28", - "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e", - "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415", - "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902", - "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f", - "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d", - "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9", - "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d", - "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145", - "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066", - "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c", - "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1", - "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a", - "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207", - "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f", - "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53", - "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd", - "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134", - "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85", - "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9", - "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5", - "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94", - "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509", - "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51", - "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872" + "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" ], - "markers": "python_version >= '3.6'", - "version": "==2.0.1" + "markers": "python_version >= '3.7'", + "version": "==2.1.1" }, "mashumaro": { + "extras": [ + "msgpack" + ], "hashes": [ - "sha256:343b6e2d3e432e31973688c4c8821dcd6ef41fd33264b992afc4aecbfd155f18", - "sha256:f616df410d82936b8bb2b4d32af570556685d77f49acf4228134b50230a69799" + "sha256:6d221e09df2d884afda19325d5412dc9b1274be9ba1c3e57c12a8977320c7e07", + "sha256:72b97b7660b7a4de1df2466a52543e6439f968cd081ce55aae899bc375b1f53d" ], "markers": "python_version >= '3.6'", - "version": "==2.9" + "version": "==3.0.4" }, "minimal-snowplow-tracker": { "hashes": [ @@ -463,45 +406,53 @@ }, "networkx": { "hashes": [ - "sha256:2a30822761f34d56b9a370d96a4bf4827a535f5591a4078a453425caeba0c5bb", - "sha256:bd2b7730300860cbd2dafe8e5af89ff5c9a65c3975b352799d87a6238b4301a6" + "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e", + "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524" ], "markers": "python_version >= '3.8'", - "version": "==2.8.6" + "version": "==2.8.8" }, "numpy": { "hashes": [ - "sha256:17e5226674f6ea79e14e3b91bfbc153fdf3ac13f5cc54ee7bc8fdbe820a32da0", - "sha256:2bd879d3ca4b6f39b7770829f73278b7c5e248c91d538aab1e506c628353e47f", - "sha256:4f41f5bf20d9a521f8cab3a34557cd77b6f205ab2116651f12959714494268b0", - "sha256:5593f67e66dea4e237f5af998d31a43e447786b2154ba1ad833676c788f37cde", - "sha256:5e28cd64624dc2354a349152599e55308eb6ca95a13ce6a7d5679ebff2962913", - "sha256:633679a472934b1c20a12ed0c9a6c9eb167fbb4cb89031939bfd03dd9dbc62b8", - "sha256:806970e69106556d1dd200e26647e9bee5e2b3f1814f9da104a943e8d548ca38", - "sha256:806cc25d5c43e240db709875e947076b2826f47c2c340a5a2f36da5bb10c58d6", - "sha256:8247f01c4721479e482cc2f9f7d973f3f47810cbc8c65e38fd1bbd3141cc9842", - "sha256:8ebf7e194b89bc66b78475bd3624d92980fca4e5bb86dda08d677d786fefc414", - "sha256:8ecb818231afe5f0f568c81f12ce50f2b828ff2b27487520d85eb44c71313b9e", - "sha256:8f9d84a24889ebb4c641a9b99e54adb8cab50972f0166a3abc14c3b93163f074", - "sha256:909c56c4d4341ec8315291a105169d8aae732cfb4c250fbc375a1efb7a844f8f", - "sha256:9b83d48e464f393d46e8dd8171687394d39bc5abfe2978896b77dc2604e8635d", - "sha256:ac987b35df8c2a2eab495ee206658117e9ce867acf3ccb376a19e83070e69418", - "sha256:b78d00e48261fbbd04aa0d7427cf78d18401ee0abd89c7559bbf422e5b1c7d01", - "sha256:b8b97a8a87cadcd3f94659b4ef6ec056261fa1e1c3317f4193ac231d4df70215", - "sha256:bd5b7ccae24e3d8501ee5563e82febc1771e73bd268eef82a1e8d2b4d556ae66", - "sha256:bdc02c0235b261925102b1bd586579b7158e9d0d07ecb61148a1799214a4afd5", - "sha256:be6b350dfbc7f708d9d853663772a9310783ea58f6035eec649fb9c4371b5389", - "sha256:c403c81bb8ffb1c993d0165a11493fd4bf1353d258f6997b3ee288b0a48fce77", - "sha256:cf8c6aed12a935abf2e290860af8e77b26a042eb7f2582ff83dc7ed5f963340c", - "sha256:d98addfd3c8728ee8b2c49126f3c44c703e2b005d4a95998e2167af176a9e722", - "sha256:dc76bca1ca98f4b122114435f83f1fcf3c0fe48e4e6f660e07996abf2f53903c", - "sha256:dec198619b7dbd6db58603cd256e092bcadef22a796f778bf87f8592b468441d", - "sha256:df28dda02c9328e122661f399f7655cdcbcf22ea42daa3650a26bce08a187450", - "sha256:e603ca1fb47b913942f3e660a15e55a9ebca906857edfea476ae5f0fe9b457d5", - "sha256:ecfdd68d334a6b97472ed032b5b37a30d8217c097acfff15e8452c710e775524" - ], - "markers": "python_version < '3.10' and platform_machine != 'aarch64' and platform_machine != 'arm64'", - "version": "==1.23.2" + "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8", + "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735", + "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd", + "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810", + "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db", + "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962", + "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79", + "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911", + "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d", + "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488", + "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5", + "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0", + "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f", + "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f", + "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2", + "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0", + "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68", + "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3", + "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6", + "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71", + "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894", + "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f", + "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329", + "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba", + "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c", + "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e", + "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef", + "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7" + ], + "markers": "python_version < '3.10'", + "version": "==1.23.4" + }, + "oauthlib": { + "hashes": [ + "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", + "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + ], + "markers": "python_version >= '3.6'", + "version": "==3.2.2" }, "packaging": { "hashes": [ @@ -513,30 +464,36 @@ }, "pandas": { "hashes": [ - "sha256:050aada67a5ec6699a7879e769825b510018a95fb9ac462bb1867483d0974a97", - "sha256:0959c41004e3d2d16f39c828d6da66ebee329836a7ecee49fb777ac9ad8a7501", - "sha256:4591cadd06fbbbd16fafc2de6e840c1aaefeae3d5864b688004777ef1bbdede3", - "sha256:51c424ca134fdaeac9a4acd719d1ab48046afc60943a489028f0413fdbe9ef1c", - "sha256:785e878a6e6d8ddcdb8c181e600855402750052497d7fc6d6b508894f6b8830b", - "sha256:799e6a25932df7e6b1f8dabf63de064e2205dc309abb75956126a0453fd88e97", - "sha256:7cd1d69a387f7d5e1a5a06a87574d9ef2433847c0e78113ab51c84d3a8bcaeaa", - "sha256:87b4194f344dcd14c0f885cecb22005329b38bda10f1aaf7b9596a00ec8a4768", - "sha256:8d4d2fe2863ecddb0ba1979bdda26c8bc2ea138f5a979abe3ba80c0fa4015c91", - "sha256:94f2ed1fd51e545ebf71da1e942fe1822ee01e10d3dd2a7276d01351333b7c6b", - "sha256:9d2a7a3c1fea668d56bd91edbd5f2732e0af8feb9d2bf8d9bfacb2dea5fa9536", - "sha256:9d805bce209714b1c1fa29bfb1e42ad87e4c0a825e4b390c56a3e71593b7e8d8", - "sha256:a08ceb59db499864c58a9bf85ab6219d527d91f14c0240cc25fa2c261032b2a7", - "sha256:a981cfabf51c318a562deb4ae7deec594c07aee7cf18b4594a92c23718ec8275", - "sha256:ab6c0d738617b675183e5f28db32b5148b694ad9bba0a40c3ea26d96b431db67", - "sha256:afbddad78a98ec4d2ce08b384b81730de1ccc975b99eb663e6dac43703f36d98", - "sha256:c4bb8b0ab9f94207d07e401d24baebfc63057246b1a5e0cd9ee50df85a656871", - "sha256:ce35f947202b0b99c660221d82beb91d2e6d553d55a40b30128204e3e2c63848", - "sha256:d0022fe6a313df1c4869b5edc012d734c6519a6fffa3cf70930f32e6a1078e49", - "sha256:e7cc960959be28d064faefc0cb2aef854d46b827c004ebea7e79b5497ed83e7d", - "sha256:ee6f1848148ed3204235967613b0a32be2d77f214e9623f554511047705c1e04" + "sha256:04e51b01d5192499390c0015630975f57836cc95c7411415b499b599b05c0c96", + "sha256:05c527c64ee02a47a24031c880ee0ded05af0623163494173204c5b72ddce658", + "sha256:0a78e05ec09731c5b3bd7a9805927ea631fe6f6cb06f0e7c63191a9a778d52b4", + "sha256:17da7035d9e6f9ea9cdc3a513161f8739b8f8489d31dc932bc5a29a27243f93d", + "sha256:249cec5f2a5b22096440bd85c33106b6102e0672204abd2d5c014106459804ee", + "sha256:2c25e5c16ee5c0feb6cf9d982b869eec94a22ddfda9aa2fbed00842cbb697624", + "sha256:32e3d9f65606b3f6e76555bfd1d0b68d94aff0929d82010b791b6254bf5a4b96", + "sha256:36aa1f8f680d7584e9b572c3203b20d22d697c31b71189322f16811d4ecfecd3", + "sha256:5b0c970e2215572197b42f1cff58a908d734503ea54b326412c70d4692256391", + "sha256:5cee0c74e93ed4f9d39007e439debcaadc519d7ea5c0afc3d590a3a7b2edf060", + "sha256:669c8605dba6c798c1863157aefde959c1796671ffb342b80fcb80a4c0bc4c26", + "sha256:66a1ad667b56e679e06ba73bb88c7309b3f48a4c279bd3afea29f65a766e9036", + "sha256:683779e5728ac9138406c59a11e09cd98c7d2c12f0a5fc2b9c5eecdbb4a00075", + "sha256:6bb391659a747cf4f181a227c3e64b6d197100d53da98dcd766cc158bdd9ec68", + "sha256:81f0674fa50b38b6793cd84fae5d67f58f74c2d974d2cb4e476d26eee33343d0", + "sha256:927e59c694e039c75d7023465d311277a1fc29ed7236b5746e9dddf180393113", + "sha256:932d2d7d3cab44cfa275601c982f30c2d874722ef6396bb539e41e4dc4618ed4", + "sha256:a52419d9ba5906db516109660b114faf791136c94c1a636ed6b29cbfff9187ee", + "sha256:b156a971bc451c68c9e1f97567c94fd44155f073e3bceb1b0d195fd98ed12048", + "sha256:bcf1a82b770b8f8c1e495b19a20d8296f875a796c4fe6e91da5ef107f18c5ecb", + "sha256:cb2a9cf1150302d69bb99861c5cddc9c25aceacb0a4ef5299785d0f5389a3209", + "sha256:d8c709f4700573deb2036d240d140934df7e852520f4a584b2a8d5443b71f54d", + "sha256:db45b94885000981522fb92349e6b76f5aee0924cc5315881239c7859883117d", + "sha256:ddf46b940ef815af4e542697eaf071f0531449407a7607dd731bf23d156e20a7", + "sha256:e675f8fe9aa6c418dc8d3aac0087b5294c1a4527f1eacf9fe5ea671685285454", + "sha256:eb7e8cf2cf11a2580088009b43de84cabbf6f5dae94ceb489f28dba01a17cb77", + "sha256:f340331a3f411910adfb4bbe46c2ed5872d9e473a783d7f14ecf49bc0869c594" ], "markers": "python_version >= '3.8'", - "version": "==1.4.4" + "version": "==1.5.1" }, "parsedatetime": { "hashes": [ @@ -547,11 +504,11 @@ }, "pathspec": { "hashes": [ - "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93", - "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d" + "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", + "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" ], "markers": "python_version >= '3.7'", - "version": "==0.10.1" + "version": "==0.9.0" }, "pluggy": { "hashes": [ @@ -561,14 +518,6 @@ "markers": "python_version >= '3.6'", "version": "==1.0.0" }, - "py": { - "hashes": [ - "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", - "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.11.0" - }, "pyarrow": { "hashes": [ "sha256:0238998dc692efcb4e41ae74738d7c1234723271ccf520bd8312dca07d49ef8d", @@ -608,14 +557,6 @@ ], "version": "==2.21" }, - "pygments": { - "hashes": [ - "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1", - "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42" - ], - "markers": "python_version >= '3.6'", - "version": "==2.13.0" - }, "pyparsing": { "hashes": [ "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", @@ -626,46 +567,47 @@ }, "pyrsistent": { "hashes": [ - "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c", - "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc", - "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e", - "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26", - "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec", - "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286", - "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045", - "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec", - "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8", - "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c", - "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca", - "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22", - "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a", - "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96", - "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc", - "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1", - "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07", - "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6", - "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b", - "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5", - "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6" + "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed", + "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb", + "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a", + "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95", + "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712", + "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73", + "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41", + "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b", + "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78", + "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab", + "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308", + "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425", + "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2", + "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e", + "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6", + "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2", + "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a", + "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291", + "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584", + "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a", + "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0", + "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770" ], "markers": "python_version >= '3.7'", - "version": "==0.18.1" + "version": "==0.19.2" }, "pytest": { "hashes": [ - "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7", - "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39" + "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71", + "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59" ], "markers": "python_version >= '3.7'", - "version": "==7.1.3" + "version": "==7.2.0" }, "pytest-mock": { "hashes": [ - "sha256:77f03f4554392558700295e05aed0b1096a20d4a60a4f3ddcde58b0c31c8fca2", - "sha256:8a9e226d6c0ef09fcf20c94eb3405c388af438a90f3e39687f84166da82d5948" + "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b", + "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f" ], "index": "pypi", - "version": "==3.8.2" + "version": "==3.10.0" }, "python-dateutil": { "hashes": [ @@ -692,13 +634,14 @@ }, "pytz": { "hashes": [ - "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197", - "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5" + "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427", + "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2" ], - "version": "==2022.2.1" + "version": "==2022.6" }, "pyyaml": { "hashes": [ + "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", @@ -710,127 +653,53 @@ "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", + "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", + "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", + "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", + "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", + "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", + "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" ], "markers": "python_version >= '3.6'", "version": "==6.0" }, - "regex": { - "hashes": [ - "sha256:02b6dc102123f5178796dcdb5a90f6e88895607fd1a1d115d8de1af8161ca2b4", - "sha256:0843cc977b9cc00eb2299b624db6481d25e7f5b093f7a7c2bb727028d4a26eda", - "sha256:085ca3dc9360c0210e0a70e5d34d66454a06077644e7679fef6358b1f053e62e", - "sha256:0a9d5a64e974bc5f160f30f76aaf993d49eeddb405676be6bf76a5a2c131e185", - "sha256:0de0ce11c0835e1117eacbfe8fa6fa98dc0e8e746b486735cb0fdebe46a02222", - "sha256:1418d3506a9582b23a27373f125ea2b0da523c581e7cf678a6f036254d134faa", - "sha256:14750172c0a616140a8f496dfef28ed24080e87d06d5838e008f959ad307a8c5", - "sha256:1b6d2c579ffdcbb3d93f63b6a7f697364594e1c1b6856958b3e61e3ca22c140a", - "sha256:1df31eaf147ecff3665ba861acb8f78221cd5501df072c9151dfa341dd24599f", - "sha256:21b6f939916aa61beea56393ebc8a9999060632ac22b8193c2cb67d6fd7cb2c3", - "sha256:2240fce3af236e4586a045c1be8bbf16c4f8831e68b7df918b72fc31a80143be", - "sha256:242f546fc5e49bb7395624ac3b4fc168bf454e11ace9804c58c4c3a90d84e38f", - "sha256:25bffa248b99b53a61b1f20fc7d19f711e38e9f0bc90d44c26670f8dc282ad7d", - "sha256:2ada67e02fa3fcca9e3b90cf24c2c6bc77f0abc126209937956aea10eeba40c7", - "sha256:2c198921afc811bc0f105c6e5150fbdebf9520c9b7d43cfc0ab156ca97f506d7", - "sha256:370b1d7aed26e29915c3fb3e72e327f194824a76cedb60c0b9f6c6af53e89d72", - "sha256:3aafbbf5076f2a48bcf31ceb42b410323daaa0ddb42544640592957bc906ace6", - "sha256:3d3d769b3d485b28d6a591b46723dbacc696e6503f48a3ef52e6fc2c90edb482", - "sha256:3d83fd6dd4263595d0e4f595d4abd54397cbed52c0147f7dd148a7b72910301e", - "sha256:45cb798095b886e4df6ff4a1f7661eb70620ccdef127e3c3e00a1aaa22d30e53", - "sha256:4bd9443f7ff6e6288dd4496215c5d903f851e55cbc09d5963587af0c6d565a0a", - "sha256:4bdfd016ab12c4075ef93f025b3cf4c8962b9b7a5e52bb7039ab64cb7755930c", - "sha256:4c6554073e3e554fbb3dff88376ada3da32ca789ea1b9e381f684d49ddb61199", - "sha256:4dad9d68574e93e1e23be53b4ecfb0f083bd5cc08cc7f1984a4ee3ebf12aa446", - "sha256:4e12a3c2d4781ee5d03f229c940934fa1e4ea4f4995e68ab97a2815b139e0804", - "sha256:53c9eca0d6070a8a3de42182ad26daf90ba12132eb74a2f45702332762aff84e", - "sha256:5910bb355f9517309f77101238dbacb7151ede3434a2f1fad26ecc62f13d8324", - "sha256:5c77eab46f3a2b2cd8bbe06467df783543bf7396df431eb4a144cc4b89e9fb3c", - "sha256:5d541bc430a74c787684d1ebcd205a5212a88c3de73848143e77489b2c25b911", - "sha256:5e7c8f9f8824143c219dd93cdc733c20d2c12f154034c89bcb4911db8e45bd92", - "sha256:5f14430535645712f546f1e07013507d1cc0c8abd851811dacce8c7fb584bf52", - "sha256:6059ae91667932d256d9dc03abd3512ebcade322b3a42d1b8354bd1db7f66dcc", - "sha256:61f6966371fa1cbf26c6209771a02bef80336cdaca0c0af4dfa33d51019c0b93", - "sha256:62d56a9d3c1e5a83076db4da060dad7ea35ac2f3cbd3c53ba5a51fe0caedb500", - "sha256:634f090a388351eadf1dcc1d168a190718fb68efb4b8fdc1b119cf837ca01905", - "sha256:64ecfcc386420192fbe98fdde777d993f7f2dfec9552e4f4024d3447d3a3e637", - "sha256:6af38997f178889d417851bae8fb5c00448f7405cfcab38734d771f1dd5d5973", - "sha256:6b30c8d299ba48ee919064628fd8bc296bdc6e4827d315491bea39437130d3e1", - "sha256:6f0c8807bac16984901c0573725bad786f2f004f9bd5df8476c6431097b6c5b3", - "sha256:6f62c8a59f6b8e608880c61b138ae22668184bc266b025d33200dcf2cebe0872", - "sha256:74d4aabd612d32282f3cb3ebb4436046fb840d25c754157a755bc9f66e7cd307", - "sha256:7658d2dfc1dabfb008ffe12ae47b98559e2aedd8237bee12f5aafb74d90479e3", - "sha256:777ceea2860a48e9e362a4e2a9a691782ea97bd05c24627c92e876fdd2c22e61", - "sha256:79f34d5833cd0d53ecf48bc030e4da3216bd4846224d17eeb64509be5cb098fd", - "sha256:7a52d547259495a53e61e37ffc6d5cecf8d298aeb1bc0d9b25289d65ddb31183", - "sha256:840063aa8eeb1dda07d7d7dee15648838bffef1d415f5f79061854a182a429aa", - "sha256:8e8ec94d1b1a0a297c2c69a0bf000baf9a79607ca0c084f577f811a9b447c319", - "sha256:95fb62a3980cf43e76c2fe95edab06ec70dc495b8aa660975eb9f0b2ffdae1e1", - "sha256:9668da78bcc219542467f51c2cd01894222be6aceec4b5efb806705900b794d8", - "sha256:99a7c5786de9e92ff5ffee2e8bed745f5d25495206f3f14656c379031e518334", - "sha256:a1e283ad918df44bad3ccf042c2fe283c63d17617570eb91b8c370ef677b0b83", - "sha256:a25d251546acb5edb1635631c4ae0e330fa4ec7c6316c01d256728fbfb9bbff2", - "sha256:abe1adb32e2535aaa171e8b2b2d3f083f863c9974a3e6e7dae6bf4827fc8b983", - "sha256:ae85112da2d826b65aa7c7369c56ca41d9a89644312172979cbee5cf788e0b09", - "sha256:b3379a83dc63fe06538c751961f9ed730b5d7f08f96a57bbad8d52db5820df1f", - "sha256:b3c7c6c4aac19b964c1d12784aecae7f0315314640b0f41dd6f0d4e2bf439072", - "sha256:b7ddecc80e87acf12c2cf12bf3721def47188c403f04e706f104b5e71fed2f31", - "sha256:bbaf6785d3f1cd3e617b9d0fb3c5528023ef7bc7cc1356234801dc1941df8ce9", - "sha256:be6f5b453f7ed2219a9555bb6840663950b9ab1dc034216f68eac64db66633c2", - "sha256:c2b6404631b22617b5127c6de2355393ccda693ca733a098b6802e7dabb3457a", - "sha256:c4f6609f6e867a58cdf173e1cbe1f3736d25962108bd5cb01ad5a130875ff2c8", - "sha256:c76dd2c0615a28de21c97f9f6862e84faef58ff4d700196b4e395ef6a52291e4", - "sha256:c78c72f7878071a78337510ec78ab856d60b4bdcd3a95fd68b939e7cb30434b3", - "sha256:cb0c9a1476d279524538ba9a00ecec9eadcef31a6a60b2c8bd2f29f62044a559", - "sha256:ccb986e80674c929f198464bce55e995178dea26833421e2479ff04a6956afac", - "sha256:cfa62063c5eafb04e4435459ce15746b4ae6c14efeae8f16bd0e3d2895dad698", - "sha256:d13bd83284b46c304eb10de93f8a3f2c80361f91f4e8a4e1273caf83e16c4409", - "sha256:d76e585368388d99ddd2f95989e6ac80a8fe23115e93931faad99fa34550612f", - "sha256:dc32029b9cc784a529f9201289d4f841cc24a2ae3126a112cd467bc41bbc2f10", - "sha256:e0b55651db770b4b5a6c7d015f24d1a6ede307296bbdf0c47fc5f6a6adc7abee", - "sha256:e37886929ee83a5fa5c73164abada00e7f3cc1cbf3f8f6e1e8cfecae9d6cfc47", - "sha256:f7b88bc7306136b123fd1a9beed16ca02900ee31d1c36e73fa33d9e525a5562d", - "sha256:fac611bde2609a46fcbd92da7171286faa2f5c191f84d22f61cd7dc27213f51d", - "sha256:fafed60103132e74cdfbd651abe94801eb87a9765ce275b3dca9af8f3e06622a" - ], - "markers": "python_version >= '3.6'", - "version": "==2022.8.17" - }, "requests": { "hashes": [ "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_full_version < '4.0.0'", "version": "==2.28.1" }, "setuptools": { "hashes": [ - "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82", - "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57" + "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31", + "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f" ], "markers": "python_version >= '3.7'", - "version": "==65.3.0" + "version": "==65.5.1" }, "six": { "hashes": [ @@ -840,22 +709,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "sqlfluff": { - "hashes": [ - "sha256:2f3e3daff41c4c61f8021f33ebcd4f0eba1a874bbb51e49f38da692794d0cf2e", - "sha256:47dff29a8a533dabc543b573f23a9c4371c1ff9fb346ed1cc83d1f4cf23a1962" - ], - "index": "pypi", - "version": "==1.3.0" - }, - "sqlfluff-templater-dbt": { - "hashes": [ - "sha256:91b7176fa5dabe0ad69fd88b365aa70a0155ec72c8a6550bd6e3bd4bf5b16590", - "sha256:c4feb48e0303b7fd70f05fa7f2ff2f8e5ce1533a7f49e5a1e6acb3117ea6cda9" - ], - "index": "pypi", - "version": "==1.3.0" - }, "sqlparams": { "hashes": [ "sha256:79e4136cf4333ccbcd559793058740479df2386fbaedb0d03ff2b3c0e1c53b1a", @@ -866,19 +719,11 @@ }, "sqlparse": { "hashes": [ - "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae", - "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d" + "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34", + "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268" ], "markers": "python_version >= '3.5'", - "version": "==0.4.2" - }, - "tblib": { - "hashes": [ - "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c", - "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.7.0" + "version": "==0.4.3" }, "text-unidecode": { "hashes": [ @@ -893,61 +738,37 @@ ], "version": "==0.13.0" }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_version >= '3.7'", + "markers": "python_version < '3.11'", "version": "==2.0.1" }, - "tqdm": { - "hashes": [ - "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4", - "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.64.1" - }, "typing-extensions": { "hashes": [ - "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02", - "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6" + "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", + "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" ], "markers": "python_version >= '3.7'", - "version": "==4.3.0" + "version": "==4.4.0" }, "urllib3": { "hashes": [ "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_full_version < '4.0.0'", "version": "==1.26.12" }, "werkzeug": { "hashes": [ - "sha256:1ce08e8093ed67d638d63879fd1ba3735817f7a80de3674d293f5984f25fb6e6", - "sha256:72a4b735692dd3135217911cbeaa1be5fa3f62bffb8745c5215420a03dc55255" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.2" - }, - "zipp": { - "hashes": [ - "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2", - "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009" + "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f", + "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5" ], "markers": "python_version >= '3.7'", - "version": "==3.8.1" + "version": "==2.2.2" } }, "develop": { @@ -959,6 +780,14 @@ "markers": "python_version >= '3.5'", "version": "==22.1.0" }, + "exceptiongroup": { + "hashes": [ + "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695", + "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27" + ], + "markers": "python_version < '3.11'", + "version": "==1.0.2" + }, "iniconfig": { "hashes": [ "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", @@ -982,14 +811,6 @@ "markers": "python_version >= '3.6'", "version": "==1.0.0" }, - "py": { - "hashes": [ - "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", - "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.11.0" - }, "pyparsing": { "hashes": [ "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", @@ -1000,26 +821,26 @@ }, "pytest": { "hashes": [ - "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7", - "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39" + "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71", + "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59" ], "markers": "python_version >= '3.7'", - "version": "==7.1.3" + "version": "==7.2.0" }, "pytest-mock": { "hashes": [ - "sha256:77f03f4554392558700295e05aed0b1096a20d4a60a4f3ddcde58b0c31c8fca2", - "sha256:8a9e226d6c0ef09fcf20c94eb3405c388af438a90f3e39687f84166da82d5948" + "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b", + "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f" ], "index": "pypi", - "version": "==3.8.2" + "version": "==3.10.0" }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_version >= '3.7'", + "markers": "python_version < '3.11'", "version": "==2.0.1" } } diff --git a/testing/lint_models.py b/testing/lint_models.py deleted file mode 100644 index 5e7f8c161..000000000 --- a/testing/lint_models.py +++ /dev/null @@ -1,94 +0,0 @@ -import logging -import subprocess -from typing import Callable, List -import sys -import json -import re - - -logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) -logging = logging.getLogger(__name__) - -def get_args(): - # Get args passed to the script from the make file - # so we can differentiate from local dev and CI. - if len(sys.argv) > 1: - args = json.loads(sys.argv[1]) - else: - args = {} - return args - -def dbt_ls_modified_paths_output( - args: dict -) -> List[str]: - if 'docker' in args: - ls_command = ["./dbt_local"] - else: - ls_command = [] - - ls_command.extend(["dbt", - "ls", - "--select", - "state:modified", - "--state", - "production_target/", - "--output", - "path", - ]) - # Add a profile argument for when the script is being run in CI - if 'ci_profile' in args: - ls_command.extend(["--profile", f"{args['ci_profile']}"]) - print(ls_command) - ls_output = subprocess.run(ls_command, capture_output=True) - ls_output_list = ls_output.stdout.decode("utf-8").split("\n") - print(ls_output_list) - return ls_output_list - -def get_modified_lintable_paths(output_lines: List -) -> List[str]: - changed_model_paths = re.findall(r'[\/\w-]+.sql', ' '.join(output_lines)) - if len(changed_model_paths) > 0: - logging.info("Found modified paths...proceeding.") - return changed_model_paths - else: - logging.info("No modified paths found. Exiting.") - -def build_sqlfluff_command( - args: dict, - lintable_paths: List -): - # Specify lint or fix command - if 'docker' in args: - sqlfluff_command = "./dbt_local " - else: - sqlfluff_command = '' - if 'fix' in args: - sqlfluff_command = sqlfluff_command + "sqlfluff fix" - else: - sqlfluff_command = sqlfluff_command + "sqlfluff lint" - # Add additional ci config when run in CI - if 'ci_config_path' in args: - sqlfluff_command = sqlfluff_command + ' --config ' + args['ci_config_path'] - sqlfluff_command = sqlfluff_command + ' ' + ' '.join(lintable_paths) - return sqlfluff_command - -def run_sqlfluff_on_modified_paths(): - args = get_args() - output_lines = dbt_ls_modified_paths_output(args) - lintable_paths = get_modified_lintable_paths(output_lines) - logging.info(lintable_paths) - if lintable_paths: - sqlfluff_command = build_sqlfluff_command(args, lintable_paths) - logging.info(f'Executing: "{sqlfluff_command}"') - res = subprocess.run( - sqlfluff_command, shell=True - ) - if res.returncode != 0: - raise Exception(f"Linting failed.") - else: - logging.info('No lintable paths found.') - - - -if __name__ == "__main__": - run_sqlfluff_on_modified_paths() diff --git a/testing/manifests.py b/testing/manifests.py deleted file mode 100644 index ccf7d0ee7..000000000 --- a/testing/manifests.py +++ /dev/null @@ -1,153 +0,0 @@ -import os -import base64 -import json -import logging -import requests -import argparse - -logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) -logging = logging.getLogger(__name__) - - -def delete_previous_merged_build_number(project, circle_ci_token_b64): - previous_merged_build_number = get_merged_build_number(project, circle_ci_token_b64) - url = f"https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar/{project}_CURRENT_MERGED_BUILD_NUMBER_{previous_merged_build_number}" - headers = {"content-type": "application/json", - "authorization": f"Basic '{circle_ci_token_b64}'"} - response = requests.request("DELETE", url, headers=headers) - if response.status_code == 200: - logging.info(f"Deleted previous build number: {previous_merged_build_number}") - logging.info(response.json()) - return response.json() - else: - logging.info("Failed to find previous build number. Continuing.") - logging.info(response.json()) - return response.json() - - -def post_merged_build_number(project, circle_ci_token_b64, circle_build_number): - url = "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar" - headers = {"content-type": "application/json", - "authorization": f"Basic '{circle_ci_token_b64}'"} - data = {"name": f"{project}_CURRENT_MERGED_BUILD_NUMBER_{circle_build_number}", - "value": "a_random_value_of_no_importance"} - response = requests.post(url, headers=headers, json=data) - if response.status_code == 201: - logging.info("Posted new merged build number.") - logging.info(response.json()) - delete_previous_merged_build_number_result = delete_previous_merged_build_number(project, circle_ci_token_b64) - return response.json() - else: - raise Exception(response, f"Failed to post merged build number as env var.") - - -def get_merged_build_number(project, circle_ci_token_b64): - url = "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar" - headers = {"content-type": "application/json", - "authorization": f"Basic '{circle_ci_token_b64}'"} - response = requests.get(url, headers=headers) - if response.status_code == 200: - env_vars = response.json()['items'] - project_build_number_string = [env_var['name'] for env_var in env_vars if - f'{project}_CURRENT_MERGED_BUILD_NUMBER_' in env_var[ - 'name']][0] - project_build_number = int( - project_build_number_string.replace(f'{project}_CURRENT_MERGED_BUILD_NUMBER_', '')) - logging.info(f'Found current merged build number: {project_build_number}') - return project_build_number - else: - raise Exception( - response.status_code, - response.json(), - f"Failed to find merged build number." - ) - - -def get_production_manifest_url(project, circle_ci_token_b64): - project_build_number = get_merged_build_number(project, circle_ci_token_b64) - url = f"https://circleci.com/api/v2/project/github/octoenergy/datalake-models/{project_build_number}/artifacts" - headers = {"content-type": "application/json", - "authorization": f"Basic '{circle_ci_token_b64}'"} - response = requests.get(url, headers=headers) - if response.status_code == 200: - logging.info(f'{response.status_code}: Found production manifest url.') - manifest_url = response.json()['items'][0]['url'] - return manifest_url - else: - raise Exception(response, f"Failed to retrieve production manifest URL.") - - -def get_production_manifest(project, circle_ci_token_b64): - artifact_url = get_production_manifest_url(project, circle_ci_token_b64) - circle_ci_token = base64.b64decode(circle_ci_token_b64).decode('utf-8') - headers = { - "content-type": "application/json", - "Circle-Token": f"{circle_ci_token}" - } - response = requests.get(artifact_url, headers=headers) - if response.status_code == 200: - production_manifest = response.json() - logging.info(f'{response.status_code}: Retrieved production manifest.') - return production_manifest - else: - raise Exception(response.status_code, response.json(), f"Failed to retrieve manifest.") - - -def save_production_manifest_to_state_dir(project, circle_ci_token_b64, state_directory): - production_manifest = get_production_manifest(project, circle_ci_token_b64) - if not os.path.isdir(state_directory): - os.mkdir(state_directory) - with open(f'{state_directory}/manifest.json', 'w') as f: - json.dump(production_manifest, f) - logging.info(f'Manifest saved to {state_directory}/manifest.json') - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - 'command', - help='get_production_manifest or post_build_number or save_production_manifest_to_state_dir', - nargs='?', - choices=( - 'post_merged_build_number', - 'get_merged_build_number', - 'save_production_manifest_to_state_dir' - ) - ) - parser.add_argument("project", type=str, help="The project to get the manifest for") - parser.add_argument("token", type=str, help="Base 64 encoded Circle Ci Token") - parser.add_argument( - "--circle_build_number", - type=int, - help="Circle build number to encode and post as an environment variable in CI" - ) - parser.add_argument( - "--state_directory", - type=str, - default='production_target', - help="Directory in which to store the production manifest for comparison." - ) - args = parser.parse_args() - - if not args.project: - raise Exception(f"Must specify a project.") - elif not args.token: - raise Exception(f"Could not find Circle Ci Token environment variable.") - else: - pass - - if args.command == 'post_merged_build_number' and args.circle_build_number: - post_merged_build_number(args.project, args.token, args.circle_build_number) - elif args.command == 'get_merged_build_number': - merged_build_number = get_merged_build_number(args.project, args.token) - print(merged_build_number) - elif args.command == 'save_production_manifest_to_state_dir': - save_production_manifest_to_state_dir(args.project, args.token, args.state_directory) - else: - raise Exception(''' - Must specify one of: - - post_merged_build_number and circle_build_number - - get_merged_build_number - - save_production_manifest_to_state_dir - ''' - ) diff --git a/testing/test_lint_models.py b/testing/test_lint_models.py deleted file mode 100644 index cd1f3326b..000000000 --- a/testing/test_lint_models.py +++ /dev/null @@ -1,65 +0,0 @@ -import pytest -from .lint_models import ( - dbt_ls_modified_paths_output, - get_modified_lintable_paths, - build_sqlfluff_command, - run_sqlfluff_on_modified_paths -) - -@pytest.fixture -def subprocess(mocker): - return mocker.patch("testing.lint_models.subprocess") - -@pytest.fixture -def args_lint(): - return {} - -@pytest.fixture -def args_fix(): - return {'fix': 'True'} - -@pytest.fixture -def args_ci(): - return {"ci_profile": "testing", "ci_config_path": ".sqlfluffci"} - -@pytest.fixture -def output_lines(): - return [ - 'blah.yml', - 'core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql', - 'core/models/consumer/staging/src_consumer/stg_django_content_type.sql' - ] - -@pytest.fixture -def modified_lintable_paths(): - return ["core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql", - "core/models/consumer/staging/src_consumer/stg_django_content_type.sql" - ] - -def test_dbt_ls_modified_paths_output_lint(args_lint, subprocess, output_lines): - subprocess.run.return_value.stdout = b'blah.yml\ncore/models/consumer/staging/src_consumer/stg_data_accountapplication.sql\ncore/models/consumer/staging/src_consumer/stg_django_content_type.sql' - output = dbt_ls_modified_paths_output(args_lint) - assert output == output_lines - -def test_dbt_ls_modified_paths_output_ci(args_ci, subprocess, output_lines): - subprocess.run.return_value.stdout = b'blah.yml\ncore/models/consumer/staging/src_consumer/stg_data_accountapplication.sql\ncore/models/consumer/staging/src_consumer/stg_django_content_type.sql' - output = dbt_ls_modified_paths_output(args_ci) - call_args = subprocess.run.call_args[0][0] - assert '--profile' in call_args - assert output == output_lines - -def test_get_modified_lintable_paths(output_lines, modified_lintable_paths): - output = get_modified_lintable_paths(output_lines) - assert output == modified_lintable_paths - -def test_build_sqlfluff_command_lint(args_lint, modified_lintable_paths): - output = build_sqlfluff_command(args_lint, modified_lintable_paths) - assert output == "sqlfluff lint core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql core/models/consumer/staging/src_consumer/stg_django_content_type.sql" - -def test_build_sqlfluff_command_fix(args_fix, modified_lintable_paths): - output = build_sqlfluff_command(args_fix, modified_lintable_paths) - assert output == "sqlfluff fix core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql core/models/consumer/staging/src_consumer/stg_django_content_type.sql" - -def test_build_sqlfluff_command_ci(args_ci, modified_lintable_paths): - output = build_sqlfluff_command(args_ci, modified_lintable_paths) - assert output == "sqlfluff lint --config .sqlfluffci core/models/consumer/staging/src_consumer/stg_data_accountapplication.sql core/models/consumer/staging/src_consumer/stg_django_content_type.sql" diff --git a/testing/test_manifests.py b/testing/test_manifests.py deleted file mode 100644 index d8d359e99..000000000 --- a/testing/test_manifests.py +++ /dev/null @@ -1,169 +0,0 @@ -import pytest -from .manifests import ( - delete_previous_merged_build_number, - post_merged_build_number, - get_merged_build_number, - get_production_manifest_url, - get_production_manifest, - save_production_manifest_to_state_dir -) - -@pytest.fixture() -def delete_previous_merged_build_number_response(): - return {'message': 'Environment variable deleted.'} - - -@pytest.fixture() -def post_merged_build_number_request_response(): - return { - 'name': 'oegb_CURRENT_MERGED_BUILD_NUMBER_45451', - 'value': 'xxxxance' - } - - -@pytest.fixture() -def get_merged_build_number_get_request_response(): - return { - 'next_page_token': None, - 'items': [ - {'name': 'oegb_CURRENT_MERGED_BUILD_NUMBER_45451', - 'value': 'xxxxance'}, - ] - } - - -@pytest.fixture() -def get_merged_build_number_expected(): - return 45451 - - -@pytest.fixture() -def get_production_manifest_url_get_request_response(): - return { - 'next_page_token': None, - 'items': [ - { - 'path': 'production_target/manifest.json', - 'node_index': 0, - 'url': 'https://output.circle-artifacts.com/output/job/8ad304ab-b1f9-47e8-b57d-9f2073bad057/artifacts/0/production_target/manifest.json' - } - ] - } - - -@pytest.fixture() -def get_production_manifest_url_expected(): - return 'https://output.circle-artifacts.com/output/job/8ad304ab-b1f9-47e8-b57d-9f2073bad057/artifacts/0/production_target/manifest.json' - - -@pytest.fixture() -def get_production_manifest_get_request_response(): - return { - "metadata": - { - "dbt_schema_version": "some_data", - } - } - -def test_delete_previous_merged_build_number(mocker, delete_previous_merged_build_number_response): - mock_get_merged_build_number = mocker.patch("testing.manifests.get_merged_build_number", - return_value=get_merged_build_number_expected) - - mock_requests = mocker.patch("requests.request") - mock_requests.return_value.status_code = 200 - mock_requests.return_value.json.return_value = post_merged_build_number_request_response - - actual = delete_previous_merged_build_number('oegb', 'token') - mock_requests.assert_called_once_with('DELETE', - f"https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar/oegb_CURRENT_MERGED_BUILD_NUMBER_{get_merged_build_number_expected}", - headers={ - 'content-type': 'application/json', - 'authorization': "Basic 'token'" - }, - - ) - assert actual == post_merged_build_number_request_response - -def test_post_merged_build_number(mocker, post_merged_build_number_request_response): - mock_delete_previous_merged_build_number = mocker.patch("testing.manifests.delete_previous_merged_build_number", - return_value=delete_previous_merged_build_number_response) - - mock_requests = mocker.patch("requests.post") - mock_requests.return_value.status_code = 201 - mock_requests.return_value.json.return_value = post_merged_build_number_request_response - - actual = post_merged_build_number('oegb', 'token', 45451) - mock_requests.assert_called_once_with( - "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar", - headers={ - 'content-type': 'application/json', - 'authorization': "Basic 'token'" - }, - json={ - 'name': 'oegb_CURRENT_MERGED_BUILD_NUMBER_45451', - 'value': 'a_random_value_of_no_importance' - } - ) - assert actual == post_merged_build_number_request_response - - -def test_get_merged_build_number(mocker, get_merged_build_number_get_request_response, - get_merged_build_number_expected): - mock_requests = mocker.patch("requests.get") - mock_requests.return_value.status_code = 200 - mock_requests.return_value.json.return_value = get_merged_build_number_get_request_response - - actual = get_merged_build_number('oegb', 'token') - mock_requests.assert_called_once_with( - "https://circleci.com/api/v2/project/gh/octoenergy/datalake-models/envvar", - headers={ - 'content-type': 'application/json', - 'authorization': "Basic 'token'" - } - ) - assert actual == get_merged_build_number_expected - - -def test_get_production_manifest_url(mocker, get_production_manifest_url_get_request_response, - get_production_manifest_url_expected, - get_merged_build_number_expected): - mock_get_merged_build_number = mocker.patch("testing.manifests.get_merged_build_number", - return_value=get_merged_build_number_expected) - - mock_requests = mocker.patch("requests.get") - mock_requests.return_value.status_code = 200 - mock_requests.return_value.json.return_value = get_production_manifest_url_get_request_response - - actual = get_production_manifest_url('oegb', 'token') - mock_requests.assert_called_once_with( - "https://circleci.com/api/v2/project/github/octoenergy/datalake-models/45451/artifacts", - headers={ - 'content-type': 'application/json', - 'authorization': "Basic 'token'" - } - ) - assert actual == get_production_manifest_url_expected - - -def test_get_production_manifest(mocker, get_production_manifest_get_request_response, - get_production_manifest_url_expected): - mock_get_production_manifest_url = mocker.patch( - "testing.manifests.get_production_manifest_url", - return_value=get_production_manifest_url_expected - ) - - mock_requests = mocker.patch("requests.get") - mock_requests.return_value.status_code = 200 - mock_requests.return_value.json.return_value = get_production_manifest_get_request_response - - actual = get_production_manifest('oegb', b'dG9rZW4=') - mock_requests.assert_called_once_with( - get_production_manifest_url_expected, - headers={ - 'content-type': 'application/json', - "Circle-Token": "token" - } - ) - assert actual == get_production_manifest_get_request_response - -# def test_save_production_manifest_to_state_dir(): From 757065c275ceaa70126d353e24512a8964b7a724 Mon Sep 17 00:00:00 2001 From: Joanna Lau Date: Mon, 14 Aug 2023 17:05:59 +0100 Subject: [PATCH 09/13] Remove the sensitive subdirectory - we don't use this anymore Signed-off-by: Joanna Lau --- testing/test_structure.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testing/test_structure.py b/testing/test_structure.py index 43f1af12b..4fa9d2982 100644 --- a/testing/test_structure.py +++ b/testing/test_structure.py @@ -14,8 +14,7 @@ def parent_directory_structure_expected(): 'jaffle_shop/models/staging/src_seed/stg_customers.sql', 'jaffle_shop/models/staging/src_seed/stg_payments.sql', 'jaffle_shop/models/staging/src_seed/stg_orders.sql', - 'jaffle_shop/models/staging/src_seed/sensitive/_models.yml', - 'jaffle_shop/models/staging/src_seed/sensitive/stg_customers_pii.sql', + 'jaffle_shop/models/staging/src_seed/stg_customers_pii.sql', 'jaffle_shop/models/warehouse/_models.yml', 'jaffle_shop/models/warehouse/_docs.md', 'jaffle_shop/models/warehouse/wh_orders.sql', From 16d4eb0dad5fad5b16f0f5f32b333fea24b265de Mon Sep 17 00:00:00 2001 From: Kensuke Morris <56285518+kensukemorris@users.noreply.github.com> Date: Sun, 12 Nov 2023 16:16:52 +0900 Subject: [PATCH 10/13] Model Fixes Here are the fixes that need implementing: 1. All .yml files should be renamed to specify what they apply to. 2. Staging models should be split by which source they are coming from. 3. stg_customers contains PII data in the first_name and last_name columns so these need to be hashed. 4. The customers.sql and orders.sql models moced to warehouse folder 5. dbt_project_evaluator_exceptions.csv to make an except for stg_customers referecing stg_customers_pii --- Pipfile.lock | 1106 ++++++++++------- .../sensitive/{macros.yml => _macros.yml} | 0 .../{schema.yml => src_seed/_schema.yml} | 4 + .../staging/src_seed/sensitive/_schema.yml | 20 + .../sensitive/stg_customers_pii.sql} | 0 .../models/staging/src_seed/stg_customers.sql | 3 + .../staging/{ => src_seed}/stg_orders.sql | 0 .../staging/{ => src_seed}/stg_payments.sql | 0 .../{schema.yml => warehouse/_schema.yml} | 13 +- jaffle_shop/models/{ => warehouse}/docs.md | 0 .../wh_customers.sql} | 0 .../{orders.sql => warehouse/wh_orders.sql} | 0 .../dbt_project_evaluator_exceptions.csv | 2 + 13 files changed, 715 insertions(+), 433 deletions(-) rename jaffle_shop/macros/sensitive/{macros.yml => _macros.yml} (100%) rename jaffle_shop/models/staging/{schema.yml => src_seed/_schema.yml} (79%) create mode 100644 jaffle_shop/models/staging/src_seed/sensitive/_schema.yml rename jaffle_shop/models/staging/{stg_customers.sql => src_seed/sensitive/stg_customers_pii.sql} (100%) create mode 100644 jaffle_shop/models/staging/src_seed/stg_customers.sql rename jaffle_shop/models/staging/{ => src_seed}/stg_orders.sql (100%) rename jaffle_shop/models/staging/{ => src_seed}/stg_payments.sql (100%) rename jaffle_shop/models/{schema.yml => warehouse/_schema.yml} (86%) rename jaffle_shop/models/{ => warehouse}/docs.md (100%) rename jaffle_shop/models/{customers.sql => warehouse/wh_customers.sql} (100%) rename jaffle_shop/models/{orders.sql => warehouse/wh_orders.sql} (100%) create mode 100644 jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv diff --git a/Pipfile.lock b/Pipfile.lock index f8d9c41d4..b26c30d19 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -23,114 +23,199 @@ ], "version": "==1.6.3" }, + "alembic": { + "hashes": [ + "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb", + "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f" + ], + "markers": "python_version >= '3.7'", + "version": "==1.12.1" + }, "attrs": { "hashes": [ - "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", - "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" + "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", + "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" ], - "markers": "python_version >= '3.5'", - "version": "==22.1.0" + "markers": "python_version >= '3.7'", + "version": "==23.1.0" }, "babel": { "hashes": [ - "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe", - "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6" + "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900", + "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed" ], - "markers": "python_version >= '3.6'", - "version": "==2.11.0" + "markers": "python_version >= '3.7'", + "version": "==2.13.1" }, "certifi": { "hashes": [ - "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", - "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2022.9.24" + "version": "==2023.7.22" }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" - ], - "version": "==1.15.1" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "python_version >= '3.8'", + "version": "==1.16.0" }, "charset-normalizer": { "hashes": [ - "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", - "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" - ], - "markers": "python_version >= '3.6'", - "version": "==2.1.1" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.7" }, "colorama": { "hashes": [ @@ -142,11 +227,11 @@ }, "databricks-sql-connector": { "hashes": [ - "sha256:181007919044c8c21b63232fa8b3d3054a65343f4f37eb40fef93b7fee3ddc19", - "sha256:b936adc8755902347faafab40dea7b3e63b6f2da87a55cfda770e0fb792613f4" + "sha256:09a1686de3470091e78640de276053d4e18f8c03ba3627ed45b368f78bf87db9", + "sha256:e37b5aa8bea22e84a9920e87ad9ba6cafbe656008c180a790baa53b711dd9889" ], "markers": "python_full_version >= '3.7.1' and python_full_version < '4.0.0'", - "version": "==2.1.0" + "version": "==2.9.3" }, "dbt-core": { "hashes": [ @@ -191,26 +276,34 @@ }, "dbt-spark": { "hashes": [ - "sha256:52362eacf814e0bd5964ec0f67eb818fd596df0328be07a2ce0b9b9d40d072da", - "sha256:99f6dbeec2d135f7a1c91b75abb2ff13aee9fa5285e53a19200ed0ec03f13a9d" + "sha256:97646503d921ce8b43896bfb9ed55a0f63fdcb2f989d955c2505cb60bf709adf", + "sha256:9bccd36f3e3a5a7b2b38381be9038107e34096c207312077460f04805c63864d" ], "markers": "python_version >= '3.7'", - "version": "==1.3.0" + "version": "==1.3.3" + }, + "et-xmlfile": { + "hashes": [ + "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", + "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + ], + "markers": "python_version >= '3.6'", + "version": "==1.1.0" }, "exceptiongroup": { "hashes": [ - "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695", - "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27" + "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", + "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" ], "markers": "python_version < '3.11'", - "version": "==1.0.2" + "version": "==1.1.3" }, "future": { "hashes": [ - "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" + "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.18.2" + "version": "==0.18.3" }, "glob2": { "hashes": [ @@ -234,12 +327,29 @@ "markers": "python_version >= '3.5'", "version": "==3.4" }, + "importlib-metadata": { + "hashes": [ + "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", + "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743" + ], + "markers": "python_version < '3.9'", + "version": "==6.8.0" + }, + "importlib-resources": { + "hashes": [ + "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a", + "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6" + ], + "markers": "python_version < '3.9'", + "version": "==6.1.1" + }, "iniconfig": { "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" ], - "version": "==1.1.1" + "markers": "python_version >= '3.7'", + "version": "==2.0.0" }, "isodate": { "hashes": [ @@ -284,51 +394,120 @@ ], "version": "==1.5.3" }, + "lz4": { + "hashes": [ + "sha256:0ca83a623c449295bafad745dcd399cea4c55b16b13ed8cfea30963b004016c9", + "sha256:0f5614d8229b33d4a97cb527db2a1ac81308c6e796e7bdb5d1309127289f69d5", + "sha256:1c4c100d99eed7c08d4e8852dd11e7d1ec47a3340f49e3a96f8dfbba17ffb300", + "sha256:1f25eb322eeb24068bb7647cae2b0732b71e5c639e4e4026db57618dcd8279f0", + "sha256:200d05777d61ba1ff8d29cb51c534a162ea0b4fe6d3c28be3571a0a48ff36080", + "sha256:31d72731c4ac6ebdce57cd9a5cabe0aecba229c4f31ba3e2c64ae52eee3fdb1c", + "sha256:3a85b430138882f82f354135b98c320dafb96fc8fe4656573d95ab05de9eb092", + "sha256:4931ab28a0d1c133104613e74eec1b8bb1f52403faabe4f47f93008785c0b929", + "sha256:4caedeb19e3ede6c7a178968b800f910db6503cb4cb1e9cc9221157572139b49", + "sha256:65d5c93f8badacfa0456b660285e394e65023ef8071142e0dcbd4762166e1be0", + "sha256:6b50f096a6a25f3b2edca05aa626ce39979d63c3b160687c8c6d50ac3943d0ba", + "sha256:7211dc8f636ca625abc3d4fb9ab74e5444b92df4f8d58ec83c8868a2b0ff643d", + "sha256:7a9eec24ec7d8c99aab54de91b4a5a149559ed5b3097cf30249b665689b3d402", + "sha256:7c2df117def1589fba1327dceee51c5c2176a2b5a7040b45e84185ce0c08b6a3", + "sha256:7e2dc1bd88b60fa09b9b37f08553f45dc2b770c52a5996ea52b2b40f25445676", + "sha256:83903fe6db92db0be101acedc677aa41a490b561567fe1b3fe68695b2110326c", + "sha256:83acfacab3a1a7ab9694333bcb7950fbeb0be21660d236fd09c8337a50817897", + "sha256:86480f14a188c37cb1416cdabacfb4e42f7a5eab20a737dac9c4b1c227f3b822", + "sha256:867664d9ca9bdfce840ac96d46cd8838c9ae891e859eb98ce82fcdf0e103a947", + "sha256:8df16c9a2377bdc01e01e6de5a6e4bbc66ddf007a6b045688e285d7d9d61d1c9", + "sha256:8f00a9ba98f6364cadda366ae6469b7b3568c0cced27e16a47ddf6b774169270", + "sha256:926b26db87ec8822cf1870efc3d04d06062730ec3279bbbd33ba47a6c0a5c673", + "sha256:a6a46889325fd60b8a6b62ffc61588ec500a1883db32cddee9903edfba0b7584", + "sha256:a98b61e504fb69f99117b188e60b71e3c94469295571492a6468c1acd63c37ba", + "sha256:ad38dc6a7eea6f6b8b642aaa0683253288b0460b70cab3216838747163fb774d", + "sha256:b10b77dc2e6b1daa2f11e241141ab8285c42b4ed13a8642495620416279cc5b2", + "sha256:d5ea0e788dc7e2311989b78cae7accf75a580827b4d96bbaf06c7e5a03989bd5", + "sha256:e05afefc4529e97c08e65ef92432e5f5225c0bb21ad89dee1e06a882f91d7f5e", + "sha256:e1431d84a9cfb23e6773e72078ce8e65cad6745816d4cbf9ae67da5ea419acda", + "sha256:ec6755cacf83f0c5588d28abb40a1ac1643f2ff2115481089264c7630236618a", + "sha256:edc2fb3463d5d9338ccf13eb512aab61937be50aa70734bcf873f2f493801d3b", + "sha256:edd8987d8415b5dad25e797043936d91535017237f72fa456601be1479386c92", + "sha256:edda4fb109439b7f3f58ed6bede59694bc631c4b69c041112b1b7dc727fffb23", + "sha256:f571eab7fec554d3b1db0d666bdc2ad85c81f4b8cb08906c4c59a8cad75e6e22", + "sha256:f7c50542b4ddceb74ab4f8b3435327a0861f06257ca501d59067a6a482535a77" + ], + "markers": "python_version >= '3.7'", + "version": "==4.3.2" + }, + "mako": { + "hashes": [ + "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9", + "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b" + ], + "markers": "python_version >= '3.8'", + "version": "==1.3.0" + }, "markupsafe": { "hashes": [ - "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" + "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", + "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", + "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", + "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", + "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", + "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", + "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", + "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", + "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", + "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", + "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", + "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", + "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", + "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", + "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", + "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", + "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", + "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", + "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", + "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", + "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", + "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", + "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", + "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", + "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", + "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", + "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", + "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", + "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", + "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", + "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", + "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", + "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", + "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", + "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", + "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", + "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", + "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", + "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", + "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", + "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", + "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", + "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", + "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", + "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", + "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", + "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", + "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" ], "markers": "python_version >= '3.7'", - "version": "==2.1.1" + "version": "==2.1.3" }, "mashumaro": { "extras": [ @@ -349,60 +528,64 @@ }, "msgpack": { "hashes": [ - "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467", - "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae", - "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92", - "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef", - "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624", - "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227", - "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88", - "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9", - "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8", - "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd", - "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6", - "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55", - "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e", - "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2", - "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44", - "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6", - "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9", - "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab", - "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae", - "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa", - "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9", - "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e", - "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250", - "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce", - "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075", - "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236", - "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae", - "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e", - "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f", - "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08", - "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6", - "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d", - "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43", - "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1", - "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6", - "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0", - "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c", - "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff", - "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db", - "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243", - "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661", - "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba", - "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e", - "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb", - "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52", - "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6", - "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1", - "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f", - "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da", - "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f", - "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c", - "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8" - ], - "version": "==1.0.4" + "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862", + "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d", + "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3", + "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672", + "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0", + "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9", + "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee", + "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46", + "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524", + "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819", + "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc", + "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc", + "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1", + "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82", + "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81", + "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6", + "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d", + "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2", + "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c", + "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87", + "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84", + "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e", + "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95", + "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f", + "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b", + "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93", + "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf", + "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61", + "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c", + "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8", + "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d", + "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c", + "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4", + "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba", + "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415", + "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee", + "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d", + "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9", + "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075", + "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f", + "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7", + "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681", + "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329", + "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1", + "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf", + "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c", + "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5", + "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b", + "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5", + "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e", + "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b", + "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad", + "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd", + "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7", + "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002", + "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc" + ], + "version": "==1.0.7" }, "networkx": { "hashes": [ @@ -414,37 +597,37 @@ }, "numpy": { "hashes": [ - "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8", - "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735", - "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd", - "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810", - "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db", - "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962", - "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79", - "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911", - "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d", - "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488", - "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5", - "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0", - "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f", - "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f", - "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2", - "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0", - "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68", - "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3", - "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6", - "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71", - "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894", - "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f", - "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329", - "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba", - "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c", - "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e", - "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef", - "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7" - ], - "markers": "python_version < '3.10'", - "version": "==1.23.4" + "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", + "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", + "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", + "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", + "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", + "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", + "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", + "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", + "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", + "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", + "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", + "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", + "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", + "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", + "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", + "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", + "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", + "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", + "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", + "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", + "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", + "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", + "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", + "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", + "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", + "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", + "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", + "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9" + ], + "markers": "python_version < '3.11' and python_version >= '3.7'", + "version": "==1.24.4" }, "oauthlib": { "hashes": [ @@ -454,6 +637,14 @@ "markers": "python_version >= '3.6'", "version": "==3.2.2" }, + "openpyxl": { + "hashes": [ + "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184", + "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" + ], + "markers": "python_version >= '3.6'", + "version": "==3.1.2" + }, "packaging": { "hashes": [ "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", @@ -464,36 +655,34 @@ }, "pandas": { "hashes": [ - "sha256:04e51b01d5192499390c0015630975f57836cc95c7411415b499b599b05c0c96", - "sha256:05c527c64ee02a47a24031c880ee0ded05af0623163494173204c5b72ddce658", - "sha256:0a78e05ec09731c5b3bd7a9805927ea631fe6f6cb06f0e7c63191a9a778d52b4", - "sha256:17da7035d9e6f9ea9cdc3a513161f8739b8f8489d31dc932bc5a29a27243f93d", - "sha256:249cec5f2a5b22096440bd85c33106b6102e0672204abd2d5c014106459804ee", - "sha256:2c25e5c16ee5c0feb6cf9d982b869eec94a22ddfda9aa2fbed00842cbb697624", - "sha256:32e3d9f65606b3f6e76555bfd1d0b68d94aff0929d82010b791b6254bf5a4b96", - "sha256:36aa1f8f680d7584e9b572c3203b20d22d697c31b71189322f16811d4ecfecd3", - "sha256:5b0c970e2215572197b42f1cff58a908d734503ea54b326412c70d4692256391", - "sha256:5cee0c74e93ed4f9d39007e439debcaadc519d7ea5c0afc3d590a3a7b2edf060", - "sha256:669c8605dba6c798c1863157aefde959c1796671ffb342b80fcb80a4c0bc4c26", - "sha256:66a1ad667b56e679e06ba73bb88c7309b3f48a4c279bd3afea29f65a766e9036", - "sha256:683779e5728ac9138406c59a11e09cd98c7d2c12f0a5fc2b9c5eecdbb4a00075", - "sha256:6bb391659a747cf4f181a227c3e64b6d197100d53da98dcd766cc158bdd9ec68", - "sha256:81f0674fa50b38b6793cd84fae5d67f58f74c2d974d2cb4e476d26eee33343d0", - "sha256:927e59c694e039c75d7023465d311277a1fc29ed7236b5746e9dddf180393113", - "sha256:932d2d7d3cab44cfa275601c982f30c2d874722ef6396bb539e41e4dc4618ed4", - "sha256:a52419d9ba5906db516109660b114faf791136c94c1a636ed6b29cbfff9187ee", - "sha256:b156a971bc451c68c9e1f97567c94fd44155f073e3bceb1b0d195fd98ed12048", - "sha256:bcf1a82b770b8f8c1e495b19a20d8296f875a796c4fe6e91da5ef107f18c5ecb", - "sha256:cb2a9cf1150302d69bb99861c5cddc9c25aceacb0a4ef5299785d0f5389a3209", - "sha256:d8c709f4700573deb2036d240d140934df7e852520f4a584b2a8d5443b71f54d", - "sha256:db45b94885000981522fb92349e6b76f5aee0924cc5315881239c7859883117d", - "sha256:ddf46b940ef815af4e542697eaf071f0531449407a7607dd731bf23d156e20a7", - "sha256:e675f8fe9aa6c418dc8d3aac0087b5294c1a4527f1eacf9fe5ea671685285454", - "sha256:eb7e8cf2cf11a2580088009b43de84cabbf6f5dae94ceb489f28dba01a17cb77", - "sha256:f340331a3f411910adfb4bbe46c2ed5872d9e473a783d7f14ecf49bc0869c594" + "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682", + "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc", + "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b", + "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089", + "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5", + "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26", + "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210", + "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b", + "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641", + "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd", + "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78", + "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b", + "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e", + "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061", + "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0", + "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e", + "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8", + "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d", + "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0", + "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c", + "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183", + "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df", + "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8", + "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f", + "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02" ], "markers": "python_version >= '3.8'", - "version": "==1.5.1" + "version": "==2.0.3" }, "parsedatetime": { "hashes": [ @@ -512,43 +701,53 @@ }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", + "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "pyarrow": { "hashes": [ - "sha256:0238998dc692efcb4e41ae74738d7c1234723271ccf520bd8312dca07d49ef8d", - "sha256:02b820ecd1da02012092c180447de449fc688d0c3f9ff8526ca301cdd60dacd0", - "sha256:1c5a073a930c632058461547e0bc572da1e724b17b6b9eb31a97da13f50cb6e0", - "sha256:29eb3e086e2b26202f3a4678316b93cfb15d0e2ba20f3ec12db8fd9cc07cde63", - "sha256:2c715eca2092273dcccf6f08437371e04d112f9354245ba2fbe6c801879450b7", - "sha256:2e753f8fcf07d8e3a0efa0c8bd51fef5c90281ffd4c5637c08ce42cd0ac297de", - "sha256:3eef8a981f45d89de403e81fb83b8119c20824caddf1404274e41a5d66c73806", - "sha256:4eebdab05afa23d5d5274b24c1cbeb1ba017d67c280f7d39fd8a8f18cbad2ec9", - "sha256:5526a3bfb404ff6d31d62ea582cf2466c7378a474a99ee04d1a9b05de5264541", - "sha256:55328348b9139c2b47450d512d716c2248fd58e2f04e2fc23a65e18726666d42", - "sha256:767cafb14278165ad539a2918c14c1b73cf20689747c21375c38e3fe62884902", - "sha256:7fa56cbd415cef912677270b8e41baad70cde04c6d8a8336eeb2aba85aa93706", - "sha256:7fb02bebc13ab55573d1ae9bb5002a6d20ba767bf8569b52fce5301d42495ab7", - "sha256:81a60bb291a964f63b2717fb1b28f6615ffab7e8585322bfb8a6738e6b321282", - "sha256:8ad430cee28ebc4d6661fc7315747c7a18ae2a74e67498dcb039e1c762a2fb67", - "sha256:92f3977e901db1ef5cba30d6cc1d7942b8d94b910c60f89013e8f7bb86a86eef", - "sha256:9cef618159567d5f62040f2b79b1c7b38e3885f4ffad0ec97cd2d86f88b67cef", - "sha256:a5b390bdcfb8c5b900ef543f911cdfec63e88524fafbcc15f83767202a4a2491", - "sha256:d9eb04db626fa24fdfb83c00f76679ca0d98728cdbaa0481b6402bf793a290c0", - "sha256:da3e0f319509a5881867effd7024099fb06950a0768dad0d6873668bb88cfaba", - "sha256:f11a645a41ee531c3a5edda45dea07c42267f52571f818d388971d33fc7e2d4a", - "sha256:f241bd488c2705df930eedfe304ada71191dcf67d6b98ceda0cc934fd2a8388e", - "sha256:f59bcd5217a3ae1e17870792f82b2ff92df9f3862996e2c78e156c13e56ff62e", - "sha256:f8c46bde1030d704e2796182286d1c56846552c50a39ad5bf5a20c0d8159fc35", - "sha256:fc856628acd8d281652c15b6268ec7f27ebcb015abbe99d9baad17f02adc51f1", - "sha256:fe2ce795fa1d95e4e940fe5661c3c58aee7181c730f65ac5dd8794a77228de59" - ], - "markers": "python_version >= '3.7'", - "version": "==9.0.0" + "sha256:0140c7e2b740e08c5a459439d87acd26b747fc408bde0a8806096ee0baaa0c15", + "sha256:01e44de9749cddc486169cb632f3c99962318e9dacac7778315a110f4bf8a450", + "sha256:05fe7994745b634c5fb16ce5717e39a1ac1fac3e2b0795232841660aa76647cd", + "sha256:06ca79080ef89d6529bb8e5074d4b4f6086143b2520494fcb7cf8a99079cde93", + "sha256:097828b55321897db0e1dbfc606e3ff8101ae5725673498cbfa7754ee0da80e4", + "sha256:0f6f053cb66dc24091f5511e5920e45c83107f954a21032feadc7b9e3a8e7851", + "sha256:11e045dfa09855b6d3e7705a37c42e2dc2c71d608fab34d3c23df2e02df9aec3", + "sha256:1a8ae88c0038d1bc362a682320112ee6774f006134cd5afc291591ee4bc06505", + "sha256:1daab52050a1c48506c029e6fa0944a7b2436334d7e44221c16f6f1b2cc9c510", + "sha256:2a145dab9ed7849fc1101bf03bcdc69913547f10513fdf70fc3ab6c0a50c7eee", + "sha256:30d8494870d9916bb53b2a4384948491444741cb9a38253c590e21f836b01222", + "sha256:323cbe60210173ffd7db78bfd50b80bdd792c4c9daca8843ef3cd70b186649db", + "sha256:32542164d905002c42dff896efdac79b3bdd7291b1b74aa292fac8450d0e4dcd", + "sha256:33c1f6110c386464fd2e5e4ea3624466055bbe681ff185fd6c9daa98f30a3f9a", + "sha256:3c76807540989fe8fcd02285dd15e4f2a3da0b09d27781abec3adc265ddbeba1", + "sha256:3f6d5faf4f1b0d5a7f97be987cf9e9f8cd39902611e818fe134588ee99bf0283", + "sha256:450e4605e3c20e558485f9161a79280a61c55efe585d51513c014de9ae8d393f", + "sha256:470ae0194fbfdfbf4a6b65b4f9e0f6e1fa0ea5b90c1ee6b65b38aecee53508c8", + "sha256:4756a2b373a28f6166c42711240643fb8bd6322467e9aacabd26b488fa41ec23", + "sha256:58c889851ca33f992ea916b48b8540735055201b177cb0dcf0596a495a667b00", + "sha256:6263cffd0c3721c1e348062997babdf0151301f7353010c9c9a8ed47448f82ab", + "sha256:78d4a77a46a7de9388b653af1c4ce539350726cd9af62e0831e4f2bd0c95a2f4", + "sha256:7a8089d7e77d1455d529dbd7cff08898bbb2666ee48bc4085203af1d826a33cc", + "sha256:906b0dc25f2be12e95975722f1e60e162437023f490dbd80d0deb7375baf3171", + "sha256:922e8b49b88da8633d6cac0e1b5a690311b6758d6f5d7c2be71acb0f1e14cd61", + "sha256:96d64e5ba7dceb519a955e5eeb5c9adcfd63f73a56aea4722e2cc81364fc567a", + "sha256:981670b4ce0110d8dcb3246410a4aabf5714db5d8ea63b15686bce1c914b1f83", + "sha256:a8eeef015ae69d104c4c3117a6011e7e3ecd1abec79dc87fd2fac6e442f666ee", + "sha256:b8b3f4fe8d4ec15e1ef9b599b94683c5216adaed78d5cb4c606180546d1e2ee1", + "sha256:be28e1a07f20391bb0b15ea03dcac3aade29fc773c5eb4bee2838e9b2cdde0cb", + "sha256:c7331b4ed3401b7ee56f22c980608cf273f0380f77d0f73dd3c185f78f5a6220", + "sha256:cf87e2cec65dd5cf1aa4aba918d523ef56ef95597b545bbaad01e6433851aa10", + "sha256:d0351fecf0e26e152542bc164c22ea2a8e8c682726fce160ce4d459ea802d69c", + "sha256:d264ad13605b61959f2ae7c1d25b1a5b8505b112715c961418c8396433f213ad", + "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27", + "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226" + ], + "markers": "python_version < '3.11' and python_version >= '3.7'", + "version": "==14.0.1" }, "pycparser": { "hashes": [ @@ -559,55 +758,65 @@ }, "pyparsing": { "hashes": [ - "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", - "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" + "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", + "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.0.9" + "version": "==3.1.1" }, "pyrsistent": { "hashes": [ - "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed", - "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb", - "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a", - "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95", - "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712", - "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73", - "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41", - "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b", - "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78", - "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab", - "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308", - "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425", - "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2", - "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e", - "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6", - "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2", - "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a", - "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291", - "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584", - "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a", - "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0", - "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770" + "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", + "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", + "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", + "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", + "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", + "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", + "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", + "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", + "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", + "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", + "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", + "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", + "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", + "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", + "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", + "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", + "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", + "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", + "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", + "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", + "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", + "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", + "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", + "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", + "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", + "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", + "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", + "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", + "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", + "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", + "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", + "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" ], - "markers": "python_version >= '3.7'", - "version": "==0.19.2" + "markers": "python_version >= '3.8'", + "version": "==0.20.0" }, "pytest": { "hashes": [ - "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71", - "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59" + "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", + "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" ], "markers": "python_version >= '3.7'", - "version": "==7.2.0" + "version": "==7.4.3" }, "pytest-mock": { "hashes": [ - "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b", - "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f" + "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", + "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9" ], "index": "pypi", - "version": "==3.10.0" + "version": "==3.12.0" }, "python-dateutil": { "hashes": [ @@ -619,11 +828,11 @@ }, "python-slugify": { "hashes": [ - "sha256:272d106cb31ab99b3496ba085e3fea0e9e76dcde967b5e9992500d1f785ce4e1", - "sha256:7b2c274c308b62f4269a9ba701aa69a797e9bca41aeee5b3a9e79e36b6656927" + "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395", + "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.1.2" + "markers": "python_version >= '3.7'", + "version": "==8.0.1" }, "pytimeparse": { "hashes": [ @@ -634,72 +843,83 @@ }, "pytz": { "hashes": [ - "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427", - "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2" + "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", + "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" ], - "version": "==2022.6" + "markers": "python_version < '3.9'", + "version": "==2023.3.post1" }, "pyyaml": { "hashes": [ - "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", - "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", - "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", - "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", - "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", - "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", - "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", - "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", - "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", - "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", - "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", - "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", - "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", - "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", - "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", - "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", - "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", - "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", - "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", - "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", - "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", - "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", - "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", - "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", - "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", - "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", - "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", - "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", - "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", - "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", - "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", - "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", - "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", - "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", - "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", - "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", - "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", - "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", - "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", - "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], "markers": "python_version >= '3.6'", - "version": "==6.0" + "version": "==6.0.1" }, "requests": { "hashes": [ - "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", - "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_version >= '3.7' and python_full_version < '4.0.0'", - "version": "==2.28.1" + "markers": "python_version >= '3.7'", + "version": "==2.31.0" }, "setuptools": { "hashes": [ - "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31", - "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f" + "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", + "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" ], - "markers": "python_version >= '3.7'", - "version": "==65.5.1" + "markers": "python_version >= '3.8'", + "version": "==68.2.2" }, "six": { "hashes": [ @@ -709,21 +929,52 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, + "sqlalchemy": { + "hashes": [ + "sha256:0b7dbe6369677a2bea68fe9812c6e4bbca06ebfa4b5cde257b2b0bf208709131", + "sha256:128a948bd40780667114b0297e2cc6d657b71effa942e0a368d8cc24293febb3", + "sha256:14b0cacdc8a4759a1e1bd47dc3ee3f5db997129eb091330beda1da5a0e9e5bd7", + "sha256:1fb9cb60e0f33040e4f4681e6658a7eb03b5cb4643284172f91410d8c493dace", + "sha256:273505fcad22e58cc67329cefab2e436006fc68e3c5423056ee0513e6523268a", + "sha256:2e70e0673d7d12fa6cd363453a0d22dac0d9978500aa6b46aa96e22690a55eab", + "sha256:34e1c5d9cd3e6bf3d1ce56971c62a40c06bfc02861728f368dcfec8aeedb2814", + "sha256:3b97ddf509fc21e10b09403b5219b06c5b558b27fc2453150274fa4e70707dbf", + "sha256:3f6997da81114daef9203d30aabfa6b218a577fc2bd797c795c9c88c9eb78d49", + "sha256:82dd4131d88395df7c318eeeef367ec768c2a6fe5bd69423f7720c4edb79473c", + "sha256:85292ff52ddf85a39367057c3d7968a12ee1fb84565331a36a8fead346f08796", + "sha256:8a7a66297e46f85a04d68981917c75723e377d2e0599d15fbe7a56abed5e2d75", + "sha256:8b881ac07d15fb3e4f68c5a67aa5cdaf9eb8f09eb5545aaf4b0a5f5f4659be18", + "sha256:a3257a6e09626d32b28a0c5b4f1a97bced585e319cfa90b417f9ab0f6145c33c", + "sha256:a9bddb60566dc45c57fd0a5e14dd2d9e5f106d2241e0a2dc0c1da144f9444516", + "sha256:bdb77e1789e7596b77fd48d99ec1d2108c3349abd20227eea0d48d3f8cf398d9", + "sha256:c1db0221cb26d66294f4ca18c533e427211673ab86c1fbaca8d6d9ff78654293", + "sha256:c4cb501d585aa74a0f86d0ea6263b9c5e1d1463f8f9071392477fd401bd3c7cc", + "sha256:d00665725063692c42badfd521d0c4392e83c6c826795d38eb88fb108e5660e5", + "sha256:d0fed0f791d78e7767c2db28d34068649dfeea027b83ed18c45a423f741425cb", + "sha256:d69738d582e3a24125f0c246ed8d712b03bd21e148268421e4a4d09c34f521a5", + "sha256:db4db3c08ffbb18582f856545f058a7a5e4ab6f17f75795ca90b3c38ee0a8ba4", + "sha256:f1fcee5a2c859eecb4ed179edac5ffbc7c84ab09a5420219078ccc6edda45436", + "sha256:f2d526aeea1bd6a442abc7c9b4b00386fd70253b80d54a0930c0a216230a35be", + "sha256:fbaf6643a604aa17e7a7afd74f665f9db882df5c297bdd86c38368f2c471f37d" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.4.50" + }, "sqlparams": { "hashes": [ - "sha256:79e4136cf4333ccbcd559793058740479df2386fbaedb0d03ff2b3c0e1c53b1a", - "sha256:bab69f000493013a1d563ffff2a22e2b18a69cf72fc1036431c2e59db3d4d9fb" + "sha256:1abe87a0684567265b2b86f5a482d5c37db237c0268d4c81774ffedce4300199", + "sha256:ee4ef620a5197535e5ebb9217e2f453f08b044634b3d890f3d6701e4f838c85c" ], "markers": "python_version >= '3.7'", - "version": "==5.0.0" + "version": "==5.1.0" }, "sqlparse": { "hashes": [ - "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34", - "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268" + "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3", + "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c" ], "markers": "python_version >= '3.5'", - "version": "==0.4.3" + "version": "==0.4.4" }, "text-unidecode": { "hashes": [ @@ -734,9 +985,9 @@ }, "thrift": { "hashes": [ - "sha256:9af1c86bf73433afc6010ed376a6c6aca2b54099cc0d61895f640870a9ae7d89" + "sha256:2b5b6488fcded21f9d312aa23c9ff6a0195d0f6ae26ddbd5ad9e3e25dfc14408" ], - "version": "==0.13.0" + "version": "==0.16.0" }, "tomli": { "hashes": [ @@ -748,52 +999,61 @@ }, "typing-extensions": { "hashes": [ - "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", - "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" + "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", + "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" ], - "markers": "python_version >= '3.7'", - "version": "==4.4.0" + "markers": "python_version >= '3.8'", + "version": "==4.8.0" + }, + "tzdata": { + "hashes": [ + "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", + "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" + ], + "markers": "python_version >= '2'", + "version": "==2023.3" }, "urllib3": { "hashes": [ - "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", - "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" + "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", + "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_full_version < '4.0.0'", - "version": "==1.26.12" + "markers": "python_version >= '3.7'", + "version": "==2.0.7" }, "werkzeug": { "hashes": [ - "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f", - "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5" + "sha256:554b257c74bbeb7a0d254160a4f8ffe185243f52a52035060b761ca62d977f03", + "sha256:bba1f19f8ec89d4d607a3bd62f1904bd2e609472d93cd85e9d4e178f472c3748" ], - "markers": "python_version >= '3.7'", - "version": "==2.2.2" + "markers": "python_version >= '3.8'", + "version": "==2.3.8" + }, + "zipp": { + "hashes": [ + "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" + ], + "markers": "python_version >= '3.8'", + "version": "==3.17.0" } }, "develop": { - "attrs": { - "hashes": [ - "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", - "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" - ], - "markers": "python_version >= '3.5'", - "version": "==22.1.0" - }, "exceptiongroup": { "hashes": [ - "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695", - "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27" + "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", + "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" ], "markers": "python_version < '3.11'", - "version": "==1.0.2" + "version": "==1.1.3" }, "iniconfig": { "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" ], - "version": "==1.1.1" + "markers": "python_version >= '3.7'", + "version": "==2.0.0" }, "packaging": { "hashes": [ @@ -805,35 +1065,27 @@ }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", + "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" - }, - "pyparsing": { - "hashes": [ - "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", - "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.0.9" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "pytest": { "hashes": [ - "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71", - "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59" + "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", + "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" ], "markers": "python_version >= '3.7'", - "version": "==7.2.0" + "version": "==7.4.3" }, "pytest-mock": { "hashes": [ - "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b", - "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f" + "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", + "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9" ], "index": "pypi", - "version": "==3.10.0" + "version": "==3.12.0" }, "tomli": { "hashes": [ diff --git a/jaffle_shop/macros/sensitive/macros.yml b/jaffle_shop/macros/sensitive/_macros.yml similarity index 100% rename from jaffle_shop/macros/sensitive/macros.yml rename to jaffle_shop/macros/sensitive/_macros.yml diff --git a/jaffle_shop/models/staging/schema.yml b/jaffle_shop/models/staging/src_seed/_schema.yml similarity index 79% rename from jaffle_shop/models/staging/schema.yml rename to jaffle_shop/models/staging/src_seed/_schema.yml index c207e4cf5..f72a203e6 100644 --- a/jaffle_shop/models/staging/schema.yml +++ b/jaffle_shop/models/staging/src_seed/_schema.yml @@ -7,6 +7,10 @@ models: tests: - unique - not_null + - name: first_name_hash + tests: dbt_expectations.expect_columns_to_exist + - name: last_name_hash + tests: dbt_expectations.expect_columns_to_exist - name: stg_orders columns: diff --git a/jaffle_shop/models/staging/src_seed/sensitive/_schema.yml b/jaffle_shop/models/staging/src_seed/sensitive/_schema.yml new file mode 100644 index 000000000..75658c7e9 --- /dev/null +++ b/jaffle_shop/models/staging/src_seed/sensitive/_schema.yml @@ -0,0 +1,20 @@ +version: 2 + +models: + name: stg_customers_pii + meta: + owner: kensuke.morris@octoenergy.com + sensitive: True + description: One row per customer information. + columns: + - name: customer_id + description: Primary key + tests: + - unique + - not_null + - name: first_name + meta: + sensitive: True + - name: last_name + meta: + sensitive: True diff --git a/jaffle_shop/models/staging/stg_customers.sql b/jaffle_shop/models/staging/src_seed/sensitive/stg_customers_pii.sql similarity index 100% rename from jaffle_shop/models/staging/stg_customers.sql rename to jaffle_shop/models/staging/src_seed/sensitive/stg_customers_pii.sql diff --git a/jaffle_shop/models/staging/src_seed/stg_customers.sql b/jaffle_shop/models/staging/src_seed/stg_customers.sql new file mode 100644 index 000000000..677dcbd75 --- /dev/null +++ b/jaffle_shop/models/staging/src_seed/stg_customers.sql @@ -0,0 +1,3 @@ +SELECT + {{ hash_sensitive_columns('stg_customers_pii') }} +FROM {{ ref('stg_customers_pii') }} \ No newline at end of file diff --git a/jaffle_shop/models/staging/stg_orders.sql b/jaffle_shop/models/staging/src_seed/stg_orders.sql similarity index 100% rename from jaffle_shop/models/staging/stg_orders.sql rename to jaffle_shop/models/staging/src_seed/stg_orders.sql diff --git a/jaffle_shop/models/staging/stg_payments.sql b/jaffle_shop/models/staging/src_seed/stg_payments.sql similarity index 100% rename from jaffle_shop/models/staging/stg_payments.sql rename to jaffle_shop/models/staging/src_seed/stg_payments.sql diff --git a/jaffle_shop/models/schema.yml b/jaffle_shop/models/warehouse/_schema.yml similarity index 86% rename from jaffle_shop/models/schema.yml rename to jaffle_shop/models/warehouse/_schema.yml index 381349cfd..c3dab97c8 100644 --- a/jaffle_shop/models/schema.yml +++ b/jaffle_shop/models/warehouse/_schema.yml @@ -1,9 +1,10 @@ version: 2 models: - - name: customers - description: This table has basic information about a customer, as well as some derived facts based on a customer's orders - + - name: wh_customers + description: | + This table has basic information about a customer, as well as some derived facts based on a + customer's orders columns: - name: customer_id description: This is a unique identifier for a customer @@ -29,9 +30,9 @@ models: - name: total_order_amount description: Total value (AUD) of a customer's orders - - name: orders - description: This table has basic information about orders, as well as some derived facts based on payments - + - name: wh_orders + description: | + This table has basic information about orders, as well as some derived facts based on payments columns: - name: order_id tests: diff --git a/jaffle_shop/models/docs.md b/jaffle_shop/models/warehouse/docs.md similarity index 100% rename from jaffle_shop/models/docs.md rename to jaffle_shop/models/warehouse/docs.md diff --git a/jaffle_shop/models/customers.sql b/jaffle_shop/models/warehouse/wh_customers.sql similarity index 100% rename from jaffle_shop/models/customers.sql rename to jaffle_shop/models/warehouse/wh_customers.sql diff --git a/jaffle_shop/models/orders.sql b/jaffle_shop/models/warehouse/wh_orders.sql similarity index 100% rename from jaffle_shop/models/orders.sql rename to jaffle_shop/models/warehouse/wh_orders.sql diff --git a/jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv b/jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv new file mode 100644 index 000000000..cdc91af45 --- /dev/null +++ b/jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv @@ -0,0 +1,2 @@ +fct_name, column_name, id_to_exclude, comment +fct_staging_dependent_on_staging, parent, stg_customers_pii, Scrubbing pii permitted in staging layer. \ No newline at end of file From cdc8a52fa887c4d29387077e0c49590a9e0e1bc5 Mon Sep 17 00:00:00 2001 From: Kensuke Morris <56285518+kensukemorris@users.noreply.github.com> Date: Sun, 12 Nov 2023 17:21:24 +0900 Subject: [PATCH 11/13] New models Finance - Total value of orders returned by customer Sales - The customer count by month for customers making their first order --- jaffle_shop/models/final/finance/_schema.yml | 15 +++++++++++++++ .../final/finance/fnl_returned_order_value.sql | 18 ++++++++++++++++++ jaffle_shop/models/final/sales/_schema.yml | 15 +++++++++++++++ .../final/sales/fnl_monthly_customer_count.sql | 12 ++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 jaffle_shop/models/final/finance/_schema.yml create mode 100644 jaffle_shop/models/final/finance/fnl_returned_order_value.sql create mode 100644 jaffle_shop/models/final/sales/_schema.yml create mode 100644 jaffle_shop/models/final/sales/fnl_monthly_customer_count.sql diff --git a/jaffle_shop/models/final/finance/_schema.yml b/jaffle_shop/models/final/finance/_schema.yml new file mode 100644 index 000000000..3649b5660 --- /dev/null +++ b/jaffle_shop/models/final/finance/_schema.yml @@ -0,0 +1,15 @@ +version: 2 + +models: + name: fnl_returned_order_value + meta: + owner: kensuke.morris@octoenergy.com + description: | + One row per total value of returned orders per customer + columns: + - name: customer_id + description: Primary key + tests: + - unique + - not_null + \ No newline at end of file diff --git a/jaffle_shop/models/final/finance/fnl_returned_order_value.sql b/jaffle_shop/models/final/finance/fnl_returned_order_value.sql new file mode 100644 index 000000000..d5e31dffa --- /dev/null +++ b/jaffle_shop/models/final/finance/fnl_returned_order_value.sql @@ -0,0 +1,18 @@ +WITH returned_orders AS ( + SELECT * + FROM {{ ref('wh_orders') }} + WHERE status = 'returned' +) + +customers AS ( + SELECT * + FROM {{ref('stg_customers') }} +) + +SELECT + customer_id + , SUM(COALESCE(total_amount, 0) AS total_value +FROM returned_orders +LEFT JOIN customers + ON returned_orders.customer_id = customers.customer_id +GROUP BY customer_id diff --git a/jaffle_shop/models/final/sales/_schema.yml b/jaffle_shop/models/final/sales/_schema.yml new file mode 100644 index 000000000..f00d49e9e --- /dev/null +++ b/jaffle_shop/models/final/sales/_schema.yml @@ -0,0 +1,15 @@ +version: 2 + +models: + name: fnl_monthly_customer_count + meta: + owner: kensuke.morris@octoenergy.com + description: | + One row per customer count for each month based on their first orders. + columns: + - name: first_order_month + description: Primary key + tests: + - unique + - not_null + \ No newline at end of file diff --git a/jaffle_shop/models/final/sales/fnl_monthly_customer_count.sql b/jaffle_shop/models/final/sales/fnl_monthly_customer_count.sql new file mode 100644 index 000000000..b2dde845e --- /dev/null +++ b/jaffle_shop/models/final/sales/fnl_monthly_customer_count.sql @@ -0,0 +1,12 @@ +WITH customer_orders AS ( + SELECT + customer_id + , DATE_FORMAT(first_order, 'MMMM') As order_month + FROM {{ ref('wh_customers') }} +) + +SELECT + first_order AS first_order_month + , COUNT(*) AS customer_count +FROM customer_orders +GROUP BY first_order From 0e2df176ffdb31aa99e4a8c6e32314a554b417f6 Mon Sep 17 00:00:00 2001 From: Kensuke Morris <56285518+kensukemorris@users.noreply.github.com> Date: Sat, 25 Nov 2023 12:31:24 +0900 Subject: [PATCH 12/13] Changed _schema to _models --- jaffle_shop/models/final/finance/{_schema.yml => _models.yml} | 0 jaffle_shop/models/final/sales/{_schema.yml => _models.yml} | 0 .../models/staging/src_seed/{_schema.yml => _models.yml} | 0 .../staging/src_seed/sensitive/{_schema.yml => _models.yml} | 0 jaffle_shop/models/staging/src_seed/stg_customers.sql | 2 +- jaffle_shop/models/warehouse/{_schema.yml => _models.yml} | 1 - jaffle_shop/models/warehouse/wh_customers.sql | 3 +-- 7 files changed, 2 insertions(+), 4 deletions(-) rename jaffle_shop/models/final/finance/{_schema.yml => _models.yml} (100%) rename jaffle_shop/models/final/sales/{_schema.yml => _models.yml} (100%) rename jaffle_shop/models/staging/src_seed/{_schema.yml => _models.yml} (100%) rename jaffle_shop/models/staging/src_seed/sensitive/{_schema.yml => _models.yml} (100%) rename jaffle_shop/models/warehouse/{_schema.yml => _models.yml} (99%) diff --git a/jaffle_shop/models/final/finance/_schema.yml b/jaffle_shop/models/final/finance/_models.yml similarity index 100% rename from jaffle_shop/models/final/finance/_schema.yml rename to jaffle_shop/models/final/finance/_models.yml diff --git a/jaffle_shop/models/final/sales/_schema.yml b/jaffle_shop/models/final/sales/_models.yml similarity index 100% rename from jaffle_shop/models/final/sales/_schema.yml rename to jaffle_shop/models/final/sales/_models.yml diff --git a/jaffle_shop/models/staging/src_seed/_schema.yml b/jaffle_shop/models/staging/src_seed/_models.yml similarity index 100% rename from jaffle_shop/models/staging/src_seed/_schema.yml rename to jaffle_shop/models/staging/src_seed/_models.yml diff --git a/jaffle_shop/models/staging/src_seed/sensitive/_schema.yml b/jaffle_shop/models/staging/src_seed/sensitive/_models.yml similarity index 100% rename from jaffle_shop/models/staging/src_seed/sensitive/_schema.yml rename to jaffle_shop/models/staging/src_seed/sensitive/_models.yml diff --git a/jaffle_shop/models/staging/src_seed/stg_customers.sql b/jaffle_shop/models/staging/src_seed/stg_customers.sql index 677dcbd75..10d890218 100644 --- a/jaffle_shop/models/staging/src_seed/stg_customers.sql +++ b/jaffle_shop/models/staging/src_seed/stg_customers.sql @@ -1,3 +1,3 @@ SELECT {{ hash_sensitive_columns('stg_customers_pii') }} -FROM {{ ref('stg_customers_pii') }} \ No newline at end of file +FROM {{ ref('stg_customers_pii') }} diff --git a/jaffle_shop/models/warehouse/_schema.yml b/jaffle_shop/models/warehouse/_models.yml similarity index 99% rename from jaffle_shop/models/warehouse/_schema.yml rename to jaffle_shop/models/warehouse/_models.yml index c3dab97c8..31ce9cae8 100644 --- a/jaffle_shop/models/warehouse/_schema.yml +++ b/jaffle_shop/models/warehouse/_models.yml @@ -11,7 +11,6 @@ models: tests: - unique - not_null - - name: first_name description: Customer's first name. PII. diff --git a/jaffle_shop/models/warehouse/wh_customers.sql b/jaffle_shop/models/warehouse/wh_customers.sql index 016a004fe..4c38cd189 100644 --- a/jaffle_shop/models/warehouse/wh_customers.sql +++ b/jaffle_shop/models/warehouse/wh_customers.sql @@ -1,6 +1,6 @@ with customers as ( - select * from {{ ref('stg_customers') }} + select * from {{ ref('stg_customers_pii') }} ), @@ -20,7 +20,6 @@ customer_orders as ( select customer_id, - min(order_date) as first_order, max(order_date) as most_recent_order, count(order_id) as number_of_orders From 54103376b02751fc1e73a96e21e221ba57fd1422 Mon Sep 17 00:00:00 2001 From: Kensuke Morris <56285518+kensukemorris@users.noreply.github.com> Date: Wed, 6 Dec 2023 12:06:43 +0900 Subject: [PATCH 13/13] Exclude files from commit --- .gitignore | 6 +++ Pipfile.lock | 121 +++++++++++---------------------------------------- 2 files changed, 31 insertions(+), 96 deletions(-) diff --git a/.gitignore b/.gitignore index 2d9126631..76c7f99d5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,16 @@ target/ dbt_modules/ dbt_packages/ logs/ +testing/ +package_projects/ **/.DS_Store .env +packages.yml +selectors.yml + # Python temp files *.pyc __pycache__ +Pipfile.lock diff --git a/Pipfile.lock b/Pipfile.lock index b26c30d19..ef7f5da94 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -23,14 +23,6 @@ ], "version": "==1.6.3" }, - "alembic": { - "hashes": [ - "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb", - "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.12.1" - }, "attrs": { "hashes": [ "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", @@ -49,11 +41,11 @@ }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "cffi": { "hashes": [ @@ -227,11 +219,11 @@ }, "databricks-sql-connector": { "hashes": [ - "sha256:09a1686de3470091e78640de276053d4e18f8c03ba3627ed45b368f78bf87db9", - "sha256:e37b5aa8bea22e84a9920e87ad9ba6cafbe656008c180a790baa53b711dd9889" + "sha256:3824237732f4363f55e3a1b8dd90ac98b8008c66e869377c8a213581d13dcee2", + "sha256:915648d5d43e41622d65446bf60c07b2a0d33f9e5ad03478712205703927fdb8" ], - "markers": "python_full_version >= '3.7.1' and python_full_version < '4.0.0'", - "version": "==2.9.3" + "markers": "python_full_version >= '3.8.0' and python_full_version < '4.0.0'", + "version": "==3.0.1" }, "dbt-core": { "hashes": [ @@ -292,11 +284,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", - "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" ], "markers": "python_version < '3.11'", - "version": "==1.1.3" + "version": "==1.2.0" }, "future": { "hashes": [ @@ -321,27 +313,11 @@ }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" - }, - "importlib-metadata": { - "hashes": [ - "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", - "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743" - ], - "markers": "python_version < '3.9'", - "version": "==6.8.0" - }, - "importlib-resources": { - "hashes": [ - "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a", - "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6" - ], - "markers": "python_version < '3.9'", - "version": "==6.1.1" + "version": "==3.6" }, "iniconfig": { "hashes": [ @@ -435,14 +411,6 @@ "markers": "python_version >= '3.7'", "version": "==4.3.2" }, - "mako": { - "hashes": [ - "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9", - "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b" - ], - "markers": "python_version >= '3.8'", - "version": "==1.3.0" - }, "markupsafe": { "hashes": [ "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", @@ -626,7 +594,7 @@ "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9" ], - "markers": "python_version < '3.11' and python_version >= '3.7'", + "markers": "python_version < '3.11' and python_version >= '3.8'", "version": "==1.24.4" }, "oauthlib": { @@ -746,7 +714,7 @@ "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27", "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226" ], - "markers": "python_version < '3.11' and python_version >= '3.7'", + "markers": "python_version >= '3.8'", "version": "==14.0.1" }, "pycparser": { @@ -915,11 +883,11 @@ }, "setuptools": { "hashes": [ - "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", - "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" + "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", + "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" ], "markers": "python_version >= '3.8'", - "version": "==68.2.2" + "version": "==69.0.2" }, "six": { "hashes": [ @@ -929,37 +897,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "sqlalchemy": { - "hashes": [ - "sha256:0b7dbe6369677a2bea68fe9812c6e4bbca06ebfa4b5cde257b2b0bf208709131", - "sha256:128a948bd40780667114b0297e2cc6d657b71effa942e0a368d8cc24293febb3", - "sha256:14b0cacdc8a4759a1e1bd47dc3ee3f5db997129eb091330beda1da5a0e9e5bd7", - "sha256:1fb9cb60e0f33040e4f4681e6658a7eb03b5cb4643284172f91410d8c493dace", - "sha256:273505fcad22e58cc67329cefab2e436006fc68e3c5423056ee0513e6523268a", - "sha256:2e70e0673d7d12fa6cd363453a0d22dac0d9978500aa6b46aa96e22690a55eab", - "sha256:34e1c5d9cd3e6bf3d1ce56971c62a40c06bfc02861728f368dcfec8aeedb2814", - "sha256:3b97ddf509fc21e10b09403b5219b06c5b558b27fc2453150274fa4e70707dbf", - "sha256:3f6997da81114daef9203d30aabfa6b218a577fc2bd797c795c9c88c9eb78d49", - "sha256:82dd4131d88395df7c318eeeef367ec768c2a6fe5bd69423f7720c4edb79473c", - "sha256:85292ff52ddf85a39367057c3d7968a12ee1fb84565331a36a8fead346f08796", - "sha256:8a7a66297e46f85a04d68981917c75723e377d2e0599d15fbe7a56abed5e2d75", - "sha256:8b881ac07d15fb3e4f68c5a67aa5cdaf9eb8f09eb5545aaf4b0a5f5f4659be18", - "sha256:a3257a6e09626d32b28a0c5b4f1a97bced585e319cfa90b417f9ab0f6145c33c", - "sha256:a9bddb60566dc45c57fd0a5e14dd2d9e5f106d2241e0a2dc0c1da144f9444516", - "sha256:bdb77e1789e7596b77fd48d99ec1d2108c3349abd20227eea0d48d3f8cf398d9", - "sha256:c1db0221cb26d66294f4ca18c533e427211673ab86c1fbaca8d6d9ff78654293", - "sha256:c4cb501d585aa74a0f86d0ea6263b9c5e1d1463f8f9071392477fd401bd3c7cc", - "sha256:d00665725063692c42badfd521d0c4392e83c6c826795d38eb88fb108e5660e5", - "sha256:d0fed0f791d78e7767c2db28d34068649dfeea027b83ed18c45a423f741425cb", - "sha256:d69738d582e3a24125f0c246ed8d712b03bd21e148268421e4a4d09c34f521a5", - "sha256:db4db3c08ffbb18582f856545f058a7a5e4ab6f17f75795ca90b3c38ee0a8ba4", - "sha256:f1fcee5a2c859eecb4ed179edac5ffbc7c84ab09a5420219078ccc6edda45436", - "sha256:f2d526aeea1bd6a442abc7c9b4b00386fd70253b80d54a0930c0a216230a35be", - "sha256:fbaf6643a604aa17e7a7afd74f665f9db882df5c297bdd86c38368f2c471f37d" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.4.50" - }, "sqlparams": { "hashes": [ "sha256:1abe87a0684567265b2b86f5a482d5c37db237c0268d4c81774ffedce4300199", @@ -1015,11 +952,11 @@ }, "urllib3": { "hashes": [ - "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", - "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e" + "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", + "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54" ], - "markers": "python_version >= '3.7'", - "version": "==2.0.7" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "werkzeug": { "hashes": [ @@ -1028,24 +965,16 @@ ], "markers": "python_version >= '3.8'", "version": "==2.3.8" - }, - "zipp": { - "hashes": [ - "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", - "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" - ], - "markers": "python_version >= '3.8'", - "version": "==3.17.0" } }, "develop": { "exceptiongroup": { "hashes": [ - "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", - "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" ], "markers": "python_version < '3.11'", - "version": "==1.1.3" + "version": "==1.2.0" }, "iniconfig": { "hashes": [