├── .gitignore ├── README.md ├── airflow ├── dags │ ├── __pycache__ │ │ └── ingest_data.cpython-37.pyc │ └── ingest_data.py └── docker-compose.yaml ├── dbtproject ├── .gitignore ├── README.md ├── analyses │ └── .gitkeep ├── dbt_project.yml ├── macros │ └── .gitkeep ├── models │ └── staging │ │ ├── schema.yml │ │ ├── stg_green_data.sql │ │ └── stg_yellow_data.sql ├── packages.yml ├── seeds │ └── .gitkeep ├── snapshots │ └── .gitkeep └── tests │ └── .gitkeep ├── end_to_end_data_engineering └── __init__.py ├── imagens ├── airflow.png ├── airflow_exec.png ├── arquitetura.png ├── bigquery.png ├── gcs-print.png ├── gcs.png └── modelo.png ├── instrucoes ├── conclusao.md ├── dags.md ├── dbt.md ├── destroy.md ├── docker_airflow.md ├── google-cloud.md ├── poetry.md └── terraform.md ├── poetry.lock ├── pyproject.toml ├── terraform ├── main.tf ├── terraform.tfstate.backup └── variable.tf └── tests └── __init__.py /.gitignore: -------------------------------------------------------------------------------- 1 | .venv 2 | .env 3 | terraform/.terraform 4 | terraform/.terraform.lock.hcl 5 | terraform/terraform.tfstate 6 | airflow/logs 7 | airflow/plugins 8 | logs -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # end_to_end-Data-Engineering 2 | 3 | Este repositório tem como objetivo apresentar um exemplo de um pipeline de dados, utilizando as ferramentas mais atuais do mercado. 4 | 5 | Com esse projeto end-to-end, você terá acesso a uma ampla gama de ferramentas que estão em extrema alta em vagas para engenheiros de dados. Então, se você está procurando um projeto para iniciar ou aumentar seu portifólio e aprender ferramentas novas, este repositório é o lugar certo para começar. 6 | 7 | Não iremos nos aprofundar em nenhuma ferramenta específica aqui, mas sim dar overview de como elas funcionam e se integram entre si. 8 | 9 | # Motivação 10 | 11 | A motivação para construir esse projeto, é para fornecer uma boa oportunidade para desenvolver habilidades e experiência em uma variedade de ferramentas. Como tal, o projeto é mais complexo do que o necessário, utilizando dbt, airflow, docker e armazenamento em nuvem. 12 | 13 | # Arquitetura 14 | 15 | ![Arquitetura](imagens/arquitetura.png) 16 | 17 | # Etapas para construção 18 | 19 | 1. [Poetry](instrucoes/poetry.md) 20 | 2. [Google Cloud](instrucoes/google-cloud.md) 21 | 3. [Terraform](instrucoes/terraform.md) 22 | 4. [Airflow](instrucoes/docker_airflow.md) 23 | 5. [dags](instrucoes/dags.md) 24 | 6. [dbt](instrucoes/dbt.md) 25 | 7. [Excluindo recursos](instrucoes/destroy.md) 26 | 8. [Conclusão](instrucoes/conclusao.md) 27 | -------------------------------------------------------------------------------- /airflow/dags/__pycache__/ingest_data.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/airflow/dags/__pycache__/ingest_data.cpython-37.pyc -------------------------------------------------------------------------------- /airflow/dags/ingest_data.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import os 3 | from airflow.contrib.operators.file_to_gcs import FileToGoogleCloudStorageOperator 4 | from airflow.providers.google.cloud.transfers.gcs_to_bigquery import ( 5 | GCSToBigQueryOperator, 6 | ) 7 | from airflow import DAG 8 | from airflow.operators.bash import BashOperator 9 | 10 | 11 | PATH_TO_LOCAL_HOME = os.environ.get("AIRFLOW_HOME", "/opt/airflow") 12 | 13 | URL_SUFIX_YELLOW = "/yellow_tripdata_2022-{{ execution_date.strftime('%m') }}.parquet" 14 | URL_SUFIX_GREEN = "/green_tripdata_2022-{{ execution_date.strftime('%m') }}.parquet" 15 | URL_PREFIX = "https://d37ci6vzurychx.cloudfront.net/trip-data" 16 | 17 | URL_YELLOW = URL_PREFIX + URL_SUFIX_YELLOW 18 | URL_GREEN = URL_PREFIX + URL_SUFIX_GREEN 19 | 20 | with DAG( 21 | "ingest", 22 | 23 | default_args={ 24 | "depends_on_past": False, 25 | "email": ["airflow@example.com"], 26 | "email_on_failure": False, 27 | "email_on_retry": False, 28 | "retries": 1, 29 | "retry_delay": timedelta(minutes=5), 30 | }, 31 | 32 | description="A simple tutorial DAG", 33 | schedule=timedelta(days=30), 34 | start_date=datetime(2021, 1, 1), 35 | catchup=False, 36 | tags=["example"], 37 | ) as dag: 38 | 39 | t1 = BashOperator( 40 | task_id="wget_yellow_tripdata", 41 | bash_command=f"curl -sSl {URL_YELLOW} > {PATH_TO_LOCAL_HOME}/output-yellow.parquet", 42 | ) 43 | 44 | t2 = BashOperator( 45 | task_id="wget_green_tripdata", 46 | bash_command=f"curl -sSl {URL_GREEN} > {PATH_TO_LOCAL_HOME}/output-green.parquet", 47 | ) 48 | 49 | t3 = FileToGoogleCloudStorageOperator( 50 | task_id="LocalToGCS-yellow", 51 | src=f"{PATH_TO_LOCAL_HOME}/output-yellow.parquet", 52 | dst="data/raw_data_yellow.parquet", 53 | bucket="dtc_data_lake_allspark-377318", 54 | ) 55 | 56 | t4 = FileToGoogleCloudStorageOperator( 57 | task_id="LocalToGCS-green", 58 | src=f"{PATH_TO_LOCAL_HOME}/output-green.parquet", 59 | dst="data/raw_data_green.parquet", 60 | bucket="dtc_data_lake_allspark-377318", 61 | ) 62 | 63 | 64 | t5 = GCSToBigQueryOperator( 65 | task_id="GCS_to_BigQuery-yellow", 66 | bucket="dtc_data_lake_allspark-377318", 67 | source_objects=["data/raw_data_yellow.parquet"], 68 | destination_project_dataset_table="allspark-377318:raw_data.trips_yellow", 69 | write_disposition="WRITE_TRUNCATE", 70 | source_format="PARQUET", 71 | allow_quoted_newlines=True, 72 | skip_leading_rows=1, 73 | ) 74 | 75 | 76 | t6 = GCSToBigQueryOperator( 77 | task_id="GCS_to_BigQuery-green", 78 | bucket="dtc_data_lake_allspark-377318", 79 | source_objects=["data/raw_data_green.parquet"], 80 | destination_project_dataset_table="allspark-377318:raw_data.trips_green", 81 | write_disposition="WRITE_TRUNCATE", 82 | source_format="PARQUET", 83 | allow_quoted_newlines=True, 84 | skip_leading_rows=1, 85 | ) 86 | 87 | 88 | t1 >> t2 >> [t3, t4] >> t5 >> t6 89 | -------------------------------------------------------------------------------- /airflow/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, 12 | # software distributed under the License is distributed on an 13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 | # KIND, either express or implied. See the License for the 15 | # specific language governing permissions and limitations 16 | # under the License. 17 | # 18 | 19 | # Basic Airflow cluster configuration for CeleryExecutor with Redis and PostgreSQL. 20 | # 21 | # WARNING: This configuration is for local development. Do not use it in a production deployment. 22 | # 23 | # This configuration supports basic configuration using environment variables or an .env file 24 | # The following variables are supported: 25 | # 26 | # AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow. 27 | # Default: apache/airflow:2.5.1 28 | # AIRFLOW_UID - User ID in Airflow containers 29 | # Default: 50000 30 | # AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed. 31 | # Default: . 32 | # Those configurations are useful mostly in case of standalone testing/running Airflow in test/try-out mode 33 | # 34 | # _AIRFLOW_WWW_USER_USERNAME - Username for the administrator account (if requested). 35 | # Default: airflow 36 | # _AIRFLOW_WWW_USER_PASSWORD - Password for the administrator account (if requested). 37 | # Default: airflow 38 | # _PIP_ADDITIONAL_REQUIREMENTS - Additional PIP requirements to add when starting all containers. 39 | # Default: '' 40 | # 41 | # Feel free to modify this file to suit your needs. 42 | --- 43 | version: '3' 44 | x-airflow-common: 45 | &airflow-common 46 | # In order to add custom dependencies or upgrade provider packages you can use your extended image. 47 | # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml 48 | # and uncomment the "build" line below, Then run `docker-compose build` to build the images. 49 | image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.5.1} 50 | # build: . 51 | environment: 52 | &airflow-common-env 53 | AIRFLOW__CORE__EXECUTOR: CeleryExecutor 54 | AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow 55 | # For backward compatibility, with Airflow <2.3 56 | AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow 57 | AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow 58 | AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0 59 | AIRFLOW__CORE__FERNET_KEY: '' 60 | AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true' 61 | AIRFLOW__CORE__LOAD_EXAMPLES: 'true' 62 | AIRFLOW__API__AUTH_BACKENDS: 'airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session' 63 | _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} 64 | volumes: 65 | - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags 66 | - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs 67 | - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins 68 | user: "${AIRFLOW_UID:-50000}:0" 69 | depends_on: 70 | &airflow-common-depends-on 71 | redis: 72 | condition: service_healthy 73 | postgres: 74 | condition: service_healthy 75 | 76 | services: 77 | postgres: 78 | image: postgres:13 79 | environment: 80 | POSTGRES_USER: airflow 81 | POSTGRES_PASSWORD: airflow 82 | POSTGRES_DB: airflow 83 | volumes: 84 | - postgres-db-volume:/var/lib/postgresql/data 85 | healthcheck: 86 | test: ["CMD", "pg_isready", "-U", "airflow"] 87 | interval: 5s 88 | retries: 5 89 | restart: always 90 | 91 | redis: 92 | image: redis:latest 93 | expose: 94 | - 6379 95 | healthcheck: 96 | test: ["CMD", "redis-cli", "ping"] 97 | interval: 5s 98 | timeout: 30s 99 | retries: 50 100 | restart: always 101 | 102 | airflow-webserver: 103 | <<: *airflow-common 104 | command: webserver 105 | ports: 106 | - 8080:8080 107 | healthcheck: 108 | test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] 109 | interval: 10s 110 | timeout: 10s 111 | retries: 5 112 | restart: always 113 | depends_on: 114 | <<: *airflow-common-depends-on 115 | airflow-init: 116 | condition: service_completed_successfully 117 | 118 | airflow-scheduler: 119 | <<: *airflow-common 120 | command: scheduler 121 | healthcheck: 122 | test: ["CMD-SHELL", 'airflow jobs check --job-type SchedulerJob --hostname "$${HOSTNAME}"'] 123 | interval: 10s 124 | timeout: 10s 125 | retries: 5 126 | restart: always 127 | depends_on: 128 | <<: *airflow-common-depends-on 129 | airflow-init: 130 | condition: service_completed_successfully 131 | 132 | airflow-worker: 133 | <<: *airflow-common 134 | command: celery worker 135 | healthcheck: 136 | test: 137 | - "CMD-SHELL" 138 | - 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"' 139 | interval: 10s 140 | timeout: 10s 141 | retries: 5 142 | environment: 143 | <<: *airflow-common-env 144 | # Required to handle warm shutdown of the celery workers properly 145 | # See https://airflow.apache.org/docs/docker-stack/entrypoint.html#signal-propagation 146 | DUMB_INIT_SETSID: "0" 147 | restart: always 148 | depends_on: 149 | <<: *airflow-common-depends-on 150 | airflow-init: 151 | condition: service_completed_successfully 152 | 153 | airflow-triggerer: 154 | <<: *airflow-common 155 | command: triggerer 156 | healthcheck: 157 | test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"'] 158 | interval: 10s 159 | timeout: 10s 160 | retries: 5 161 | restart: always 162 | depends_on: 163 | <<: *airflow-common-depends-on 164 | airflow-init: 165 | condition: service_completed_successfully 166 | 167 | airflow-init: 168 | <<: *airflow-common 169 | entrypoint: /bin/bash 170 | # yamllint disable rule:line-length 171 | command: 172 | - -c 173 | - | 174 | function ver() { 175 | printf "%04d%04d%04d%04d" $${1//./ } 176 | } 177 | airflow_version=$$(AIRFLOW__LOGGING__LOGGING_LEVEL=INFO && gosu airflow airflow version) 178 | airflow_version_comparable=$$(ver $${airflow_version}) 179 | min_airflow_version=2.2.0 180 | min_airflow_version_comparable=$$(ver $${min_airflow_version}) 181 | if (( airflow_version_comparable < min_airflow_version_comparable )); then 182 | echo 183 | echo -e "\033[1;31mERROR!!!: Too old Airflow version $${airflow_version}!\e[0m" 184 | echo "The minimum Airflow version supported: $${min_airflow_version}. Only use this or higher!" 185 | echo 186 | exit 1 187 | fi 188 | if [[ -z "${AIRFLOW_UID}" ]]; then 189 | echo 190 | echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m" 191 | echo "If you are on Linux, you SHOULD follow the instructions below to set " 192 | echo "AIRFLOW_UID environment variable, otherwise files will be owned by root." 193 | echo "For other operating systems you can get rid of the warning with manually created .env file:" 194 | echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user" 195 | echo 196 | fi 197 | one_meg=1048576 198 | mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg)) 199 | cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat) 200 | disk_available=$$(df / | tail -1 | awk '{print $$4}') 201 | warning_resources="false" 202 | if (( mem_available < 4000 )) ; then 203 | echo 204 | echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m" 205 | echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))" 206 | echo 207 | warning_resources="true" 208 | fi 209 | if (( cpus_available < 2 )); then 210 | echo 211 | echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m" 212 | echo "At least 2 CPUs recommended. You have $${cpus_available}" 213 | echo 214 | warning_resources="true" 215 | fi 216 | if (( disk_available < one_meg * 10 )); then 217 | echo 218 | echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m" 219 | echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))" 220 | echo 221 | warning_resources="true" 222 | fi 223 | if [[ $${warning_resources} == "true" ]]; then 224 | echo 225 | echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m" 226 | echo "Please follow the instructions to increase amount of resources available:" 227 | echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin" 228 | echo 229 | fi 230 | mkdir -p /sources/logs /sources/dags /sources/plugins 231 | chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins} 232 | exec /entrypoint airflow version 233 | # yamllint enable rule:line-length 234 | environment: 235 | <<: *airflow-common-env 236 | _AIRFLOW_DB_UPGRADE: 'true' 237 | _AIRFLOW_WWW_USER_CREATE: 'true' 238 | _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow} 239 | _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow} 240 | _PIP_ADDITIONAL_REQUIREMENTS: '' 241 | user: "0:0" 242 | volumes: 243 | - ${AIRFLOW_PROJ_DIR:-.}:/sources 244 | 245 | airflow-cli: 246 | <<: *airflow-common 247 | profiles: 248 | - debug 249 | environment: 250 | <<: *airflow-common-env 251 | CONNECTION_CHECK_MAX_COUNT: "0" 252 | # Workaround for entrypoint issue. See: https://github.com/apache/airflow/issues/16252 253 | command: 254 | - bash 255 | - -c 256 | - airflow 257 | 258 | # You can enable flower by adding "--profile flower" option e.g. docker-compose --profile flower up 259 | # or by explicitly targeted on the command line e.g. docker-compose up flower. 260 | # See: https://docs.docker.com/compose/profiles/ 261 | flower: 262 | <<: *airflow-common 263 | command: celery flower 264 | profiles: 265 | - flower 266 | ports: 267 | - 5555:5555 268 | healthcheck: 269 | test: ["CMD", "curl", "--fail", "http://localhost:5555/"] 270 | interval: 10s 271 | timeout: 10s 272 | retries: 5 273 | restart: always 274 | depends_on: 275 | <<: *airflow-common-depends-on 276 | airflow-init: 277 | condition: service_completed_successfully 278 | 279 | volumes: 280 | postgres-db-volume: 281 | -------------------------------------------------------------------------------- /dbtproject/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | target/ 3 | dbt_packages/ 4 | logs/ 5 | -------------------------------------------------------------------------------- /dbtproject/README.md: -------------------------------------------------------------------------------- 1 | Welcome to your new dbt project! 2 | 3 | ### Using the starter project 4 | 5 | Try running the following commands: 6 | - dbt run 7 | - dbt test 8 | 9 | 10 | ### Resources: 11 | - Learn more about dbt [in the docs](https://docs.getdbt.com/docs/introduction) 12 | - Check out [Discourse](https://discourse.getdbt.com/) for commonly asked questions and answers 13 | - Join the [chat](https://community.getdbt.com/) on Slack for live discussions and support 14 | - Find [dbt events](https://events.getdbt.com) near you 15 | - Check out [the blog](https://blog.getdbt.com/) for the latest news on dbt's development and best practices 16 | -------------------------------------------------------------------------------- /dbtproject/analyses/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/dbtproject/analyses/.gitkeep -------------------------------------------------------------------------------- /dbtproject/dbt_project.yml: -------------------------------------------------------------------------------- 1 | 2 | # Name your project! Project names should contain only lowercase characters 3 | # and underscores. A good package name should reflect your organization's 4 | # name or the intended use of these models 5 | name: 'dbtproject' 6 | version: '1.0.0' 7 | config-version: 2 8 | 9 | # This setting configures which "profile" dbt uses for this project. 10 | profile: 'dbtproject' 11 | 12 | # These configurations specify where dbt should look for different types of files. 13 | # The `model-paths` config, for example, states that models in this project can be 14 | # found in the "models/" directory. You probably won't need to change these! 15 | model-paths: ["models"] 16 | analysis-paths: ["analyses"] 17 | test-paths: ["tests"] 18 | seed-paths: ["seeds"] 19 | macro-paths: ["macros"] 20 | snapshot-paths: ["snapshots"] 21 | 22 | target-path: "target" # directory which will store compiled SQL files 23 | clean-targets: # directories to be removed by `dbt clean` 24 | - "target" 25 | - "dbt_packages" 26 | 27 | 28 | # Configuring models 29 | # Full documentation: https://docs.getdbt.com/docs/configuring-models 30 | 31 | # In this example config, we tell dbt to build all models in the example/ 32 | # directory as views. These settings can be overridden in the individual model 33 | # files using the `{{ config(...) }}` macro. 34 | models: 35 | dbtproject: 36 | # Config indicated by + and applies to all files under models/example/ 37 | example: 38 | +materialized: view 39 | -------------------------------------------------------------------------------- /dbtproject/macros/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/dbtproject/macros/.gitkeep -------------------------------------------------------------------------------- /dbtproject/models/staging/schema.yml: -------------------------------------------------------------------------------- 1 | 2 | version: 2 3 | 4 | sources: 5 | - name: raw_data 6 | 7 | tables: 8 | - name: trips_green 9 | - name: trips_yellow 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /dbtproject/models/staging/stg_green_data.sql: -------------------------------------------------------------------------------- 1 | {{ config(materialized='view') }} 2 | 3 | with tripdata as 4 | ( 5 | select *, 6 | row_number() over(partition by vendorid, lpep_pickup_datetime) as rn 7 | from {{ source('raw_data','trips_green') }} 8 | where vendorid is not null ) 9 | 10 | 11 | 12 | select 13 | {{ dbt_utils.surrogate_key(['vendorid', 'lpep_pickup_datetime', 'rn']) }} as id, 14 | lpep_pickup_datetime as pickup_datetime, 15 | lpep_dropoff_datetime as dropoff_datetime, 16 | from tripdata 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /dbtproject/models/staging/stg_yellow_data.sql: -------------------------------------------------------------------------------- 1 | {{ config(materialized='view') }} 2 | 3 | with tripdata as 4 | ( 5 | select *, 6 | row_number() over(partition by vendorid, tpep_pickup_datetime) as rn 7 | from {{ source('raw_data','trips_yellow') }} 8 | where vendorid is not null ) 9 | 10 | 11 | 12 | select 13 | {{ dbt_utils.surrogate_key(['vendorid', 'tpep_pickup_datetime', 'rn']) }} as id, 14 | tpep_pickup_datetime as pickup_datetime, 15 | tpep_dropoff_datetime as dropoff_datetime, 16 | from tripdata 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /dbtproject/packages.yml: -------------------------------------------------------------------------------- 1 | packages: 2 | - package: dbt-labs/dbt_utils 3 | version: 0.8.0 -------------------------------------------------------------------------------- /dbtproject/seeds/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/dbtproject/seeds/.gitkeep -------------------------------------------------------------------------------- /dbtproject/snapshots/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/dbtproject/snapshots/.gitkeep -------------------------------------------------------------------------------- /dbtproject/tests/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/dbtproject/tests/.gitkeep -------------------------------------------------------------------------------- /end_to_end_data_engineering/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/end_to_end_data_engineering/__init__.py -------------------------------------------------------------------------------- /imagens/airflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/imagens/airflow.png -------------------------------------------------------------------------------- /imagens/airflow_exec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/imagens/airflow_exec.png -------------------------------------------------------------------------------- /imagens/arquitetura.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/imagens/arquitetura.png -------------------------------------------------------------------------------- /imagens/bigquery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/imagens/bigquery.png -------------------------------------------------------------------------------- /imagens/gcs-print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/imagens/gcs-print.png -------------------------------------------------------------------------------- /imagens/gcs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/imagens/gcs.png -------------------------------------------------------------------------------- /imagens/modelo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/imagens/modelo.png -------------------------------------------------------------------------------- /instrucoes/conclusao.md: -------------------------------------------------------------------------------- 1 | # Concluindo 2 | 3 | ## O que aprendemos? 4 | 5 | Nesse projeto, aprendemos a utilizar diversas ferramentas que são muito utilizadas no mercado de trabalho. Aprendemos a utilizar o terraform para provisionar nossos recursos na nuvem, o airflow para criar nossos pipelines de dados, e o dbt para gerar nossos modelos de dados. 6 | 7 | ## O que podemos melhorar? 8 | 9 | Nesse projeto, utilizamos o Google Cloud para provisionar nossos recursos, porém, existem diversas outras nuvens que poderiamos utilizar, como a AWS, Azure, Digital Ocean, etc. Podemos utilizar essas outras nuvens para provisionar nossos recursos, e assim, aprender a utilizar essas outras nuvens. 10 | 11 | Algo que não foi abordado também nesse tutorial foram testes. Podemos testar toda a nossa pipeline inclusive os modelos de dados gerados pelo dbt. Fica como exercício para quando você for tentar replicar esse projeto, adicionar esses testes. 12 | 13 | ## O que podemos fazer com esse projeto? 14 | 15 | Com esse projeto, você pode utilizar para aprender mais sobre essas ferramentas, ou então, utilizar para adicionar no seu portifólio. 16 | 17 | ## Sobre o código final 18 | 19 | Tentei mostrar toda a construção passo a passo, porém o código final de cada etapa está nesse mesmo repositório, você pode acessar para confirmar se o que você está fazendo está correto. 20 | 21 | ## Obrigado! 22 | 23 | Espero que tenha gostado desse tutorial, e que tenha aprendido bastante. Se você tiver alguma dúvida, pode entrar em contato comigo pelo [LinkedIn](https://www.linkedin.com/in/eduardo-victor-machado-da-silva-141835192/). 24 | 25 | Se esse repositório foi útil para você, deixe uma estrela, isso ajuda bastante a alcançar mais pessoas que podem se beneficiar desse tutorial. 26 | -------------------------------------------------------------------------------- /instrucoes/dags.md: -------------------------------------------------------------------------------- 1 | # Dags 2 | 3 | Agora que seu airflow está configurado, vamos criar a dag que irá executar o nosso pipeline. 4 | 5 | Ao executar o comando `docker-compose up` o airflow já cria uma pasta chamada `dags` dentro do diretório `airflow` que é o local onde devemos colocar nossas dags. 6 | 7 | ## Entendendo o que precisamos fazer 8 | 9 | Para começar a criar nossa dag, vamos criar um arquivo chamado `ingest_data.py` dentro da pasta `dags`. 10 | 11 | Antes de começamos a codar, vamos entender o que precisamos fazer nesse arquivo. Precisamos fazer essas execuções na nossa pipeline: 12 | 13 | 1. Baixar os dados do site; 14 | 2. Fazer o upload dos dados para o GCS 15 | 3. Fazer o upload dos dados para o Bigquery 16 | 17 | Agora que entendemos o que precisamos fazer, vamos começar a codar. 18 | 19 | ## Construindo nossa dag 20 | 21 | Vamos começar importando as bibliotecas que vamos utilizar: 22 | 23 | ```python 24 | from datetime import datetime, timedelta 25 | import os 26 | from airflow.contrib.operators.file_to_gcs import FileToGoogleCloudStorageOperator 27 | from airflow.providers.google.cloud.transfers.gcs_to_bigquery import ( 28 | GCSToBigQueryOperator, 29 | ) 30 | from airflow import DAG 31 | from airflow.operators.bash import BashOperator 32 | ``` 33 | 34 | A primeira coisa que precisamos fazer é configurar os paramêtros, para isso vamos criar o seguinte código: 35 | 36 | ```python 37 | with DAG( 38 | "ingest", # Nome da dag 39 | 40 | default_args={ 41 | "depends_on_past": False, 42 | "email": ["airflow@example.com"], # Email que irá receber as notificações 43 | "email_on_failure": False, # Se quer receber notificação quando a dag falhar 44 | "email_on_retry": False, # Se quer receber notificação quando a dag for reexecutada 45 | "retries": 1, # Quantas vezes a dag irá ser reexecutada 46 | "retry_delay": timedelta(minutes=5), # Tempo entre as reexecuções 47 | }, 48 | 49 | description="Essa dag é responsável por extrair e carregar dados no bigquery", # Descrição da dag 50 | schedule=timedelta(days=30), # Frequência de execução da dag 51 | start_date=datetime(2021, 1, 1), # Data de início da dag 52 | catchup=False, # Se quer executar as tarefas que não foram executadas 53 | tags=["etl"], # Tags que podem ser utilizadas para filtrar as dags 54 | ) as dag: 55 | ``` 56 | 57 | Agora que já temos a dag configurada, vamos criar a nossa primeira tarefa. Essa tarefa será responsável por baixar os dados do site. 58 | 59 | ```python 60 | 61 | url_sufix = "/yellow_tripdata_2022-{{ execution_date.strftime('%m') }}.parquet" # Sufixo da url que será baixada 62 | url_prefix = "https://d37ci6vzurychx.cloudfront.net/trip-data" # Prefixo da url que será baixada 63 | path_to_local_home = os.environ.get("AIRFLOW_HOME", "/opt/airflow") # Caminho para o diretório onde será salvo o arquivo baixado 64 | 65 | t1 = BashOperator( 66 | task_id="wget", 67 | bash_command=f"curl -sSl {url} > {path_to_local_home}/output.parquet", 68 | ) 69 | ``` 70 | 71 | Iremos baixar os dados 2022, para isso vamos utilizar o `execution_date` que é uma variável que o airflow disponibiliza para nós. Essa variável é a data que a dag está sendo executada. Porém como o execution_date retorna o dia atual de execução (2023), queremos extrair apenas o mês para fazer a concatenação com a url. 72 | 73 | Agora que já temos a task que faz o download dos dados, vamos criar a tarefa que irá fazer o upload do arquivo para o GCS. 74 | 75 | ```python 76 | t2 = FileToGoogleCloudStorageOperator( 77 | task_id="upload_to_gcs", 78 | bucket="bucket_name", # Nome do bucket 79 | src=f"{path_to_local_home}/output.parquet", # Caminho do arquivo que será enviado 80 | dst="output.parquet", # Nome do arquivo que será enviado 81 | ) 82 | ``` 83 | 84 | Agora que já temos a task que faz o upload do arquivo para o GCS, vamos criar a tarefa que irá fazer o upload do arquivo para o Bigquery. 85 | 86 | ```python 87 | t3 = GCSToBigQueryOperator( 88 | task_id="upload_to_bigquery", 89 | bucket="bucket_name", # Nome do bucket 90 | source_objects=["output.parquet"], # Nome do arquivo que será enviado 91 | destination_project_dataset_table="dataset.table", # Nome do dataset e tabela que será criada 92 | source_format="PARQUET", # Formato do arquivo que será enviado 93 | skip_leading_rows=1, # Quantas linhas serão ignoradas 94 | write_disposition="WRITE_TRUNCATE", # Se quer sobrescrever os dados 95 | allow_quoted_newlines=True, # Se quer permitir quebra de linha 96 | ) 97 | 98 | ``` 99 | 100 | Agora que já temos todas as tasks criadas, vamos definir a ordem de execução das tasks. 101 | 102 | ```python 103 | t1 >> t2 >> t3 104 | ``` 105 | 106 | Agora que criamos nossa dag, e definimos a ordem de execução das tasks, vamos executar a dag. 107 | 108 | Para isso: 109 | 110 | 1. acesse o airflow em `http://localhost:8080/` e clique em `DAGs`. 111 | 2. Clique em `enable` na dag `ingest`. 112 | 3. Clique em `Trigger DAG` e selecione a data que você quer executar a dag. 113 | 4. Clique em `Trigger`. 114 | 5. Aguarde a execução da dag. 115 | 116 | E depois de alguns segundos você conseguirá ver se sua dag foi executada com sucesso. Se você seguiu todo esse tutorial passo a passo, você já deve ter um dataset no bigquery com os dados do site. Abaixo estarão as imagens de como ficou o resultado final. 117 | 118 | ![airflow-execution](/imagens/airflow-exec.png) 119 | 120 | Como deveria ficar o gcs: 121 | 122 | ![gcs](/imagens/gcs.png) 123 | 124 | Como deveria ficar no bigquery: 125 | 126 | ![bigquery](/imagens/bigquery.png) 127 | 128 | ## Atenção 129 | 130 | Foi ensinado aqui a baixar e fazer o carregamento dos dados da categoria `yellow` do site. Para fazer o carregamento dos dados da categoria `green` é necessário duplicar algumas partes, deixo como exercício para quem deseja fazer. De qualquer forma, o código final está no repositório. 131 | -------------------------------------------------------------------------------- /instrucoes/dbt.md: -------------------------------------------------------------------------------- 1 | # Dbt 2 | 3 | # Sobre o dbt 4 | 5 | dbt (data build tool) é uma ferramenta de transformação que fica no topo do nosso data warehouse. Com o dbt podemos fazer transformações de dados de forma estruturada e automatizada. O dbt fornece uma conta gratuita para desenvolvimento e testes. 6 | 7 | # Setup 8 | 9 | Existem 2 formas de configurar o dbt para o seu projeto: 10 | 11 | 1. Utilizando o dbt Cloud 12 | 2. Utilizando o dbt por via de linha de comando 13 | 14 | Neste tutorial vamos utilizar o dbt por via de linha de comando. 15 | 16 | ## Instalação 17 | 18 | Como vamos utilizar o dbt com o bigquery, vamos utilizar o dbt-bigquery. Para isso, dentro da raiz do projeto, execute o seguinte comando: 19 | 20 | ```bash 21 | poetry add dbt-bigquery 22 | ``` 23 | 24 | ## Configuração 25 | 26 | Com o dbt-bigquery instalado, basta agora iniciarmos um projeto dbt, para isso, execute o seguinte comando: 27 | 28 | ```bash 29 | dbt init [nome-do-projeto] 30 | ``` 31 | 32 | Ao executar o comando, você precisará informar o seu project_id, e fazer autenticar com o bigquery. 33 | 34 | Após executar o comando, será criado uma pasta com o nome do projeto que você passou como parâmetro. Dentro dessa pasta, você irá encontrar os seguintes arquivos: 35 | 36 | - `dbt_project.yml`: Arquivo de configuração do projeto 37 | - `profiles.yml`: Arquivo de configuração do bigquery 38 | - `README.md`: Arquivo de documentação do projeto 39 | - `schema.yml`: Arquivo de configuração do schema do projeto 40 | - `models`: Pasta onde ficam os arquivos de transformação 41 | - `seed`: Pasta onde ficam os arquivos de seed 42 | - `analysis`: Pasta onde ficam os arquivos de análise 43 | - `macros`: Pasta onde ficam os arquivos de macros 44 | - `snapshots`: Pasta onde ficam os arquivos de snapshots 45 | - `tests`: Pasta onde ficam os arquivos de testes 46 | 47 | Para entender um pouco mais sobre a estrutura do dbt, você pode acessar a documentação oficial do dbt [aqui](https://docs.getdbt.com/docs/building-a-dbt-project/building-models). 48 | 49 | ## Criando nossa transformação dbt 50 | 51 | Apague tudo que foi criado automaticamente dentro da pasta `models` e crie uma nova pasta dentro de `models` com o nome `staging`. Dentro dessa pasta construiremos nosso primeiro modelo. 52 | 53 | Crie agora um arquivo chamado `schema.yml` dentro da pasta `models/staging` e adicione o seguinte conteúdo: 54 | 55 | ```yml 56 | version: 2 57 | 58 | sources: 59 | - name: raw_data #nome do dataset no bigquery 60 | 61 | tables: 62 | - name: trips_yellow #nome da tabela no bigquery 63 | ``` 64 | 65 | Sempre para criar uma nova tabela no dbt, precisamos definir a origem desses dados. Nossos dados estão no dataset `raw_data` e as tabelas é a trips_yellow. Lembrando que isso foi definido nos arquivos terraform e na nossa dag do airflow, respectivamente. 66 | 67 | Agora que já definimos a fonte do nosso modelo, vamos finalmente criar ele. Ainda dentro da pasta staging, crie um arquivo chamado `stg_yellow_data.sql` os seguintes conteúdos: 68 | 69 | Para o dbt, primeiro precisamos definir o tipo de materialização do nosso modelo, para o nosso caso materializamos nossa tabela como uma view. Para isso, no nosso arquivo criado escreva: 70 | 71 | ```sql 72 | {{ config(materialized='view') }} 73 | ``` 74 | 75 | Agora vamos de fato efetuar as transformações. As transformações que vamos fazer são: 76 | 77 | 1. Remover os dados onde o `vendorid` é nulo 78 | 2. Criar a nossa chave primária 79 | 80 | Continuando nosso código, aplique o seguinte código: 81 | 82 | ```sql 83 | with tripdata as 84 | ( 85 | select *, 86 | row_number() over(partition by vendorid, tpep_pickup_datetime) as rn 87 | from {{ source('raw_data','trips_yellow') }} 88 | where vendorid is not null ) 89 | ``` 90 | 91 | E agora por fim vamos construir a nossa chave primária, para isso vou utilizar uma macro do próprio dbt, que é a `dbt_utils.surrogate_key`. Para isso, vamos adicionar o seguinte código: 92 | 93 | ```sql 94 | select 95 | {{ dbt_utils.surrogate_key(['vendorid', 'tpep_pickup_datetime', 'rn']) }} as id, 96 | tpep_pickup_datetime as pickup_datetime, 97 | tpep_dropoff_datetime as dropoff_datetime, 98 | from tripdata 99 | ``` 100 | 101 | Para o código funcionar, como estamos utilizando uma macro do dbt, precisamos importar o pacote `dbt_utils` no nosso projeto. Para isso, criar o arquivo `packages.yml` na raiz do projeto e adicionar o seguinte conteúdo: 102 | 103 | ```yml 104 | packages: 105 | - package: dbt-labs/dbt_utils 106 | version: 0.8.0 107 | ``` 108 | 109 | E agora tudo está pronto para executarmos o nosso modelo, para isso, execute o seguinte comando: 110 | 111 | ```bash 112 | dbt run 113 | ``` 114 | 115 | Se der tudo certo, você verá que o dbt criou uma view no bigquery com o nome `stg_yellow_data`. Para verificar, acesse o bigquery e verifique se a view foi criada. 116 | 117 | ![dbt view](/imagens/modelo.png) 118 | 119 | Deixo como atividade, se você extraiu os dados tbm da tabela `trips_green`, crie um modelo para essa tabela também. 120 | 121 | ## Importante 122 | 123 | O dbt é uma ferramenta muito poderosa, e com ela podemos fazer muitas coisas, como por exemplo, criar um modelo de dados de forma automatizada, criar testes automatizados, criar documentação automatizada, criar snapshots, entre outras coisas. Nesse repositório, não iremos abordar todas essas coisas, mas caso você queira aprender mais sobre o dbt, recomendo que você acesse a documentação oficial do dbt [aqui](https://docs.getdbt.com/docs/building-a-dbt-project/building-models). 124 | -------------------------------------------------------------------------------- /instrucoes/destroy.md: -------------------------------------------------------------------------------- 1 | # Terminando projeto 2 | 3 | Se você chegou até aqui, parabéns! Você finalizou o projeto! Agora você pode utilizar esse projeto para adicionar no seu portifólio, ou então, utilizar para aprender mais sobre essas ferramentas. Se você encontrou alguma dificuldade no código fornecido, ou algo que mudou, pode entrar em contato comigo e eu atualizo ou melhoro assim que possível. 4 | 5 | Como criarmos uma conta com plano gratuito e limitado na Google Cloud, precisamos encerrar os recursos que criamos para não sermos cobrados. Para isso, vamos utilizar o terraform para destruir os recursos que criamos. 6 | 7 | ## Encerrando recursos 8 | 9 | 1. Encerre os recursos da GCP executando o seguinte comando no diretório `terraform`: 10 | 11 | ``` 12 | terraform destroy 13 | ``` 14 | 15 | 2. Pare e exclua conteineres, exclua volumes de dados, para isso execute o seguinte comando no diretório `airflow`: 16 | 17 | ``` 18 | docker-compose down --volumes --rmi all 19 | ``` 20 | 21 | 3. O comando a seguir remove todos os contêineres interrompidos, todas as redes não usadas por pelo menos um contêiner, todas as imagens não utilizadas, todos os volumes e todo o cache de compilação pendente: 22 | 23 | ``` 24 | docker system prune -a --volumes 25 | ``` 26 | 27 | 4. Apague sua conta na GCP, para isso, acesse o [console da GCP](https://console.cloud.google.com/), clique no seu nome no canto superior direito, e clique em `Sair`. Após isso, clique em `Excluir conta` e siga as instruções. 28 | -------------------------------------------------------------------------------- /instrucoes/docker_airflow.md: -------------------------------------------------------------------------------- 1 | # Docker e Airflow 2 | 3 | Vamos executar nosso pipeline mensalmente, para fins de demonstração, embora isso possa ser alterado posteriormente. Todo mês, extrairemos os dados de taxi contidas no site da cidade de Nova York e os carregaremos no gcs. Para isso, vamos usar o Airflow. 4 | 5 | ## Airflow 6 | 7 | Para orquestrar isso, usaremos o Apache Airflow, que nos permite definir [DAGs](https://www.alura.com.br/artigos/airflow-entendendo-dags). Embora o Airflow seja um exagero em nosso caso, considere uma boa prática. Isso nos permitirá automatizar nossa extração e carregamento em nosso pipeline. 8 | 9 | ## Docker 10 | 11 | Outra ferramenta que usaremos é o Docker. Isso nos permite criar e manter 'containers'. Pense em um contêiner um pouco como um tipo especial de máquina virtual que, no nosso caso, inclui tudo o que precisamos para executar o Airflow, ignorando a necessidade de instalar uma carga de dependências. 12 | 13 | ## Vamos dar inicio a essa parte do nosso projeto 14 | 15 | ### Instalando o docker-compose e o docker 16 | 17 | Para instalar o docker-compose e o docker, basta seguir o tutorial do site oficial do [docker](https://docs.docker.com/compose/install/). 18 | 19 | ### Criando o arquivo docker-compose.yml 20 | 21 | Agora vamos criar o arquivo docker-compose.yml. Esse arquivo é responsável por definir os serviços que serão executados pelo docker-compose. No nosso caso, vamos definir o serviço do Airflow. 22 | 23 | Dentro da raiz do seu projeto, crie uma pasta chamada airflow. E dentro dessa pasta, crie um arquivo chamado docker-compose.yml. Dentro desse arquivo, vamos definir o serviço do Airflow. 24 | 25 | ```yml 26 | # Licensed to the Apache Software Foundation (ASF) under one 27 | # or more contributor license agreements. See the NOTICE file 28 | # distributed with this work for additional information 29 | # regarding copyright ownership. The ASF licenses this file 30 | # to you under the Apache License, Version 2.0 (the 31 | # "License"); you may not use this file except in compliance 32 | # with the License. You may obtain a copy of the License at 33 | # 34 | # http://www.apache.org/licenses/LICENSE-2.0 35 | # 36 | # Unless required by applicable law or agreed to in writing, 37 | # software distributed under the License is distributed on an 38 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 39 | # KIND, either express or implied. See the License for the 40 | # specific language governing permissions and limitations 41 | # under the License. 42 | # 43 | 44 | # Basic Airflow cluster configuration for CeleryExecutor with Redis and PostgreSQL. 45 | # 46 | # WARNING: This configuration is for local development. Do not use it in a production deployment. 47 | # 48 | # This configuration supports basic configuration using environment variables or an .env file 49 | # The following variables are supported: 50 | # 51 | # AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow. 52 | # Default: apache/airflow:2.5.1 53 | # AIRFLOW_UID - User ID in Airflow containers 54 | # Default: 50000 55 | # AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed. 56 | # Default: . 57 | # Those configurations are useful mostly in case of standalone testing/running Airflow in test/try-out mode 58 | # 59 | # _AIRFLOW_WWW_USER_USERNAME - Username for the administrator account (if requested). 60 | # Default: airflow 61 | # _AIRFLOW_WWW_USER_PASSWORD - Password for the administrator account (if requested). 62 | # Default: airflow 63 | # _PIP_ADDITIONAL_REQUIREMENTS - Additional PIP requirements to add when starting all containers. 64 | # Default: '' 65 | # 66 | # Feel free to modify this file to suit your needs. 67 | --- 68 | version: "3" 69 | x-airflow-common: &airflow-common 70 | # In order to add custom dependencies or upgrade provider packages you can use your extended image. 71 | # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml 72 | # and uncomment the "build" line below, Then run `docker-compose build` to build the images. 73 | image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.5.1} 74 | # build: . 75 | environment: &airflow-common-env 76 | AIRFLOW__CORE__EXECUTOR: CeleryExecutor 77 | AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow 78 | # For backward compatibility, with Airflow <2.3 79 | AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow 80 | AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow 81 | AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0 82 | AIRFLOW__CORE__FERNET_KEY: "" 83 | AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: "true" 84 | AIRFLOW__CORE__LOAD_EXAMPLES: "true" 85 | AIRFLOW__API__AUTH_BACKENDS: "airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session" 86 | _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} 87 | volumes: 88 | - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags 89 | - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs 90 | - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins 91 | user: "${AIRFLOW_UID:-50000}:0" 92 | depends_on: &airflow-common-depends-on 93 | redis: 94 | condition: service_healthy 95 | postgres: 96 | condition: service_healthy 97 | 98 | services: 99 | postgres: 100 | image: postgres:13 101 | environment: 102 | POSTGRES_USER: airflow 103 | POSTGRES_PASSWORD: airflow 104 | POSTGRES_DB: airflow 105 | volumes: 106 | - postgres-db-volume:/var/lib/postgresql/data 107 | healthcheck: 108 | test: ["CMD", "pg_isready", "-U", "airflow"] 109 | interval: 5s 110 | retries: 5 111 | restart: always 112 | 113 | redis: 114 | image: redis:latest 115 | expose: 116 | - 6379 117 | healthcheck: 118 | test: ["CMD", "redis-cli", "ping"] 119 | interval: 5s 120 | timeout: 30s 121 | retries: 50 122 | restart: always 123 | 124 | airflow-webserver: 125 | <<: *airflow-common 126 | command: webserver 127 | ports: 128 | - 8080:8080 129 | healthcheck: 130 | test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] 131 | interval: 10s 132 | timeout: 10s 133 | retries: 5 134 | restart: always 135 | depends_on: 136 | <<: *airflow-common-depends-on 137 | airflow-init: 138 | condition: service_completed_successfully 139 | 140 | airflow-scheduler: 141 | <<: *airflow-common 142 | command: scheduler 143 | healthcheck: 144 | test: 145 | [ 146 | "CMD-SHELL", 147 | 'airflow jobs check --job-type SchedulerJob --hostname "$${HOSTNAME}"', 148 | ] 149 | interval: 10s 150 | timeout: 10s 151 | retries: 5 152 | restart: always 153 | depends_on: 154 | <<: *airflow-common-depends-on 155 | airflow-init: 156 | condition: service_completed_successfully 157 | 158 | airflow-worker: 159 | <<: *airflow-common 160 | command: celery worker 161 | healthcheck: 162 | test: 163 | - "CMD-SHELL" 164 | - 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"' 165 | interval: 10s 166 | timeout: 10s 167 | retries: 5 168 | environment: 169 | <<: *airflow-common-env 170 | # Required to handle warm shutdown of the celery workers properly 171 | # See https://airflow.apache.org/docs/docker-stack/entrypoint.html#signal-propagation 172 | DUMB_INIT_SETSID: "0" 173 | restart: always 174 | depends_on: 175 | <<: *airflow-common-depends-on 176 | airflow-init: 177 | condition: service_completed_successfully 178 | 179 | airflow-triggerer: 180 | <<: *airflow-common 181 | command: triggerer 182 | healthcheck: 183 | test: 184 | [ 185 | "CMD-SHELL", 186 | 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"', 187 | ] 188 | interval: 10s 189 | timeout: 10s 190 | retries: 5 191 | restart: always 192 | depends_on: 193 | <<: *airflow-common-depends-on 194 | airflow-init: 195 | condition: service_completed_successfully 196 | 197 | airflow-init: 198 | <<: *airflow-common 199 | entrypoint: /bin/bash 200 | # yamllint disable rule:line-length 201 | command: 202 | - -c 203 | - | 204 | function ver() { 205 | printf "%04d%04d%04d%04d" $${1//./ } 206 | } 207 | airflow_version=$$(AIRFLOW__LOGGING__LOGGING_LEVEL=INFO && gosu airflow airflow version) 208 | airflow_version_comparable=$$(ver $${airflow_version}) 209 | min_airflow_version=2.2.0 210 | min_airflow_version_comparable=$$(ver $${min_airflow_version}) 211 | if (( airflow_version_comparable < min_airflow_version_comparable )); then 212 | echo 213 | echo -e "\033[1;31mERROR!!!: Too old Airflow version $${airflow_version}!\e[0m" 214 | echo "The minimum Airflow version supported: $${min_airflow_version}. Only use this or higher!" 215 | echo 216 | exit 1 217 | fi 218 | if [[ -z "${AIRFLOW_UID}" ]]; then 219 | echo 220 | echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m" 221 | echo "If you are on Linux, you SHOULD follow the instructions below to set " 222 | echo "AIRFLOW_UID environment variable, otherwise files will be owned by root." 223 | echo "For other operating systems you can get rid of the warning with manually created .env file:" 224 | echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user" 225 | echo 226 | fi 227 | one_meg=1048576 228 | mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg)) 229 | cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat) 230 | disk_available=$$(df / | tail -1 | awk '{print $$4}') 231 | warning_resources="false" 232 | if (( mem_available < 4000 )) ; then 233 | echo 234 | echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m" 235 | echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))" 236 | echo 237 | warning_resources="true" 238 | fi 239 | if (( cpus_available < 2 )); then 240 | echo 241 | echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m" 242 | echo "At least 2 CPUs recommended. You have $${cpus_available}" 243 | echo 244 | warning_resources="true" 245 | fi 246 | if (( disk_available < one_meg * 10 )); then 247 | echo 248 | echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m" 249 | echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))" 250 | echo 251 | warning_resources="true" 252 | fi 253 | if [[ $${warning_resources} == "true" ]]; then 254 | echo 255 | echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m" 256 | echo "Please follow the instructions to increase amount of resources available:" 257 | echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin" 258 | echo 259 | fi 260 | mkdir -p /sources/logs /sources/dags /sources/plugins 261 | chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins} 262 | exec /entrypoint airflow version 263 | # yamllint enable rule:line-length 264 | environment: 265 | <<: *airflow-common-env 266 | _AIRFLOW_DB_UPGRADE: "true" 267 | _AIRFLOW_WWW_USER_CREATE: "true" 268 | _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow} 269 | _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow} 270 | _PIP_ADDITIONAL_REQUIREMENTS: "" 271 | user: "0:0" 272 | volumes: 273 | - ${AIRFLOW_PROJ_DIR:-.}:/sources 274 | 275 | airflow-cli: 276 | <<: *airflow-common 277 | profiles: 278 | - debug 279 | environment: 280 | <<: *airflow-common-env 281 | CONNECTION_CHECK_MAX_COUNT: "0" 282 | # Workaround for entrypoint issue. See: https://github.com/apache/airflow/issues/16252 283 | command: 284 | - bash 285 | - -c 286 | - airflow 287 | 288 | # You can enable flower by adding "--profile flower" option e.g. docker-compose --profile flower up 289 | # or by explicitly targeted on the command line e.g. docker-compose up flower. 290 | # See: https://docs.docker.com/compose/profiles/ 291 | flower: 292 | <<: *airflow-common 293 | command: celery flower 294 | profiles: 295 | - flower 296 | ports: 297 | - 5555:5555 298 | healthcheck: 299 | test: ["CMD", "curl", "--fail", "http://localhost:5555/"] 300 | interval: 10s 301 | timeout: 10s 302 | retries: 5 303 | restart: always 304 | depends_on: 305 | <<: *airflow-common-depends-on 306 | airflow-init: 307 | condition: service_completed_successfully 308 | 309 | volumes: 310 | postgres-db-volume: 311 | ``` 312 | 313 | Após a criação do arquivo docker-compose.yml, precisamos também passar algumas variáveis de ambiente para o airflow. Para isso, vamos criar um arquivo chamado .env com as seguintes variáveis: 314 | 315 | ``` 316 | AIRFLOW_UID=1000 317 | AIRFLOW_GID=0 318 | ``` 319 | 320 | Agora que já criamos o docker-compose.yml e o .env, vamos executar o airflow. Para isso, vamos executar os seguintes comandos: 321 | 322 | ``` 323 | docker-compose up airflow-init 324 | docker-compose up 325 | 326 | ``` 327 | 328 | ### Visualizando o Airflow 329 | 330 | Agora que você conseguiu executar o airflow, podemos ver sua interface web. Para isso, basta acessar o endereço http://localhost:8080. Você deverá ver a seguinte tela: 331 | 332 | ![Alt Text](/imagens/airflow.png) 333 | 334 | ### Adicionando conexão ao airflow 335 | 336 | Nesse projeto vamos utilizar o airflow para orchestrar comandos diretos a cloud do Google. Para isso, precisamos adicionar uma conexão com o Google Cloud. Para isso, vamos acessar o endereço http://localhost:8080/admin/connection/ e clicar em “Create”. 337 | 338 | Nesse momento você já deve ter criado uma conta de serviço no Google Cloud. Se não, crie uma agora. Após criar a conta de serviço, você deve ter um arquivo json com as credenciais. Vamos utilizar esse arquivo para adicionar a conexão. 339 | 340 | Após clicar em “Create”, você deve selecionar a conexão do tipo “Google Cloud”. Em seguida, você deve preencher os campos: 341 | 342 | - Nome da conexão: google_cloud_default 343 | - Project ID: id do projeto no Google Cloud 344 | - Keyfile JSON: conteúdo do arquivo json com as credenciais 345 | 346 | Agora que você adicionou a conexão, você pode testar se ela está funcionando. Para isso, clique em “Test Connection”. 347 | 348 | Dando o sinal verde, o seu airflow já está pronto para ser utilizado. 349 | -------------------------------------------------------------------------------- /instrucoes/google-cloud.md: -------------------------------------------------------------------------------- 1 | # Configurando o Google Cloud 2 | 3 | Como já foi mencionado, existem diversas nuvens que poderiamos utilizar nesse projeto, porém hoje utilizaremos o Google Cloud. Para isso, precisamos criar uma conta no Google Cloud, para isso, basta acessar o [site](https://cloud.google.com/) e criar uma conta. 4 | 5 | A Google possui um plano gratuito de 300 dólares por 90 meses. É esse plano que iremos utilizar nesse projeto. 6 | 7 | ## Criando um projeto no Google Cloud 8 | 9 | Após criar sua conta, você será redirecionado para a página inicial do Google Cloud. Nessa página, você verá uma lista de projetos, caso você não tenha nenhum projeto, você verá uma mensagem dizendo que você não possui nenhum projeto. 10 | 11 | Para criar um projeto, basta clicar no botão `Criar projeto`. 12 | 13 | Acesse a [documentação](https://developers.google.com/workspace/guides/create-project?hl=pt-br) do Google Cloud para mais informações sobre como criar um projeto. 14 | 15 | ## Criando sua conta de serviço 16 | 17 | Agora que já temos um projeto, precisamos criar algumas contas de serviço, são elas que nos permitiram utilizar o airflow, terraform e dbt no nosso projeto. Precisamos dar permissão para essas contas de serviço acessarem os recursos do nosso projeto para criarmos tudo de forma automatizada. 18 | 19 | Para saber como criar suas contas de serviço (service-account), acesse a [documentação](https://cloud.google.com/iam/docs/service-accounts-create#iam-service-accounts-create-console) do Google Cloud. 20 | 21 | Você precisa criar 2 contas de serviço, uma para o terraform e airflow, e outra para o dbt. As permissões que precisamos pra cada uma são: 22 | 23 | 1. Terraform e Airflow: `Storage Admin` e `BigQuery Admin` 24 | 2. DBT: `BigQuery Admin` 25 | 26 | ## Gerando chaves de acesso 27 | 28 | Após criar suas contas de serviço, precisamos gerar as chaves de acesso para que possamos utilizar essas contas de serviço no nosso projeto. Para gerar as chaves de acesso, acesse a [documentação](https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=pt-br) do Google Cloud. 29 | 30 | Agora que já temos as nossas contas de serviço, e chaves de cada conta, vamos dar continuidade ao nosso projeto. 31 | -------------------------------------------------------------------------------- /instrucoes/poetry.md: -------------------------------------------------------------------------------- 1 | # Poetry 2 | 3 | Quando vamos iniciar um projeto, precisamos escolher alguma ferramenta que gerencie as nossas dependência, uma das ferramentas mais utilizadas atualmente é o [poetry](https://python-poetry.org/), e é ela que utilizaremos aqui. 4 | 5 | # Iniciando o projeto 6 | 7 | Para iniciar no projeto, primeiramente precisamos fazer o download do poetry, para isso, vamos executar no terminal. 8 | 9 | ``` 10 | curl -sSL https://install.python-poetry.org | python3 - 11 | ``` 12 | 13 | Após instalado, vamos finalmente iniciar o nosso projeto. 14 | 15 | ``` 16 | poetry new [nome_do_projeto] 17 | ``` 18 | 19 | Para instalar todos as bibliotecas presentes no seu pacote, basta escrever o comando. 20 | 21 | ``` 22 | poetry install 23 | ``` 24 | 25 | Neste projeto, vamos trabalhar com diversas bibliotecas diferentes, e sempre que precisarmos instalar uma nova, precisamos pedir ao poetry que adicione isso na nossa lista de dependências, para isto vamos digitar no terminal 26 | 27 | ``` 28 | poetry add nome_da_dependência 29 | ``` 30 | 31 | Para saber mais sobre o poetry, você pode pesquisar em sua própria documentação, ou nesse [artigo](https://medium.com/@eduardo.machado1/poetry-gerenciamento-de-depend%C3%AAncias-em-python-a5fdb8b0510c) que eu mesmo criei! 32 | -------------------------------------------------------------------------------- /instrucoes/terraform.md: -------------------------------------------------------------------------------- 1 | # Sobre o terraform 2 | 3 | O Terraform é uma ferramenta de código aberto usada para criar e gerenciar recursos de infraestrutura de forma automatizada. Com o Terraform, você pode descrever sua infraestrutura como código, o que significa que suas configurações de infraestrutura são armazenadas em arquivos de texto que podem ser versionados, compartilhados e auditados. 4 | 5 | Com o Terraform, você pode criar e gerenciar recursos em diversos provedores de nuvem (como AWS, Azure, Google Cloud Platform, entre outros), bem como em infraestrutura local (como servidores físicos ou virtuais). O Terraform suporta diversos tipos de recursos, como instâncias EC2, grupos de segurança, Buckets S3, máquinas virtuais, redes virtuais, etc. 6 | 7 | Ao usar o Terraform, você define sua infraestrutura como código usando a sintaxe do HCL (HashiCorp Configuration Language). Esses arquivos de configuração descrevem todos os recursos necessários para a infraestrutura desejada, incluindo seus relacionamentos e dependências. Com essas informações, o Terraform cria um plano de execução que mostra quais recursos serão criados, modificados ou excluídos. 8 | 9 | O Terraform é capaz de gerenciar recursos de forma segura e consistente, garantindo que todos os recursos sejam criados com as mesmas configurações e que a infraestrutura seja mantida em um estado previsível. Além disso, o Terraform permite que você compartilhe e reutilize módulos de infraestrutura, o que ajuda a acelerar o desenvolvimento e a manutenção da infraestrutura. 10 | 11 | Em resumo, o Terraform é uma ferramenta poderosa para criar e gerenciar infraestrutura de forma automatizada, consistente e segura, ajudando a acelerar a entrega de serviços e aplicações. 12 | 13 | # Instalação 14 | 15 | Para fazer a instalação do terraform , acesse a própria [documentação](https://developer.hashicorp.com/terraform/downloads) e siga o passo a passo de acordo com seu sistema operacional. 16 | 17 | # Configuração 18 | 19 | Dentro do projeto que criamos na etapa anterior utilizando o poetry, vamos criar um arquivo chamado `main.tf` na raiz do projeto. Esse arquivo é responsável por conter todas as configurações do terraform. 20 | 21 | `touch tf` 22 | 23 | Como nós iremos transferir nossos para o gcs e posteriormente para o bigquery, precisamos de 2 `resources`, que é o que o terraform irá criar. No nosso caso, iremos criar um `resource` do tipo `google_storage_bucket` e outro do tipo `google_bigquery_dataset`. 24 | 25 | Dentro do arquivo `main.tf` vamos adicionar o seguinte código: 26 | 27 | ```hcl 28 | terraform { 29 | required_providers { 30 | google = { 31 | source = "hashicorp/google" 32 | version = "4.51.0" 33 | } 34 | } 35 | } 36 | 37 | provider "google" { 38 | 39 | project = var.project 40 | region = var.region 41 | zone = var.zone 42 | } 43 | 44 | 45 | resource "google_storage_bucket" "data-lake-bucket" { 46 | name = "${local.data_lake_bucket}_${var.project}" # Concatenating DL bucket & Project name for unique naming 47 | location = var.region 48 | 49 | # Optional, but recommended settings: 50 | storage_class = var.storage_class 51 | uniform_bucket_level_access = true 52 | 53 | versioning { 54 | enabled = true 55 | } 56 | 57 | lifecycle_rule { 58 | action { 59 | type = "Delete" 60 | } 61 | condition { 62 | age = 30 // days 63 | } 64 | } 65 | 66 | force_destroy = true 67 | } 68 | 69 | resource "google_bigquery_dataset" "dataset" { 70 | dataset_id = var.BQ_DATASET 71 | project = var.project 72 | location = var.region 73 | } 74 | 75 | ``` 76 | 77 | Para entender mais a fundo sobre o que cada trecho desse código faz, acesse a [documentação](https://developer.hashicorp.com/terraform/tutorials/gcp-get-started) do terraform. 78 | 79 | # Variáveis 80 | 81 | Para que o terraform possa criar o nosso dataset, precisamos passar algumas informações para ele. Essas informações são chamadas de variáveis e são definidas no arquivo `variables.tf`. 82 | 83 | `touch variables.tf` 84 | 85 | Dentro do arquivo `variables.tf` vamos adicionar o seguinte código: 86 | 87 | ``` 88 | variable "project" {} 89 | 90 | variable "credentials_file" {} 91 | 92 | variable "region" { 93 | default = "US" 94 | } 95 | 96 | variable "zone" { 97 | default = "US" 98 | } 99 | 100 | 101 | variable "storage_class" { 102 | description = "Storage class type for your bucket. Check official docs for more info." 103 | default = "STANDARD" 104 | } 105 | 106 | 107 | 108 | variable "BQ_DATASET" { 109 | description = "BigQuery Dataset that raw data (from GCS) will be written to" 110 | type = string 111 | default = "raw_data" #nome do nosso dataset 112 | } 113 | 114 | 115 | locals { 116 | data_lake_bucket = "dtc_data_lake" #nome do nosso bucket 117 | } 118 | 119 | ``` 120 | 121 | # Terraform init 122 | 123 | Para que o terraform possa criar o nosso dataset e nosso bucket, precisamos inicializar o terraform. Para isso, vamos rodar o comando `terraform init` na raiz do nosso projeto. 124 | 125 | ``` 126 | terraform init 127 | ``` 128 | 129 | # Terraform plan 130 | 131 | Agora vamos criar um plano de execução. Para isso, vamos rodar o comando `terraform plan`, passando o argumento -var="project=" para que o terraform saiba qual projeto ele deve criar o dataset e o bucket. 132 | 133 | ``` 134 | terraform plan -var="project=allspark-377318" 135 | ``` 136 | 137 | # Terraform apply 138 | 139 | Agora vamos aplicar o plano de execução. Para isso, vamos rodar o comando `terraform apply`, passando o argumento -var="project=". 140 | 141 | ``` 142 | terraform apply -var="project=" 143 | ``` 144 | 145 | # Configuração do terraform concluida 146 | 147 | E é isso que precisamos de configuração do terraform neste projeto, se tudo ocorreu bem, no seu ambiente do bigquery você deve ver um dataset chamado `raw_data` e no gcs (google cloud storage) um bucket chamado `dtc_data_lake`. 148 | 149 | Imagem do bucket no gcs 150 | 151 | ![bucket](/imagens/gcs-print.png) 152 | 153 | Imagem do dataset no bigquery 154 | ![raw_data](/imagens/bigquery.png) 155 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "agate" 3 | version = "1.6.3" 4 | description = "A data analysis library that is optimized for humans instead of machines." 5 | category = "main" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [package.dependencies] 10 | Babel = ">=2.0" 11 | isodate = ">=0.5.4" 12 | leather = ">=0.3.2" 13 | parsedatetime = ">=2.1,<2.5 || >2.5,<2.6 || >2.6" 14 | python-slugify = ">=1.2.1" 15 | pytimeparse = ">=1.1.5" 16 | six = ">=1.9.0" 17 | 18 | [package.extras] 19 | docs = ["Sphinx (>=1.2.2)", "sphinx-rtd-theme (>=0.1.6)"] 20 | test = ["PyICU (>=2.4.2)", "coverage (>=3.7.1)", "cssselect (>=0.9.1)", "lxml (>=3.6.0)", "mock (>=1.3.0)", "nose (>=1.1.2)", "pytz (>=2015.4)", "unittest2 (>=1.1.0)"] 21 | 22 | [[package]] 23 | name = "attrs" 24 | version = "22.2.0" 25 | description = "Classes Without Boilerplate" 26 | category = "main" 27 | optional = false 28 | python-versions = ">=3.6" 29 | 30 | [package.extras] 31 | cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] 32 | dev = ["attrs[docs,tests]"] 33 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] 34 | tests = ["attrs[tests-no-zope]", "zope.interface"] 35 | tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] 36 | tests_no_zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] 37 | 38 | [[package]] 39 | name = "Babel" 40 | version = "2.12.1" 41 | description = "Internationalization utilities" 42 | category = "main" 43 | optional = false 44 | python-versions = ">=3.7" 45 | 46 | [[package]] 47 | name = "betterproto" 48 | version = "1.2.5" 49 | description = "A better Protobuf / gRPC generator & library" 50 | category = "main" 51 | optional = false 52 | python-versions = ">=3.6" 53 | 54 | [package.dependencies] 55 | grpclib = "*" 56 | stringcase = "*" 57 | 58 | [package.extras] 59 | compiler = ["black", "jinja2", "protobuf"] 60 | 61 | [[package]] 62 | name = "cachetools" 63 | version = "5.3.0" 64 | description = "Extensible memoizing collections and decorators" 65 | category = "main" 66 | optional = false 67 | python-versions = "~=3.7" 68 | 69 | [[package]] 70 | name = "certifi" 71 | version = "2022.12.7" 72 | description = "Python package for providing Mozilla's CA Bundle." 73 | category = "main" 74 | optional = false 75 | python-versions = ">=3.6" 76 | 77 | [[package]] 78 | name = "cffi" 79 | version = "1.15.1" 80 | description = "Foreign Function Interface for Python calling C code." 81 | category = "main" 82 | optional = false 83 | python-versions = "*" 84 | 85 | [package.dependencies] 86 | pycparser = "*" 87 | 88 | [[package]] 89 | name = "charset-normalizer" 90 | version = "3.0.1" 91 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 92 | category = "main" 93 | optional = false 94 | python-versions = "*" 95 | 96 | [[package]] 97 | name = "click" 98 | version = "8.1.3" 99 | description = "Composable command line interface toolkit" 100 | category = "main" 101 | optional = false 102 | python-versions = ">=3.7" 103 | 104 | [package.dependencies] 105 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 106 | 107 | [[package]] 108 | name = "colorama" 109 | version = "0.4.6" 110 | description = "Cross-platform colored terminal text." 111 | category = "main" 112 | optional = false 113 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 114 | 115 | [[package]] 116 | name = "dbt-bigquery" 117 | version = "1.4.1" 118 | description = "The Bigquery adapter plugin for dbt" 119 | category = "main" 120 | optional = false 121 | python-versions = ">=3.7" 122 | 123 | [package.dependencies] 124 | agate = ">=1.6.3,<1.7" 125 | dbt-core = ">=1.4.0,<1.5.0" 126 | google-api-core = ">=2.0,<3.0" 127 | google-cloud-bigquery = ">=3.0,<4.0" 128 | google-cloud-core = ">=2.0,<3.0" 129 | google-cloud-dataproc = ">=5.0,<6.0" 130 | google-cloud-storage = ">=2.4,<3.0" 131 | googleapis-common-protos = ">=1.6,<2.0" 132 | protobuf = ">=3.13.0,<4" 133 | 134 | [[package]] 135 | name = "dbt-core" 136 | version = "1.4.4" 137 | description = "With dbt, data analysts and engineers can build analytics the way engineers build applications." 138 | category = "main" 139 | optional = false 140 | python-versions = ">=3.7.2" 141 | 142 | [package.dependencies] 143 | agate = ">=1.6,<1.7.1" 144 | betterproto = "1.2.5" 145 | cffi = ">=1.9,<2.0.0" 146 | click = ">=7.0,<9" 147 | colorama = ">=0.3.9,<0.4.7" 148 | dbt-extractor = ">=0.4.1,<0.5.0" 149 | hologram = ">=0.0.14,<=0.0.15" 150 | idna = ">=2.5,<4" 151 | isodate = ">=0.6,<0.7" 152 | Jinja2 = "3.1.2" 153 | logbook = ">=1.5,<1.6" 154 | mashumaro = {version = "3.3.1", extras = ["msgpack"]} 155 | minimal-snowplow-tracker = "0.0.2" 156 | networkx = {version = ">=2.3,<3", markers = "python_version >= \"3.8\""} 157 | packaging = ">20.9" 158 | pathspec = ">=0.9,<0.11" 159 | pytz = ">=2015.7" 160 | pyyaml = ">=6.0" 161 | requests = "<3.0.0" 162 | sqlparse = ">=0.2.3,<0.5" 163 | typing-extensions = ">=3.7.4" 164 | werkzeug = ">=1,<3" 165 | 166 | [[package]] 167 | name = "dbt-extractor" 168 | version = "0.4.1" 169 | description = "A tool to analyze and extract information from Jinja used in dbt projects." 170 | category = "main" 171 | optional = false 172 | python-versions = ">=3.6.1" 173 | 174 | [[package]] 175 | name = "future" 176 | version = "0.18.3" 177 | description = "Clean single-source support for Python 3 and 2" 178 | category = "main" 179 | optional = false 180 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 181 | 182 | [[package]] 183 | name = "google-api-core" 184 | version = "2.10.2" 185 | description = "Google API client core library" 186 | category = "main" 187 | optional = false 188 | python-versions = ">=3.7" 189 | 190 | [package.dependencies] 191 | google-auth = ">=1.25.0,<3.0dev" 192 | googleapis-common-protos = ">=1.56.2,<2.0dev" 193 | grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} 194 | grpcio-status = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} 195 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" 196 | requests = ">=2.18.0,<3.0.0dev" 197 | 198 | [package.extras] 199 | grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)"] 200 | grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] 201 | grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] 202 | 203 | [[package]] 204 | name = "google-api-core" 205 | version = "2.11.0" 206 | description = "Google API client core library" 207 | category = "main" 208 | optional = false 209 | python-versions = ">=3.7" 210 | 211 | [package.dependencies] 212 | google-auth = ">=2.14.1,<3.0dev" 213 | googleapis-common-protos = ">=1.56.2,<2.0dev" 214 | grpcio = [ 215 | {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, 216 | {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\""}, 217 | ] 218 | grpcio-status = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} 219 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" 220 | requests = ">=2.18.0,<3.0.0dev" 221 | 222 | [package.extras] 223 | grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)", "grpcio-status (>=1.49.1,<2.0dev)"] 224 | grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] 225 | grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] 226 | 227 | [[package]] 228 | name = "google-auth" 229 | version = "2.16.1" 230 | description = "Google Authentication Library" 231 | category = "main" 232 | optional = false 233 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" 234 | 235 | [package.dependencies] 236 | cachetools = ">=2.0.0,<6.0" 237 | pyasn1-modules = ">=0.2.1" 238 | rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} 239 | six = ">=1.9.0" 240 | 241 | [package.extras] 242 | aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] 243 | enterprise_cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] 244 | pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] 245 | reauth = ["pyu2f (>=0.1.5)"] 246 | requests = ["requests (>=2.20.0,<3.0.0dev)"] 247 | 248 | [[package]] 249 | name = "google-cloud-bigquery" 250 | version = "3.6.0" 251 | description = "Google BigQuery API client library" 252 | category = "main" 253 | optional = false 254 | python-versions = ">=3.7" 255 | 256 | [package.dependencies] 257 | google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} 258 | google-cloud-core = ">=1.6.0,<3.0.0dev" 259 | google-resumable-media = ">=0.6.0,<3.0dev" 260 | grpcio = [ 261 | {version = ">=1.47.0,<2.0dev", markers = "python_version < \"3.11\""}, 262 | {version = ">=1.49.1,<2.0dev", markers = "python_version >= \"3.11\""}, 263 | ] 264 | packaging = ">=20.0.0" 265 | proto-plus = ">=1.15.0,<2.0.0dev" 266 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" 267 | python-dateutil = ">=2.7.2,<3.0dev" 268 | requests = ">=2.21.0,<3.0.0dev" 269 | 270 | [package.extras] 271 | all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipython (>=7.0.1,!=8.1.0)", "ipywidgets (>=7.7.0,<8.0.1)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] 272 | bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] 273 | geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] 274 | ipython = ["ipython (>=7.0.1,!=8.1.0)"] 275 | ipywidgets = ["ipywidgets (>=7.7.0,<8.0.1)"] 276 | opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] 277 | pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] 278 | tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] 279 | 280 | [[package]] 281 | name = "google-cloud-core" 282 | version = "2.3.2" 283 | description = "Google Cloud API client core library" 284 | category = "main" 285 | optional = false 286 | python-versions = ">=3.7" 287 | 288 | [package.dependencies] 289 | google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" 290 | google-auth = ">=1.25.0,<3.0dev" 291 | 292 | [package.extras] 293 | grpc = ["grpcio (>=1.38.0,<2.0dev)"] 294 | 295 | [[package]] 296 | name = "google-cloud-dataproc" 297 | version = "5.0.3" 298 | description = "Google Cloud Dataproc API client library" 299 | category = "main" 300 | optional = false 301 | python-versions = ">=3.7" 302 | 303 | [package.dependencies] 304 | google-api-core = {version = ">=1.32.0,<2.0.0 || >=2.8.0,<3.0.0dev", extras = ["grpc"]} 305 | proto-plus = ">=1.22.0,<2.0.0dev" 306 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" 307 | 308 | [package.extras] 309 | libcst = ["libcst (>=0.2.5)"] 310 | 311 | [[package]] 312 | name = "google-cloud-dataproc" 313 | version = "5.4.0" 314 | description = "Google Cloud Dataproc API client library" 315 | category = "main" 316 | optional = false 317 | python-versions = ">=3.7" 318 | 319 | [package.dependencies] 320 | google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} 321 | grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" 322 | proto-plus = [ 323 | {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, 324 | {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, 325 | ] 326 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" 327 | 328 | [[package]] 329 | name = "google-cloud-storage" 330 | version = "2.7.0" 331 | description = "Google Cloud Storage API client library" 332 | category = "main" 333 | optional = false 334 | python-versions = ">=3.7" 335 | 336 | [package.dependencies] 337 | google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" 338 | google-auth = ">=1.25.0,<3.0dev" 339 | google-cloud-core = ">=2.3.0,<3.0dev" 340 | google-resumable-media = ">=2.3.2" 341 | requests = ">=2.18.0,<3.0.0dev" 342 | 343 | [package.extras] 344 | protobuf = ["protobuf (<5.0.0dev)"] 345 | 346 | [[package]] 347 | name = "google-crc32c" 348 | version = "1.5.0" 349 | description = "A python wrapper of the C library 'Google CRC32C'" 350 | category = "main" 351 | optional = false 352 | python-versions = ">=3.7" 353 | 354 | [package.extras] 355 | testing = ["pytest"] 356 | 357 | [[package]] 358 | name = "google-resumable-media" 359 | version = "2.4.1" 360 | description = "Utilities for Google Media Downloads and Resumable Uploads" 361 | category = "main" 362 | optional = false 363 | python-versions = ">= 3.7" 364 | 365 | [package.dependencies] 366 | google-crc32c = ">=1.0,<2.0dev" 367 | 368 | [package.extras] 369 | aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] 370 | requests = ["requests (>=2.18.0,<3.0.0dev)"] 371 | 372 | [[package]] 373 | name = "googleapis-common-protos" 374 | version = "1.58.0" 375 | description = "Common protobufs used in Google APIs" 376 | category = "main" 377 | optional = false 378 | python-versions = ">=3.7" 379 | 380 | [package.dependencies] 381 | grpcio = {version = ">=1.44.0,<2.0.0dev", optional = true, markers = "extra == \"grpc\""} 382 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" 383 | 384 | [package.extras] 385 | grpc = ["grpcio (>=1.44.0,<2.0.0dev)"] 386 | 387 | [[package]] 388 | name = "grpc-google-iam-v1" 389 | version = "0.12.6" 390 | description = "IAM API client library" 391 | category = "main" 392 | optional = false 393 | python-versions = ">=3.7" 394 | 395 | [package.dependencies] 396 | googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} 397 | grpcio = ">=1.44.0,<2.0.0dev" 398 | protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" 399 | 400 | [[package]] 401 | name = "grpcio" 402 | version = "1.51.3" 403 | description = "HTTP/2-based RPC framework" 404 | category = "main" 405 | optional = false 406 | python-versions = ">=3.7" 407 | 408 | [package.extras] 409 | protobuf = ["grpcio-tools (>=1.51.3)"] 410 | 411 | [[package]] 412 | name = "grpcio-status" 413 | version = "1.48.2" 414 | description = "Status proto mapping for gRPC" 415 | category = "main" 416 | optional = false 417 | python-versions = ">=3.6" 418 | 419 | [package.dependencies] 420 | googleapis-common-protos = ">=1.5.5" 421 | grpcio = ">=1.48.2" 422 | protobuf = ">=3.12.0" 423 | 424 | [[package]] 425 | name = "grpclib" 426 | version = "0.4.3" 427 | description = "Pure-Python gRPC implementation for asyncio" 428 | category = "main" 429 | optional = false 430 | python-versions = ">=3.7" 431 | 432 | [package.dependencies] 433 | h2 = ">=3.1.0,<5" 434 | multidict = "*" 435 | 436 | [package.extras] 437 | protobuf = ["protobuf (>=3.15.0)"] 438 | 439 | [[package]] 440 | name = "h2" 441 | version = "4.1.0" 442 | description = "HTTP/2 State-Machine based protocol implementation" 443 | category = "main" 444 | optional = false 445 | python-versions = ">=3.6.1" 446 | 447 | [package.dependencies] 448 | hpack = ">=4.0,<5" 449 | hyperframe = ">=6.0,<7" 450 | 451 | [[package]] 452 | name = "hologram" 453 | version = "0.0.15" 454 | description = "JSON schema generation from dataclasses" 455 | category = "main" 456 | optional = false 457 | python-versions = "*" 458 | 459 | [package.dependencies] 460 | jsonschema = ">=3.0,<4.0" 461 | python-dateutil = ">=2.8,<2.9" 462 | 463 | [[package]] 464 | name = "hpack" 465 | version = "4.0.0" 466 | description = "Pure-Python HPACK header compression" 467 | category = "main" 468 | optional = false 469 | python-versions = ">=3.6.1" 470 | 471 | [[package]] 472 | name = "hyperframe" 473 | version = "6.0.1" 474 | description = "HTTP/2 framing layer for Python" 475 | category = "main" 476 | optional = false 477 | python-versions = ">=3.6.1" 478 | 479 | [[package]] 480 | name = "idna" 481 | version = "3.4" 482 | description = "Internationalized Domain Names in Applications (IDNA)" 483 | category = "main" 484 | optional = false 485 | python-versions = ">=3.5" 486 | 487 | [[package]] 488 | name = "isodate" 489 | version = "0.6.1" 490 | description = "An ISO 8601 date/time/duration parser and formatter" 491 | category = "main" 492 | optional = false 493 | python-versions = "*" 494 | 495 | [package.dependencies] 496 | six = "*" 497 | 498 | [[package]] 499 | name = "isort" 500 | version = "5.12.0" 501 | description = "A Python utility / library to sort Python imports." 502 | category = "main" 503 | optional = false 504 | python-versions = ">=3.8.0" 505 | 506 | [package.extras] 507 | colors = ["colorama (>=0.4.3)"] 508 | pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] 509 | plugins = ["setuptools"] 510 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 511 | 512 | [[package]] 513 | name = "Jinja2" 514 | version = "3.1.2" 515 | description = "A very fast and expressive template engine." 516 | category = "main" 517 | optional = false 518 | python-versions = ">=3.7" 519 | 520 | [package.dependencies] 521 | MarkupSafe = ">=2.0" 522 | 523 | [package.extras] 524 | i18n = ["Babel (>=2.7)"] 525 | 526 | [[package]] 527 | name = "jsonschema" 528 | version = "3.2.0" 529 | description = "An implementation of JSON Schema validation for Python" 530 | category = "main" 531 | optional = false 532 | python-versions = "*" 533 | 534 | [package.dependencies] 535 | attrs = ">=17.4.0" 536 | pyrsistent = ">=0.14.0" 537 | setuptools = "*" 538 | six = ">=1.11.0" 539 | 540 | [package.extras] 541 | format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] 542 | format_nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] 543 | 544 | [[package]] 545 | name = "leather" 546 | version = "0.3.4" 547 | description = "Python charting for 80% of humans." 548 | category = "main" 549 | optional = false 550 | python-versions = "*" 551 | 552 | [package.dependencies] 553 | six = ">=1.6.1" 554 | 555 | [[package]] 556 | name = "Logbook" 557 | version = "1.5.3" 558 | description = "A logging replacement for Python" 559 | category = "main" 560 | optional = false 561 | python-versions = "*" 562 | 563 | [package.extras] 564 | all = ["Jinja2", "brotli", "cython", "execnet (>=1.0.9)", "pytest (>4.0)", "pytest-cov (>=2.6)", "pyzmq", "redis", "sqlalchemy"] 565 | compression = ["brotli"] 566 | dev = ["cython", "pytest (>4.0)", "pytest-cov (>=2.6)"] 567 | execnet = ["execnet (>=1.0.9)"] 568 | jinja = ["Jinja2"] 569 | redis = ["redis"] 570 | sqlalchemy = ["sqlalchemy"] 571 | test = ["pytest (>4.0)", "pytest-cov (>=2.6)"] 572 | zmq = ["pyzmq"] 573 | 574 | [[package]] 575 | name = "MarkupSafe" 576 | version = "2.1.2" 577 | description = "Safely add untrusted strings to HTML/XML markup." 578 | category = "main" 579 | optional = false 580 | python-versions = ">=3.7" 581 | 582 | [[package]] 583 | name = "mashumaro" 584 | version = "3.3.1" 585 | description = "Fast serialization framework on top of dataclasses" 586 | category = "main" 587 | optional = false 588 | python-versions = ">=3.7" 589 | 590 | [package.dependencies] 591 | msgpack = {version = ">=0.5.6", optional = true, markers = "extra == \"msgpack\""} 592 | typing-extensions = ">=4.1.0" 593 | 594 | [package.extras] 595 | msgpack = ["msgpack (>=0.5.6)"] 596 | orjson = ["orjson"] 597 | toml = ["tomli (>=1.1.0)", "tomli-w (>=1.0)"] 598 | yaml = ["pyyaml (>=3.13)"] 599 | 600 | [[package]] 601 | name = "minimal-snowplow-tracker" 602 | version = "0.0.2" 603 | description = "A minimal snowplow event tracker for Python. Add analytics to your Python and Django apps, webapps and games" 604 | category = "main" 605 | optional = false 606 | python-versions = "*" 607 | 608 | [package.dependencies] 609 | requests = ">=2.2.1,<3.0" 610 | six = ">=1.9.0,<2.0" 611 | 612 | [[package]] 613 | name = "msgpack" 614 | version = "1.0.4" 615 | description = "MessagePack serializer" 616 | category = "main" 617 | optional = false 618 | python-versions = "*" 619 | 620 | [[package]] 621 | name = "multidict" 622 | version = "6.0.4" 623 | description = "multidict implementation" 624 | category = "main" 625 | optional = false 626 | python-versions = ">=3.7" 627 | 628 | [[package]] 629 | name = "networkx" 630 | version = "2.8.8" 631 | description = "Python package for creating and manipulating graphs and networks" 632 | category = "main" 633 | optional = false 634 | python-versions = ">=3.8" 635 | 636 | [package.extras] 637 | default = ["matplotlib (>=3.4)", "numpy (>=1.19)", "pandas (>=1.3)", "scipy (>=1.8)"] 638 | developer = ["mypy (>=0.982)", "pre-commit (>=2.20)"] 639 | doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.2)", "pydata-sphinx-theme (>=0.11)", "sphinx (>=5.2)", "sphinx-gallery (>=0.11)", "texext (>=0.6.6)"] 640 | extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"] 641 | test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] 642 | 643 | [[package]] 644 | name = "packaging" 645 | version = "23.0" 646 | description = "Core utilities for Python packages" 647 | category = "main" 648 | optional = false 649 | python-versions = ">=3.7" 650 | 651 | [[package]] 652 | name = "parsedatetime" 653 | version = "2.4" 654 | description = "Parse human-readable date/time text." 655 | category = "main" 656 | optional = false 657 | python-versions = "*" 658 | 659 | [package.dependencies] 660 | future = "*" 661 | 662 | [[package]] 663 | name = "pathspec" 664 | version = "0.10.3" 665 | description = "Utility library for gitignore style pattern matching of file paths." 666 | category = "main" 667 | optional = false 668 | python-versions = ">=3.7" 669 | 670 | [[package]] 671 | name = "proto-plus" 672 | version = "1.22.2" 673 | description = "Beautiful, Pythonic protocol buffers." 674 | category = "main" 675 | optional = false 676 | python-versions = ">=3.6" 677 | 678 | [package.dependencies] 679 | protobuf = ">=3.19.0,<5.0.0dev" 680 | 681 | [package.extras] 682 | testing = ["google-api-core[grpc] (>=1.31.5)"] 683 | 684 | [[package]] 685 | name = "protobuf" 686 | version = "3.20.3" 687 | description = "Protocol Buffers" 688 | category = "main" 689 | optional = false 690 | python-versions = ">=3.7" 691 | 692 | [[package]] 693 | name = "pyasn1" 694 | version = "0.4.8" 695 | description = "ASN.1 types and codecs" 696 | category = "main" 697 | optional = false 698 | python-versions = "*" 699 | 700 | [[package]] 701 | name = "pyasn1-modules" 702 | version = "0.2.8" 703 | description = "A collection of ASN.1-based protocols modules." 704 | category = "main" 705 | optional = false 706 | python-versions = "*" 707 | 708 | [package.dependencies] 709 | pyasn1 = ">=0.4.6,<0.5.0" 710 | 711 | [[package]] 712 | name = "pycparser" 713 | version = "2.21" 714 | description = "C parser in Python" 715 | category = "main" 716 | optional = false 717 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 718 | 719 | [[package]] 720 | name = "pyrsistent" 721 | version = "0.19.3" 722 | description = "Persistent/Functional/Immutable data structures" 723 | category = "main" 724 | optional = false 725 | python-versions = ">=3.7" 726 | 727 | [[package]] 728 | name = "python-dateutil" 729 | version = "2.8.2" 730 | description = "Extensions to the standard Python datetime module" 731 | category = "main" 732 | optional = false 733 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 734 | 735 | [package.dependencies] 736 | six = ">=1.5" 737 | 738 | [[package]] 739 | name = "python-slugify" 740 | version = "8.0.1" 741 | description = "A Python slugify application that also handles Unicode" 742 | category = "main" 743 | optional = false 744 | python-versions = ">=3.7" 745 | 746 | [package.dependencies] 747 | text-unidecode = ">=1.3" 748 | 749 | [package.extras] 750 | unidecode = ["Unidecode (>=1.1.1)"] 751 | 752 | [[package]] 753 | name = "pytimeparse" 754 | version = "1.1.8" 755 | description = "Time expression parser" 756 | category = "main" 757 | optional = false 758 | python-versions = "*" 759 | 760 | [[package]] 761 | name = "pytz" 762 | version = "2022.7.1" 763 | description = "World timezone definitions, modern and historical" 764 | category = "main" 765 | optional = false 766 | python-versions = "*" 767 | 768 | [[package]] 769 | name = "PyYAML" 770 | version = "6.0" 771 | description = "YAML parser and emitter for Python" 772 | category = "main" 773 | optional = false 774 | python-versions = ">=3.6" 775 | 776 | [[package]] 777 | name = "requests" 778 | version = "2.28.2" 779 | description = "Python HTTP for Humans." 780 | category = "main" 781 | optional = false 782 | python-versions = ">=3.7, <4" 783 | 784 | [package.dependencies] 785 | certifi = ">=2017.4.17" 786 | charset-normalizer = ">=2,<4" 787 | idna = ">=2.5,<4" 788 | urllib3 = ">=1.21.1,<1.27" 789 | 790 | [package.extras] 791 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 792 | use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] 793 | 794 | [[package]] 795 | name = "rsa" 796 | version = "4.9" 797 | description = "Pure-Python RSA implementation" 798 | category = "main" 799 | optional = false 800 | python-versions = ">=3.6,<4" 801 | 802 | [package.dependencies] 803 | pyasn1 = ">=0.1.3" 804 | 805 | [[package]] 806 | name = "setuptools" 807 | version = "67.4.0" 808 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 809 | category = "main" 810 | optional = false 811 | python-versions = ">=3.7" 812 | 813 | [package.extras] 814 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] 815 | testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] 816 | testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] 817 | 818 | [[package]] 819 | name = "six" 820 | version = "1.16.0" 821 | description = "Python 2 and 3 compatibility utilities" 822 | category = "main" 823 | optional = false 824 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 825 | 826 | [[package]] 827 | name = "sqlparse" 828 | version = "0.4.3" 829 | description = "A non-validating SQL parser." 830 | category = "main" 831 | optional = false 832 | python-versions = ">=3.5" 833 | 834 | [[package]] 835 | name = "stringcase" 836 | version = "1.2.0" 837 | description = "String case converter." 838 | category = "main" 839 | optional = false 840 | python-versions = "*" 841 | 842 | [[package]] 843 | name = "text-unidecode" 844 | version = "1.3" 845 | description = "The most basic Text::Unidecode port" 846 | category = "main" 847 | optional = false 848 | python-versions = "*" 849 | 850 | [[package]] 851 | name = "typing-extensions" 852 | version = "4.5.0" 853 | description = "Backported and Experimental Type Hints for Python 3.7+" 854 | category = "main" 855 | optional = false 856 | python-versions = ">=3.7" 857 | 858 | [[package]] 859 | name = "urllib3" 860 | version = "1.26.14" 861 | description = "HTTP library with thread-safe connection pooling, file post, and more." 862 | category = "main" 863 | optional = false 864 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 865 | 866 | [package.extras] 867 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] 868 | secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] 869 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 870 | 871 | [[package]] 872 | name = "Werkzeug" 873 | version = "2.2.3" 874 | description = "The comprehensive WSGI web application library." 875 | category = "main" 876 | optional = false 877 | python-versions = ">=3.7" 878 | 879 | [package.dependencies] 880 | MarkupSafe = ">=2.1.1" 881 | 882 | [package.extras] 883 | watchdog = ["watchdog"] 884 | 885 | [metadata] 886 | lock-version = "1.1" 887 | python-versions = "^3.9" 888 | content-hash = "6fd68c844394d9535ee5f7a776a5e84025bbc3e1b7a89344ef3e1b79511a4dd3" 889 | 890 | [metadata.files] 891 | agate = [ 892 | {file = "agate-1.6.3-py2.py3-none-any.whl", hash = "sha256:2d568fd68a8eb8b56c805a1299ba4bc30ca0434563be1bea309c9d1c1c8401f4"}, 893 | {file = "agate-1.6.3.tar.gz", hash = "sha256:e0f2f813f7e12311a4cdccc97d6ba0a6781e9c1aa8eca0ab00d5931c0113a308"}, 894 | ] 895 | attrs = [ 896 | {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, 897 | {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, 898 | ] 899 | Babel = [ 900 | {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, 901 | {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, 902 | ] 903 | betterproto = [ 904 | {file = "betterproto-1.2.5.tar.gz", hash = "sha256:74a3ab34646054f674d236d1229ba8182dc2eae86feb249b8590ef496ce9803d"}, 905 | ] 906 | cachetools = [ 907 | {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, 908 | {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, 909 | ] 910 | certifi = [ 911 | {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, 912 | {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, 913 | ] 914 | cffi = [ 915 | {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, 916 | {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, 917 | {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, 918 | {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, 919 | {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, 920 | {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, 921 | {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, 922 | {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, 923 | {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, 924 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, 925 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, 926 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, 927 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, 928 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, 929 | {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, 930 | {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, 931 | {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, 932 | {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, 933 | {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, 934 | {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, 935 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, 936 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, 937 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, 938 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, 939 | {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, 940 | {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, 941 | {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, 942 | {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, 943 | {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, 944 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, 945 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, 946 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, 947 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, 948 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, 949 | {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, 950 | {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, 951 | {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, 952 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, 953 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, 954 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, 955 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, 956 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, 957 | {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, 958 | {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, 959 | {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, 960 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, 961 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, 962 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, 963 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, 964 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, 965 | {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, 966 | {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, 967 | {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, 968 | {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, 969 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, 970 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, 971 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, 972 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, 973 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, 974 | {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, 975 | {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, 976 | {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, 977 | {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, 978 | {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, 979 | ] 980 | charset-normalizer = [ 981 | {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, 982 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, 983 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, 984 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, 985 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, 986 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, 987 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, 988 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, 989 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, 990 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, 991 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, 992 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, 993 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, 994 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, 995 | {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, 996 | {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, 997 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, 998 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, 999 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, 1000 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, 1001 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, 1002 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, 1003 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, 1004 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, 1005 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, 1006 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, 1007 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, 1008 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, 1009 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, 1010 | {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, 1011 | {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, 1012 | {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, 1013 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, 1014 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, 1015 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, 1016 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, 1017 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, 1018 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, 1019 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, 1020 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, 1021 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, 1022 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, 1023 | {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, 1024 | {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, 1025 | {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, 1026 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, 1027 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, 1028 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, 1029 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, 1030 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, 1031 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, 1032 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, 1033 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, 1034 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, 1035 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, 1036 | {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, 1037 | {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, 1038 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, 1039 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, 1040 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, 1041 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, 1042 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, 1043 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, 1044 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, 1045 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, 1046 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, 1047 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, 1048 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, 1049 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, 1050 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, 1051 | {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, 1052 | {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, 1053 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, 1054 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, 1055 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, 1056 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, 1057 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, 1058 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, 1059 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, 1060 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, 1061 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, 1062 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, 1063 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, 1064 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, 1065 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, 1066 | {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, 1067 | {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, 1068 | {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, 1069 | ] 1070 | click = [ 1071 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 1072 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 1073 | ] 1074 | colorama = [ 1075 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 1076 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 1077 | ] 1078 | dbt-bigquery = [ 1079 | {file = "dbt-bigquery-1.4.1.tar.gz", hash = "sha256:dd8de3951c2e93a36fbb4b1cb6132a45050d8fac723efe47165b2fb18f8a0a21"}, 1080 | {file = "dbt_bigquery-1.4.1-py3-none-any.whl", hash = "sha256:68063b1c7141552a63c1377225e4f57d2837265d4c780724fe53dc3aeb4a056b"}, 1081 | ] 1082 | dbt-core = [ 1083 | {file = "dbt-core-1.4.4.tar.gz", hash = "sha256:7bc228013772322d3aaf8e06506a53c21b20e85f6db272b1bd6b055e85608842"}, 1084 | {file = "dbt_core-1.4.4-py3-none-any.whl", hash = "sha256:278ddc90f85fd5c0508194b7ac7b194cc7d98b4d66c92de0ca531f6ad44dc16b"}, 1085 | ] 1086 | dbt-extractor = [ 1087 | {file = "dbt_extractor-0.4.1-cp36-abi3-macosx_10_7_x86_64.whl", hash = "sha256:4dc715bd740e418d8dc1dd418fea508e79208a24cf5ab110b0092a3cbe96bf71"}, 1088 | {file = "dbt_extractor-0.4.1-cp36-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:bc9e0050e3a2f4ea9fe58e8794bc808e6709a0c688ed710fc7c5b6ef3e5623ec"}, 1089 | {file = "dbt_extractor-0.4.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76872cdee659075d6ce2df92dc62e59a74ba571be62acab2e297ca478b49d766"}, 1090 | {file = "dbt_extractor-0.4.1-cp36-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81435841610be1b07806d72cd89b1956c6e2a84c360b9ceb3f949c62a546d569"}, 1091 | {file = "dbt_extractor-0.4.1-cp36-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7c291f9f483eae4f60dd5859097d7ba51d5cb6c4725f08973ebd18cdea89d758"}, 1092 | {file = "dbt_extractor-0.4.1-cp36-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:822b1e911db230e1b9701c99896578e711232001027b518c44c32f79a46fa3f9"}, 1093 | {file = "dbt_extractor-0.4.1-cp36-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:554d27741a54599c39e5c0b7dbcab77400d83f908caba284a3e960db812e5814"}, 1094 | {file = "dbt_extractor-0.4.1-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a805d51a25317f53cbff951c79b9cf75421cf48e4b3e1dfb3e9e8de6d824b76c"}, 1095 | {file = "dbt_extractor-0.4.1-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cad90ddc708cb4182dc16fe2c87b1f088a1679877b93e641af068eb68a25d582"}, 1096 | {file = "dbt_extractor-0.4.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:34783d788b133f223844e280e37b3f5244f2fb60acc457aa75c2667e418d5442"}, 1097 | {file = "dbt_extractor-0.4.1-cp36-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:9da211869a1220ea55c5552c1567a3ea5233a6c52fa89ca87a22465481c37bc9"}, 1098 | {file = "dbt_extractor-0.4.1-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:7d7c47774dc051b8c18690281a55e2e3d3320e823b17e04b06bc3ff81b1874ba"}, 1099 | {file = "dbt_extractor-0.4.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:037907a7c7ae0391045d81338ca77ddaef899a91d80f09958f09fe374594e19b"}, 1100 | {file = "dbt_extractor-0.4.1-cp36-abi3-win32.whl", hash = "sha256:3fe8d8e28a7bd3e0884896147269ca0202ca432d8733113386bdc84c824561bf"}, 1101 | {file = "dbt_extractor-0.4.1-cp36-abi3-win_amd64.whl", hash = "sha256:35265a0ae0a250623b0c2e3308b2738dc8212e40e0aa88407849e9ea090bb312"}, 1102 | {file = "dbt_extractor-0.4.1.tar.gz", hash = "sha256:75b1c665699ec0f1ffce1ba3d776f7dfce802156f22e70a7b9c8f0b4d7e80f42"}, 1103 | ] 1104 | future = [ 1105 | {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, 1106 | ] 1107 | google-api-core = [ 1108 | {file = "google-api-core-2.10.2.tar.gz", hash = "sha256:10c06f7739fe57781f87523375e8e1a3a4674bf6392cd6131a3222182b971320"}, 1109 | {file = "google_api_core-2.10.2-py3-none-any.whl", hash = "sha256:34f24bd1d5f72a8c4519773d99ca6bf080a6c4e041b4e9f024fe230191dda62e"}, 1110 | {file = "google-api-core-2.11.0.tar.gz", hash = "sha256:4b9bb5d5a380a0befa0573b302651b8a9a89262c1730e37bf423cec511804c22"}, 1111 | {file = "google_api_core-2.11.0-py3-none-any.whl", hash = "sha256:ce222e27b0de0d7bc63eb043b956996d6dccab14cc3b690aaea91c9cc99dc16e"}, 1112 | ] 1113 | google-auth = [ 1114 | {file = "google-auth-2.16.1.tar.gz", hash = "sha256:5fd170986bce6bfd7bb5c845c4b8362edb1e0cba901e062196e83f8bb5d5d32c"}, 1115 | {file = "google_auth-2.16.1-py2.py3-none-any.whl", hash = "sha256:75d76ea857df65938e1f71dcbcd7d0cd48e3f80b34b8870ba229c9292081f7ef"}, 1116 | ] 1117 | google-cloud-bigquery = [ 1118 | {file = "google-cloud-bigquery-3.6.0.tar.gz", hash = "sha256:5886c14f29097158d59afa74a6732dbdd583e6ef30dc9934a56ad532906de356"}, 1119 | {file = "google_cloud_bigquery-3.6.0-py2.py3-none-any.whl", hash = "sha256:ed875c3a52050d140660850f04aaa59c1ec03b420a31fa7cc643a1726fc784d1"}, 1120 | ] 1121 | google-cloud-core = [ 1122 | {file = "google-cloud-core-2.3.2.tar.gz", hash = "sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a"}, 1123 | {file = "google_cloud_core-2.3.2-py2.py3-none-any.whl", hash = "sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe"}, 1124 | ] 1125 | google-cloud-dataproc = [ 1126 | {file = "google-cloud-dataproc-5.0.3.tar.gz", hash = "sha256:804e0fc890ab8047a4a91dd2e18354b69df277600eb7b4e62afbc3689e2cb64d"}, 1127 | {file = "google_cloud_dataproc-5.0.3-py2.py3-none-any.whl", hash = "sha256:3d770c07e61f76a02ad44917c492d44d80baa72516df0106435a09c030791c36"}, 1128 | {file = "google-cloud-dataproc-5.4.0.tar.gz", hash = "sha256:a0c5fe5cc8259a0bb6b1f4445714aafc4f5fa047f8f54cc7133914ba97856f5e"}, 1129 | {file = "google_cloud_dataproc-5.4.0-py2.py3-none-any.whl", hash = "sha256:6c0e8e80189ab7cf1a792e82269efd63bb80fbeaa19276847f96f53df5a13ee8"}, 1130 | ] 1131 | google-cloud-storage = [ 1132 | {file = "google-cloud-storage-2.7.0.tar.gz", hash = "sha256:1ac2d58d2d693cb1341ebc48659a3527be778d9e2d8989697a2746025928ff17"}, 1133 | {file = "google_cloud_storage-2.7.0-py2.py3-none-any.whl", hash = "sha256:f78a63525e72dd46406b255bbdf858a22c43d6bad8dc5bdeb7851a42967e95a1"}, 1134 | ] 1135 | google-crc32c = [ 1136 | {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, 1137 | {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, 1138 | {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, 1139 | {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, 1140 | {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, 1141 | {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, 1142 | {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, 1143 | {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, 1144 | {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, 1145 | {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, 1146 | {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, 1147 | {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, 1148 | {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, 1149 | {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, 1150 | {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, 1151 | {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, 1152 | {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, 1153 | {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, 1154 | {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, 1155 | {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, 1156 | {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, 1157 | {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, 1158 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, 1159 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, 1160 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, 1161 | {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, 1162 | {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, 1163 | {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, 1164 | {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, 1165 | {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, 1166 | {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, 1167 | {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, 1168 | {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, 1169 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, 1170 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, 1171 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, 1172 | {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, 1173 | {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, 1174 | {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, 1175 | {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, 1176 | {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, 1177 | {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, 1178 | {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, 1179 | {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, 1180 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, 1181 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, 1182 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, 1183 | {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, 1184 | {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, 1185 | {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, 1186 | {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, 1187 | {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, 1188 | {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, 1189 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, 1190 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, 1191 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, 1192 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, 1193 | {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, 1194 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, 1195 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, 1196 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, 1197 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, 1198 | {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, 1199 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, 1200 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, 1201 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, 1202 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, 1203 | {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, 1204 | ] 1205 | google-resumable-media = [ 1206 | {file = "google-resumable-media-2.4.1.tar.gz", hash = "sha256:15b8a2e75df42dc6502d1306db0bce2647ba6013f9cd03b6e17368c0886ee90a"}, 1207 | {file = "google_resumable_media-2.4.1-py2.py3-none-any.whl", hash = "sha256:831e86fd78d302c1a034730a0c6e5369dd11d37bad73fa69ca8998460d5bae8d"}, 1208 | ] 1209 | googleapis-common-protos = [ 1210 | {file = "googleapis-common-protos-1.58.0.tar.gz", hash = "sha256:c727251ec025947d545184ba17e3578840fc3a24a0516a020479edab660457df"}, 1211 | {file = "googleapis_common_protos-1.58.0-py2.py3-none-any.whl", hash = "sha256:ca3befcd4580dab6ad49356b46bf165bb68ff4b32389f028f1abd7c10ab9519a"}, 1212 | ] 1213 | grpc-google-iam-v1 = [ 1214 | {file = "grpc-google-iam-v1-0.12.6.tar.gz", hash = "sha256:2bc4b8fdf22115a65d751c9317329322602c39b7c86a289c9b72d228d960ef5f"}, 1215 | {file = "grpc_google_iam_v1-0.12.6-py2.py3-none-any.whl", hash = "sha256:5c10f3d8dc2d88678ab1a9b0cb5482735c5efee71e6c0cd59f872eef22913f5c"}, 1216 | ] 1217 | grpcio = [ 1218 | {file = "grpcio-1.51.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:f601aaeae18dab81930fb8d4f916b0da21e89bb4b5f7367ef793f46b4a76b7b0"}, 1219 | {file = "grpcio-1.51.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:eef0450a4b5ed11feab639bf3eb1b6e23d0efa9b911bf7b06fb60e14f5f8a585"}, 1220 | {file = "grpcio-1.51.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:82b0ad8ac825d4bb31bff9f638557c045f4a6d824d84b21e893968286f88246b"}, 1221 | {file = "grpcio-1.51.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3667c06e37d6cd461afdd51cefe6537702f3d1dc5ff4cac07e88d8b4795dc16f"}, 1222 | {file = "grpcio-1.51.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3709048fe0aa23dda09b3e69849a12055790171dab9e399a72ea8f9dfbf9ac80"}, 1223 | {file = "grpcio-1.51.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:200d69857f9910f7458b39b9bcf83ee4a180591b40146ba9e49314e3a7419313"}, 1224 | {file = "grpcio-1.51.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cd9a5e68e79c5f031500e67793048a90209711e0854a9ddee8a3ce51728de4e5"}, 1225 | {file = "grpcio-1.51.3-cp310-cp310-win32.whl", hash = "sha256:6604f614016127ae10969176bbf12eb0e03d2fb3d643f050b3b69e160d144fb4"}, 1226 | {file = "grpcio-1.51.3-cp310-cp310-win_amd64.whl", hash = "sha256:e95c7ccd4c5807adef1602005513bf7c7d14e5a41daebcf9d8d30d8bf51b8f81"}, 1227 | {file = "grpcio-1.51.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:5e77ee138100f0bb55cbd147840f87ee6241dbd25f09ea7cd8afe7efff323449"}, 1228 | {file = "grpcio-1.51.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:68a7514b754e38e8de9075f7bb4dee919919515ec68628c43a894027e40ddec4"}, 1229 | {file = "grpcio-1.51.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c1b9f8afa62ff265d86a4747a2990ec5a96e4efce5d5888f245a682d66eca47"}, 1230 | {file = "grpcio-1.51.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8de30f0b417744288cec65ec8cf84b8a57995cf7f1e84ccad2704d93f05d0aae"}, 1231 | {file = "grpcio-1.51.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b69c7adc7ed60da1cb1b502853db61f453fc745f940cbcc25eb97c99965d8f41"}, 1232 | {file = "grpcio-1.51.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d81528ffe0e973dc840ec73a4132fd18b8203ad129d7410155d951a0a7e4f5d0"}, 1233 | {file = "grpcio-1.51.3-cp311-cp311-win32.whl", hash = "sha256:040eb421613b57c696063abde405916dd830203c184c9000fc8c3b3b3c950325"}, 1234 | {file = "grpcio-1.51.3-cp311-cp311-win_amd64.whl", hash = "sha256:2a8e17286c4240137d933b8ca506465472248b4ce0fe46f3404459e708b65b68"}, 1235 | {file = "grpcio-1.51.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:d5cd1389669a847555df54177b911d9ff6f17345b2a6f19388707b7a9f724c88"}, 1236 | {file = "grpcio-1.51.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:be1bf35ce82cdbcac14e39d5102d8de4079a1c1a6a06b68e41fcd9ef64f9dd28"}, 1237 | {file = "grpcio-1.51.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:5eed34994c095e2bf7194ffac7381c6068b057ef1e69f8f08db77771350a7566"}, 1238 | {file = "grpcio-1.51.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9a7d88082b2a17ae7bd3c2354d13bab0453899e0851733f6afa6918373f476"}, 1239 | {file = "grpcio-1.51.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c8abbc5f837111e7bd619612eedc223c290b0903b952ce0c7b00840ea70f14"}, 1240 | {file = "grpcio-1.51.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:165b05af77e6aecb4210ae7663e25acf234ba78a7c1c157fa5f2efeb0d6ec53c"}, 1241 | {file = "grpcio-1.51.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54e36c2ee304ff15f2bfbdc43d2b56c63331c52d818c364e5b5214e5bc2ad9f6"}, 1242 | {file = "grpcio-1.51.3-cp37-cp37m-win32.whl", hash = "sha256:cd0daac21d9ef5e033a5100c1d3aa055bbed28bfcf070b12d8058045c4e821b1"}, 1243 | {file = "grpcio-1.51.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2fdd6333ce96435408565a9dbbd446212cd5d62e4d26f6a3c0feb1e3c35f1cc8"}, 1244 | {file = "grpcio-1.51.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:54b0c29bdd9a3b1e1b61443ab152f060fc719f1c083127ab08d03fac5efd51be"}, 1245 | {file = "grpcio-1.51.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:ffaaf7e93fcb437356b5a4b23bf36e8a3d0221399ff77fd057e4bc77776a24be"}, 1246 | {file = "grpcio-1.51.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:eafbe7501a3268d05f2e450e1ddaffb950d842a8620c13ec328b501d25d2e2c3"}, 1247 | {file = "grpcio-1.51.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881ecb34feabf31c6b3b9bbbddd1a5b57e69f805041e5a2c6c562a28574f71c4"}, 1248 | {file = "grpcio-1.51.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e860a3222139b41d430939bbec2ec9c3f6c740938bf7a04471a9a8caaa965a2e"}, 1249 | {file = "grpcio-1.51.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:49ede0528e9dac7e8a9fe30b16c73b630ddd9a576bf4b675eb6b0c53ee5ca00f"}, 1250 | {file = "grpcio-1.51.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6972b009638b40a448d10e1bc18e2223143b8a7aa20d7def0d78dd4af4126d12"}, 1251 | {file = "grpcio-1.51.3-cp38-cp38-win32.whl", hash = "sha256:5694448256e3cdfe5bd358f1574a3f2f51afa20cc834713c4b9788d60b7cc646"}, 1252 | {file = "grpcio-1.51.3-cp38-cp38-win_amd64.whl", hash = "sha256:3ea4341efe603b049e8c9a5f13c696ca37fcdf8a23ca35f650428ad3606381d9"}, 1253 | {file = "grpcio-1.51.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:6c677581ce129f5fa228b8f418cee10bd28dd449f3a544ea73c8ba590ee49d0b"}, 1254 | {file = "grpcio-1.51.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:30e09b5e0531685e176f49679b6a3b190762cc225f4565e55a899f5e14b3aa62"}, 1255 | {file = "grpcio-1.51.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c831f31336e81243f85b6daff3e5e8a123302ce0ea1f2726ad752fd7a59f3aee"}, 1256 | {file = "grpcio-1.51.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cd2e4cefb724cab1ba2df4b7535a9980531b9ec51b4dbb5f137a1f3a3754ef0"}, 1257 | {file = "grpcio-1.51.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a0d0bf44438869d307f85a54f25a896ad6b4b0ca12370f76892ad732928d87"}, 1258 | {file = "grpcio-1.51.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c02abd55409bfb293371554adf6a4401197ec2133dd97727c01180889014ba4d"}, 1259 | {file = "grpcio-1.51.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2f8ff75e61e1227ba7a3f16b2eadbcc11d0a54096d52ab75a6b88cfbe56f55d1"}, 1260 | {file = "grpcio-1.51.3-cp39-cp39-win32.whl", hash = "sha256:6c99a73a6260bdf844b2e5ddad02dcd530310f80e1fa72c300fa19c1c7496962"}, 1261 | {file = "grpcio-1.51.3-cp39-cp39-win_amd64.whl", hash = "sha256:22bdfac4f7f27acdd4da359b5e7e1973dc74bf1ed406729b07d0759fde2f064b"}, 1262 | {file = "grpcio-1.51.3.tar.gz", hash = "sha256:be7b2265b7527bb12109a7727581e274170766d5b3c9258d4e466f4872522d7a"}, 1263 | ] 1264 | grpcio-status = [ 1265 | {file = "grpcio-status-1.48.2.tar.gz", hash = "sha256:53695f45da07437b7c344ee4ef60d370fd2850179f5a28bb26d8e2aa1102ec11"}, 1266 | {file = "grpcio_status-1.48.2-py3-none-any.whl", hash = "sha256:2c33bbdbe20188b2953f46f31af669263b6ee2a9b2d38fa0d36ee091532e21bf"}, 1267 | ] 1268 | grpclib = [ 1269 | {file = "grpclib-0.4.3.tar.gz", hash = "sha256:eadf2002fc5a25158b707c0338a6c0b96dd7fbdc6df66f7e515e7f041d56a940"}, 1270 | ] 1271 | h2 = [ 1272 | {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, 1273 | {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, 1274 | ] 1275 | hologram = [ 1276 | {file = "hologram-0.0.15-py3-none-any.whl", hash = "sha256:48ca81ed47da1c604b2d3b951424b600eb8a5785b00513e3b8e3ae8101f90145"}, 1277 | {file = "hologram-0.0.15.tar.gz", hash = "sha256:79b3d04df84d5a9d09c2e669ec5bcc50b1713ec79f4683cfdea85583b41e46f0"}, 1278 | ] 1279 | hpack = [ 1280 | {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, 1281 | {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, 1282 | ] 1283 | hyperframe = [ 1284 | {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, 1285 | {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, 1286 | ] 1287 | idna = [ 1288 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 1289 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 1290 | ] 1291 | isodate = [ 1292 | {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, 1293 | {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, 1294 | ] 1295 | isort = [ 1296 | {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, 1297 | {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, 1298 | ] 1299 | Jinja2 = [ 1300 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 1301 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 1302 | ] 1303 | jsonschema = [ 1304 | {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, 1305 | {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, 1306 | ] 1307 | leather = [ 1308 | {file = "leather-0.3.4-py2.py3-none-any.whl", hash = "sha256:5e741daee96e9f1e9e06081b8c8a10c4ac199301a0564cdd99b09df15b4603d2"}, 1309 | {file = "leather-0.3.4.tar.gz", hash = "sha256:b43e21c8fa46b2679de8449f4d953c06418666dc058ce41055ee8a8d3bb40918"}, 1310 | ] 1311 | Logbook = [ 1312 | {file = "Logbook-1.5.3-cp27-cp27m-win32.whl", hash = "sha256:56ee54c11df3377314cedcd6507638f015b4b88c0238c2e01b5eb44fd3a6ad1b"}, 1313 | {file = "Logbook-1.5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:2dc85f1510533fddb481e97677bb7bca913560862734c0b3b289bfed04f78c92"}, 1314 | {file = "Logbook-1.5.3-cp35-cp35m-win32.whl", hash = "sha256:94e2e11ff3c2304b0d09a36c6208e5ae756eb948b210e5cbd63cd8d27f911542"}, 1315 | {file = "Logbook-1.5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:97fee1bd9605f76335b169430ed65e15e457a844b2121bd1d90a08cf7e30aba0"}, 1316 | {file = "Logbook-1.5.3-cp36-cp36m-win32.whl", hash = "sha256:7c533eb728b3d220b1b5414ba4635292d149d79f74f6973b4aa744c850ca944a"}, 1317 | {file = "Logbook-1.5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:e18f7422214b1cf0240c56f884fd9c9b4ff9d0da2eabca9abccba56df7222f66"}, 1318 | {file = "Logbook-1.5.3-cp37-cp37m-win32.whl", hash = "sha256:8f76a2e7b1f72595f753228732f81ce342caf03babc3fed6bbdcf366f2f20f18"}, 1319 | {file = "Logbook-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0cf2cdbfb65a03b5987d19109dacad13417809dcf697f66e1a7084fb21744ea9"}, 1320 | {file = "Logbook-1.5.3.tar.gz", hash = "sha256:66f454ada0f56eae43066f604a222b09893f98c1adc18df169710761b8f32fe8"}, 1321 | ] 1322 | MarkupSafe = [ 1323 | {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, 1324 | {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, 1325 | {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, 1326 | {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, 1327 | {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, 1328 | {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, 1329 | {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, 1330 | {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, 1331 | {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, 1332 | {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, 1333 | {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, 1334 | {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, 1335 | {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, 1336 | {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, 1337 | {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, 1338 | {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, 1339 | {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, 1340 | {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, 1341 | {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, 1342 | {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, 1343 | {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, 1344 | {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, 1345 | {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, 1346 | {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, 1347 | {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, 1348 | {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, 1349 | {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, 1350 | {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, 1351 | {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, 1352 | {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, 1353 | {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, 1354 | {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, 1355 | {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, 1356 | {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, 1357 | {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, 1358 | {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, 1359 | {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, 1360 | {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, 1361 | {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, 1362 | {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, 1363 | {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, 1364 | {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, 1365 | {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, 1366 | {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, 1367 | {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, 1368 | {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, 1369 | {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, 1370 | {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, 1371 | {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, 1372 | {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, 1373 | ] 1374 | mashumaro = [ 1375 | {file = "mashumaro-3.3.1-py3-none-any.whl", hash = "sha256:74ae7704e4ac8813ff701909aa8d96a405156dc2e1e3fd34ac07db7f0823a54a"}, 1376 | {file = "mashumaro-3.3.1.tar.gz", hash = "sha256:997ed0a4ce64967b96ff65f5ca76b8e5e459a4ec7a6a0f73625a067004a801c9"}, 1377 | ] 1378 | minimal-snowplow-tracker = [ 1379 | {file = "minimal-snowplow-tracker-0.0.2.tar.gz", hash = "sha256:acabf7572db0e7f5cbf6983d495eef54081f71be392330eb3aadb9ccb39daaa4"}, 1380 | ] 1381 | msgpack = [ 1382 | {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, 1383 | {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, 1384 | {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, 1385 | {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, 1386 | {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, 1387 | {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, 1388 | {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, 1389 | {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, 1390 | {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, 1391 | {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, 1392 | {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, 1393 | {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, 1394 | {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, 1395 | {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, 1396 | {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, 1397 | {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, 1398 | {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, 1399 | {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, 1400 | {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, 1401 | {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, 1402 | {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, 1403 | {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, 1404 | {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, 1405 | {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, 1406 | {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, 1407 | {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, 1408 | {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, 1409 | {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, 1410 | {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, 1411 | {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, 1412 | {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, 1413 | {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, 1414 | {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, 1415 | {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, 1416 | {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, 1417 | {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, 1418 | {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, 1419 | {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, 1420 | {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, 1421 | {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, 1422 | {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, 1423 | {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, 1424 | {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, 1425 | {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, 1426 | {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, 1427 | {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, 1428 | {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, 1429 | {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, 1430 | {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, 1431 | {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, 1432 | {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, 1433 | {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, 1434 | ] 1435 | multidict = [ 1436 | {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, 1437 | {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, 1438 | {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, 1439 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, 1440 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, 1441 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, 1442 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, 1443 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, 1444 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, 1445 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, 1446 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, 1447 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, 1448 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, 1449 | {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, 1450 | {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, 1451 | {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, 1452 | {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, 1453 | {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, 1454 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, 1455 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, 1456 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, 1457 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, 1458 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, 1459 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, 1460 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, 1461 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, 1462 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, 1463 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, 1464 | {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, 1465 | {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, 1466 | {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, 1467 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, 1468 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, 1469 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, 1470 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, 1471 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, 1472 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, 1473 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, 1474 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, 1475 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, 1476 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, 1477 | {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, 1478 | {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, 1479 | {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, 1480 | {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, 1481 | {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, 1482 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, 1483 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, 1484 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, 1485 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, 1486 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, 1487 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, 1488 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, 1489 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, 1490 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, 1491 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, 1492 | {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, 1493 | {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, 1494 | {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, 1495 | {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, 1496 | {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, 1497 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, 1498 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, 1499 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, 1500 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, 1501 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, 1502 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, 1503 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, 1504 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, 1505 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, 1506 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, 1507 | {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, 1508 | {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, 1509 | {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, 1510 | ] 1511 | networkx = [ 1512 | {file = "networkx-2.8.8-py3-none-any.whl", hash = "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524"}, 1513 | {file = "networkx-2.8.8.tar.gz", hash = "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e"}, 1514 | ] 1515 | packaging = [ 1516 | {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, 1517 | {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, 1518 | ] 1519 | parsedatetime = [ 1520 | {file = "parsedatetime-2.4-py2-none-any.whl", hash = "sha256:9ee3529454bf35c40a77115f5a596771e59e1aee8c53306f346c461b8e913094"}, 1521 | {file = "parsedatetime-2.4.tar.gz", hash = "sha256:3d817c58fb9570d1eec1dd46fa9448cd644eeed4fb612684b02dfda3a79cb84b"}, 1522 | ] 1523 | pathspec = [ 1524 | {file = "pathspec-0.10.3-py3-none-any.whl", hash = "sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6"}, 1525 | {file = "pathspec-0.10.3.tar.gz", hash = "sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6"}, 1526 | ] 1527 | proto-plus = [ 1528 | {file = "proto-plus-1.22.2.tar.gz", hash = "sha256:0e8cda3d5a634d9895b75c573c9352c16486cb75deb0e078b5fda34db4243165"}, 1529 | {file = "proto_plus-1.22.2-py3-none-any.whl", hash = "sha256:de34e52d6c9c6fcd704192f09767cb561bb4ee64e70eede20b0834d841f0be4d"}, 1530 | ] 1531 | protobuf = [ 1532 | {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, 1533 | {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, 1534 | {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, 1535 | {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, 1536 | {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, 1537 | {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, 1538 | {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, 1539 | {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, 1540 | {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, 1541 | {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, 1542 | {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, 1543 | {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, 1544 | {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, 1545 | {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, 1546 | {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, 1547 | {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, 1548 | {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, 1549 | {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, 1550 | {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, 1551 | {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, 1552 | {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, 1553 | {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, 1554 | ] 1555 | pyasn1 = [ 1556 | {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, 1557 | {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, 1558 | ] 1559 | pyasn1-modules = [ 1560 | {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, 1561 | {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, 1562 | ] 1563 | pycparser = [ 1564 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 1565 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 1566 | ] 1567 | pyrsistent = [ 1568 | {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, 1569 | {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, 1570 | {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, 1571 | {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, 1572 | {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, 1573 | {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, 1574 | {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, 1575 | {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, 1576 | {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, 1577 | {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, 1578 | {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, 1579 | {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, 1580 | {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, 1581 | {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, 1582 | {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, 1583 | {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, 1584 | {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, 1585 | {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, 1586 | {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, 1587 | {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, 1588 | {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, 1589 | {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, 1590 | {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, 1591 | {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, 1592 | {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, 1593 | {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, 1594 | {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, 1595 | ] 1596 | python-dateutil = [ 1597 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 1598 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 1599 | ] 1600 | python-slugify = [ 1601 | {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, 1602 | {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, 1603 | ] 1604 | pytimeparse = [ 1605 | {file = "pytimeparse-1.1.8-py2.py3-none-any.whl", hash = "sha256:04b7be6cc8bd9f5647a6325444926c3ac34ee6bc7e69da4367ba282f076036bd"}, 1606 | {file = "pytimeparse-1.1.8.tar.gz", hash = "sha256:e86136477be924d7e670646a98561957e8ca7308d44841e21f5ddea757556a0a"}, 1607 | ] 1608 | pytz = [ 1609 | {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, 1610 | {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, 1611 | ] 1612 | PyYAML = [ 1613 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 1614 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 1615 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 1616 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 1617 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 1618 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 1619 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 1620 | {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, 1621 | {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, 1622 | {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, 1623 | {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, 1624 | {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, 1625 | {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, 1626 | {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, 1627 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 1628 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 1629 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 1630 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 1631 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 1632 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 1633 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 1634 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 1635 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 1636 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 1637 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 1638 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 1639 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 1640 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 1641 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 1642 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 1643 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 1644 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 1645 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 1646 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 1647 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 1648 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 1649 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 1650 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 1651 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 1652 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 1653 | ] 1654 | requests = [ 1655 | {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, 1656 | {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, 1657 | ] 1658 | rsa = [ 1659 | {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, 1660 | {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, 1661 | ] 1662 | setuptools = [ 1663 | {file = "setuptools-67.4.0-py3-none-any.whl", hash = "sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251"}, 1664 | {file = "setuptools-67.4.0.tar.gz", hash = "sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330"}, 1665 | ] 1666 | six = [ 1667 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1668 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1669 | ] 1670 | sqlparse = [ 1671 | {file = "sqlparse-0.4.3-py3-none-any.whl", hash = "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34"}, 1672 | {file = "sqlparse-0.4.3.tar.gz", hash = "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268"}, 1673 | ] 1674 | stringcase = [ 1675 | {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"}, 1676 | ] 1677 | text-unidecode = [ 1678 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, 1679 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, 1680 | ] 1681 | typing-extensions = [ 1682 | {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, 1683 | {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, 1684 | ] 1685 | urllib3 = [ 1686 | {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, 1687 | {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, 1688 | ] 1689 | Werkzeug = [ 1690 | {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, 1691 | {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, 1692 | ] 1693 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "end-to-end-data-engineering" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["eduardo machado "] 6 | readme = "README.md" 7 | packages = [{include = "end_to_end_data_engineering"}] 8 | 9 | [tool.poetry.dependencies] 10 | python = "^3.9" 11 | dbt-bigquery = "^1.4.1" 12 | isort = "^5.12.0" 13 | 14 | 15 | [build-system] 16 | requires = ["poetry-core"] 17 | build-backend = "poetry.core.masonry.api" 18 | -------------------------------------------------------------------------------- /terraform/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | google = { 4 | source = "hashicorp/google" 5 | version = "4.51.0" 6 | } 7 | } 8 | } 9 | 10 | provider "google" { 11 | 12 | project = var.project 13 | region = var.region 14 | zone = var.zone 15 | } 16 | 17 | 18 | resource "google_storage_bucket" "data-lake-bucket" { 19 | name = "${local.data_lake_bucket}_${var.project}" # Concatenating DL bucket & Project name for unique naming 20 | location = var.region 21 | 22 | # Optional, but recommended settings: 23 | storage_class = var.storage_class 24 | uniform_bucket_level_access = true 25 | 26 | versioning { 27 | enabled = true 28 | } 29 | 30 | lifecycle_rule { 31 | action { 32 | type = "Delete" 33 | } 34 | condition { 35 | age = 30 // days 36 | } 37 | } 38 | 39 | force_destroy = true 40 | } 41 | 42 | resource "google_bigquery_dataset" "dataset" { 43 | dataset_id = var.BQ_DATASET 44 | project = var.project 45 | location = var.region 46 | } 47 | -------------------------------------------------------------------------------- /terraform/terraform.tfstate.backup: -------------------------------------------------------------------------------- 1 | { 2 | "version": 4, 3 | "terraform_version": "1.3.9", 4 | "serial": 7, 5 | "lineage": "b1bd22ba-e507-26df-0e58-a9c7c78ccf4b", 6 | "outputs": {}, 7 | "resources": [ 8 | { 9 | "mode": "managed", 10 | "type": "google_bigquery_dataset", 11 | "name": "dataset", 12 | "provider": "provider[\"registry.terraform.io/hashicorp/google\"]", 13 | "instances": [ 14 | { 15 | "schema_version": 0, 16 | "attributes": { 17 | "access": [ 18 | { 19 | "dataset": [], 20 | "domain": "", 21 | "group_by_email": "", 22 | "role": "OWNER", 23 | "routine": [], 24 | "special_group": "", 25 | "user_by_email": "eduardoshy1teste@gmail.com", 26 | "view": [] 27 | }, 28 | { 29 | "dataset": [], 30 | "domain": "", 31 | "group_by_email": "", 32 | "role": "OWNER", 33 | "routine": [], 34 | "special_group": "projectOwners", 35 | "user_by_email": "", 36 | "view": [] 37 | }, 38 | { 39 | "dataset": [], 40 | "domain": "", 41 | "group_by_email": "", 42 | "role": "READER", 43 | "routine": [], 44 | "special_group": "projectReaders", 45 | "user_by_email": "", 46 | "view": [] 47 | }, 48 | { 49 | "dataset": [], 50 | "domain": "", 51 | "group_by_email": "", 52 | "role": "WRITER", 53 | "routine": [], 54 | "special_group": "projectWriters", 55 | "user_by_email": "", 56 | "view": [] 57 | } 58 | ], 59 | "creation_time": 1677680145018, 60 | "dataset_id": "raw_data", 61 | "default_encryption_configuration": [], 62 | "default_partition_expiration_ms": 0, 63 | "default_table_expiration_ms": 0, 64 | "delete_contents_on_destroy": false, 65 | "description": "", 66 | "etag": "2DQ1iZgvF4fJUwyMOnlcHQ==", 67 | "friendly_name": "", 68 | "id": "projects/allspark-377318/datasets/raw_data", 69 | "labels": {}, 70 | "last_modified_time": 1677680145018, 71 | "location": "us-central1", 72 | "max_time_travel_hours": "", 73 | "project": "allspark-377318", 74 | "self_link": "https://bigquery.googleapis.com/bigquery/v2/projects/allspark-377318/datasets/raw_data", 75 | "timeouts": null 76 | }, 77 | "sensitive_attributes": [], 78 | "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19" 79 | } 80 | ] 81 | }, 82 | { 83 | "mode": "managed", 84 | "type": "google_storage_bucket", 85 | "name": "data-lake-bucket", 86 | "provider": "provider[\"registry.terraform.io/hashicorp/google\"]", 87 | "instances": [ 88 | { 89 | "schema_version": 0, 90 | "attributes": { 91 | "autoclass": [], 92 | "cors": [], 93 | "custom_placement_config": [], 94 | "default_event_based_hold": false, 95 | "encryption": [], 96 | "force_destroy": true, 97 | "id": "dtc_data_lake_allspark-377318", 98 | "labels": null, 99 | "lifecycle_rule": [ 100 | { 101 | "action": [ 102 | { 103 | "storage_class": "", 104 | "type": "Delete" 105 | } 106 | ], 107 | "condition": [ 108 | { 109 | "age": 30, 110 | "created_before": "", 111 | "custom_time_before": "", 112 | "days_since_custom_time": 0, 113 | "days_since_noncurrent_time": 0, 114 | "matches_prefix": [], 115 | "matches_storage_class": [], 116 | "matches_suffix": [], 117 | "noncurrent_time_before": "", 118 | "num_newer_versions": 0, 119 | "with_state": "ANY" 120 | } 121 | ] 122 | } 123 | ], 124 | "location": "US", 125 | "logging": [], 126 | "name": "dtc_data_lake_allspark-377318", 127 | "project": "allspark-377318", 128 | "public_access_prevention": "inherited", 129 | "requester_pays": false, 130 | "retention_policy": [], 131 | "self_link": "https://www.googleapis.com/storage/v1/b/dtc_data_lake_allspark-377318", 132 | "storage_class": "STANDARD", 133 | "timeouts": null, 134 | "uniform_bucket_level_access": true, 135 | "url": "gs://dtc_data_lake_allspark-377318", 136 | "versioning": [ 137 | { 138 | "enabled": true 139 | } 140 | ], 141 | "website": [] 142 | }, 143 | "sensitive_attributes": [], 144 | "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoyNDAwMDAwMDAwMDAsInJlYWQiOjI0MDAwMDAwMDAwMCwidXBkYXRlIjoyNDAwMDAwMDAwMDB9fQ==" 145 | } 146 | ] 147 | } 148 | ], 149 | "check_results": null 150 | } 151 | -------------------------------------------------------------------------------- /terraform/variable.tf: -------------------------------------------------------------------------------- 1 | variable "project" {} 2 | 3 | variable "credentials_file" {} 4 | 5 | variable "region" { 6 | default = "US" 7 | } 8 | 9 | variable "zone" { 10 | default = "US" 11 | } 12 | 13 | 14 | variable "storage_class" { 15 | description = "Storage class type for your bucket. Check official docs for more info." 16 | default = "STANDARD" 17 | } 18 | 19 | 20 | 21 | variable "BQ_DATASET" { 22 | description = "BigQuery Dataset that raw data (from GCS) will be written to" 23 | type = string 24 | default = "raw_data" 25 | } 26 | 27 | 28 | locals { 29 | data_lake_bucket = "dtc_data_lake" 30 | } 31 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eduwxyz/end_to_end-Data-Engineering/4537fa07b16e096c8ca6655e0f2bbec81f997218/tests/__init__.py --------------------------------------------------------------------------------