diff --git a/.gitignore b/.gitignore index 6b4236d5e..237926139 100644 --- a/.gitignore +++ b/.gitignore @@ -176,3 +176,6 @@ metastore_db/ # Kubernetes/Helm secrets.yaml + +# GigaSpatial data (Google/MS buildings, GHSL, WorldPop) +dagster/bronze/ diff --git a/azure/templates/create-config.yaml b/azure/templates/create-config.yaml index ae68303ef..ebf22954b 100644 --- a/azure/templates/create-config.yaml +++ b/azure/templates/create-config.yaml @@ -86,6 +86,8 @@ jobs: CATALOG_BASE: "$(catalogBase)" DATABASE_ID: "$(databaseId)" SLACK_WORKFLOW_WEBHOOK: "$(slackWorkflowWebhook)" + GIGAMETER_API_BASE_URL: "$(gigameterApiBaseUrl)" + GIGAMETER_API_TOKEN: "$(gigameterApiToken)" - task: Kubernetes@1 displayName: Create authproxy secrets diff --git a/azure/templates/variables.yaml b/azure/templates/variables.yaml index 53984a719..6f760eeef 100644 --- a/azure/templates/variables.yaml +++ b/azure/templates/variables.yaml @@ -52,4 +52,6 @@ variables: catalogBase: $(CATALOG_BASE) databaseId: $(DATABASE_ID) slackWorkflowWebhook: $(SLACK_WORKFLOW_WEBHOOK) + gigameterApiBaseUrl: $(GIGAMETER_API_BASE_URL) + gigameterApiToken: $(GIGAMETER_API_TOKEN) system.debug: true diff --git a/dagster/models/file_upload.py b/dagster/models/file_upload.py index 30dc1f6f8..33a4f899e 100644 --- a/dagster/models/file_upload.py +++ b/dagster/models/file_upload.py @@ -15,6 +15,7 @@ class DQStatusEnum(Enum): ERROR = "ERROR" TIMEOUT = "TIMEOUT" SKIPPED = "SKIPPED" + FILE_CHECKED = "FILE_CHECKED" class FileUpload(BaseModel): diff --git a/dagster/models/mappings.py b/dagster/models/mappings.py index 94dc212e2..ef1654cfe 100644 --- a/dagster/models/mappings.py +++ b/dagster/models/mappings.py @@ -5,6 +5,7 @@ VALID_PRIMITIVES = [ "string", "integer", + "int", "long", "float", "double", @@ -22,6 +23,7 @@ class TypeMapping(BaseModel): class TypeMappings(BaseModel): string: TypeMapping integer: TypeMapping + int: TypeMapping # Alias for integer long: TypeMapping float: TypeMapping double: TypeMapping diff --git a/dagster/poetry.lock b/dagster/poetry.lock index 9f482314a..843525d4c 100644 --- a/dagster/poetry.lock +++ b/dagster/poetry.lock @@ -1,135 +1,199 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. [[package]] name = "acryl-datahub" -version = "0.14.0.2" +version = "1.5.0" description = "A CLI to work with DataHub metadata" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["pipelines"] files = [ - {file = "acryl_datahub-0.14.0.2-py3-none-any.whl", hash = "sha256:aec6a32e7c5bf327d75ee6c120b93c226e3119fdb2185a26a7faa632a7076308"}, - {file = "acryl_datahub-0.14.0.2.tar.gz", hash = "sha256:7610a0c80dd934a2b456b302c5cb4c6c049886cb47b19bd0d666a18efe3d140f"}, + {file = "acryl_datahub-1.5.0-py3-none-any.whl", hash = "sha256:d394df7b2115af1994775d276a4852fbeb173f5c6d34a716daa85d0149fd3b1e"}, + {file = "acryl_datahub-1.5.0.tar.gz", hash = "sha256:a498f9314ffc4d35a5999ff90b784162820ded6792ad9c0a1fae40aa43af2bcf"}, ] [package.dependencies] aiohttp = "<4" -avro = ">=1.11.3,<1.12" -avro-gen3 = "0.7.13" -cached-property = "*" -click = ">=7.1.2" -click-default-group = "*" -click-spinner = "*" -Deprecated = "*" -docker = "*" -expandvars = ">=0.6.5" -humanfriendly = "*" -ijson = "*" -jsonref = "*" -jsonschema = "*" -mixpanel = ">=4.9.0" -packaging = "*" -progressbar2 = "*" -psutil = ">=5.8.0" -pydantic = [ - {version = ">=1.10.0,<1.10.3 || >1.10.3", optional = true, markers = "extra != \"azure-ad\""}, - {version = ">=1.10.0,<1.10.3 || >1.10.3,<2", optional = true, markers = "extra == \"azure-ad\""}, -] -python-dateutil = ">=2.8.0" -PyYAML = "*" -requests-file = "*" -"ruamel.yaml" = "*" -sentry-sdk = "*" -tabulate = "*" -termcolor = ">=1.0.0" -toml = ">=0.10.0" -typing-extensions = ">=3.7.4.3" -typing-inspect = "*" - -[package.extras] -abs = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "azure-core (==1.29.4)", "azure-identity (>=1.14.0)", "azure-storage-blob (>=12.19.0)", "azure-storage-file-datalake (>=12.14.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools (>=8.12.0)", "packaging", "parse (>=1.19.0)", "progressbar2", "psutil (>=5.8.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pydeequ (>=1.1.0,<1.2.0)", "pyspark (>=3.3.0,<3.4.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "smart-open[azure] (>=5.2.1)", "tableschema (>=1.20.2)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "ujson (>=5.2.0)", "wcmatch"] -airflow = ["Deprecated", "PyYAML", "acryl-datahub-airflow-plugin (==0.14.0.2)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -all = ["Deprecated", "GeoAlchemy2", "GitPython (>2)", "JPype1", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-pyhive[hive-pure-sasl] (==0.6.16)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "azure-core (==1.29.4)", "azure-identity (>=1.14.0)", "azure-storage-blob (>=12.19.0)", "azure-storage-file-datalake (>=12.14.0)", "boto3", "botocore (!=1.23.0)", "cached-property", "cachetools", "click (>=7.1.2)", "click-default-group", "click-spinner", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "confluent-kafka (>=1.9.0)", "cryptography", "cx-Oracle", "databricks-dbapi", "databricks-sdk (>=0.30.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "db-dtypes", "deepmerge (>=1.1.1)", "deltalake (>=0.6.3,!=0.6.4)", "deltalake (>=0.6.3,!=0.6.4,<0.18.0)", "docker", "elasticsearch (==7.13.4)", "expandvars (>=0.6.5)", "fastavro (>=1.2.0)", "filelock", "google-cloud-bigquery", "google-cloud-datacatalog (>=1.5.0)", "google-cloud-datacatalog-lineage (==0.2.2)", "google-cloud-logging (<=3.5.0)", "google-cloud-resource-manager", "gql (>=3.3.0)", "gql[requests] (>=3.3.0)", "great-expectations", "great-expectations (!=0.15.23,!=0.15.24,!=0.15.25,!=0.15.26)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "grpcio (>=1.44.0,<2)", "grpcio-tools (>=1.44.0,<2)", "hdbcli (>=2.11.20)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "lark[regex] (==1.1.4)", "lkml (>=1.3.4)", "looker-sdk (==23.0.0)", "mlflow-skinny (>=2.3.0)", "more-itertools", "more-itertools (>=8.12.0)", "moto[s3] (<5.0.0)", "msal", "msal (==1.22.0)", "nest-asyncio", "networkx (>=2.6.2)", "numpy (<2)", "okta (>=1.7.0,<1.8.0)", "packaging", "pandas", "pandas (<2.2.0)", "parse (>=1.19.0)", "pip", "progressbar2", "psutil (>=5.8.0)", "psycopg2-binary", "pyOpenSSL", "pyarrow (>=6.0.1)", "pydantic (<2)", "pydeequ (>=1.1.0,<1.2.0)", "pydruid (>=0.6.2)", "pyiceberg (>=0.4,<0.7)", "pymongo[srv] (>=3.11)", "pymysql (>=1.0.2)", "pyspark (>=3.3.0,<3.4.0)", "python-dateutil (>=2.8.0)", "python-ldap (>=2.4)", "python-liquid", "redash-toolbelt", "redshift-connector (>=2.1.0)", "requests", "requests-file", "requests-gssapi", "requests-ntlm", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "setuptools", "simple-salesforce", "slack-sdk (==3.18.1)", "smart-open[azure] (>=5.2.1)", "smart-open[s3] (>=5.2.1)", "snowflake-connector-python (>=3.4.0)", "snowflake-sqlalchemy (>=1.4.3)", "sql-metadata", "sqlalchemy", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1)", "sqlalchemy-cockroachdb (<2.0.0)", "sqlalchemy-hana (>=0.5.0)", "sqlalchemy-pytds (>=0.3)", "sqlalchemy-redshift (>=0.8.3)", "sqllineage (==1.3.8)", "sqlparse", "sqlparse (==0.4.4)", "tableauserverclient (>=0.24.0)", "tableschema (>=1.20.2)", "tabulate", "tenacity (!=8.4.0)", "tenacity (>=8.0.1)", "teradatasqlalchemy (>=17.20.0.0)", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)", "trino[sqlalchemy] (>=0.308)", "ujson (>=5.2.0)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)", "wcmatch", "websocket-client"] -athena = ["Deprecated", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1)", "sqlparse", "tabulate", "tenacity (!=8.4.0)", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -azure-ad = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -base = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -bigquery = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "google-cloud-bigquery", "google-cloud-datacatalog (>=1.5.0)", "google-cloud-datacatalog-lineage (==0.2.2)", "google-cloud-logging (<=3.5.0)", "google-cloud-resource-manager", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools (>=8.12.0)", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -circuit-breaker = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "gql (>=3.3.0)", "gql[requests] (>=3.3.0)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -clickhouse = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -clickhouse-usage = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] +avro = ">=1.11.3,<1.13" +avro-gen3 = "0.7.16" +cached_property = "<3.0.0" +click = ">=7.1.2,<8.2.0 || >8.2.0,<9.0.0" +click-default-group = "<2.0.0" +click-spinner = "<0.2.0" +Deprecated = "<2.0.0" +docker = "<8.0.0" +expandvars = ">=0.6.5,<2.0.0" +graphql-core = ">=3.0.0,<4.0.0" +humanfriendly = "<11.0.0" +ijson = "<4.0.0" +jsonref = "<2.0.0" +jsonschema = "<5.0.0" +mixpanel = ">=4.9.0,<6.0.0" +packaging = "<26.0.0" +progressbar2 = "<5.0.0" +psutil = ">=5.8.0,<8.0.0" +pydantic = ">=2.4.0,<3.0.0" +python-dateutil = ">=2.8.0,<3.0.0" +python-json-logger = ">=2.0.0,<5.0.0" +PyYAML = "<7.0.0" +requests_file = "<4.0.0" +"ruamel.yaml" = "<0.19.0" +sentry-sdk = ">=1.33.1,<3.0.0" +setuptools = "<82.0.0" +tabulate = "<0.10.0" +toml = ">=0.10.0,<=0.10.2" +typing_extensions = ">=4.8.0,<5.0.0" +typing-inspect = "<0.10.0" + +[package.extras] +abs = ["azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "cachetools (<6.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydeequ (>=1.1.0,<2.0.0)", "pyspark (>=3.5.6,<3.6.0)", "smart-open[azure] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "wcmatch (<11.0.0)"] +abs-slim = ["azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "smart-open[azure] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "wcmatch (<11.0.0)"] +all = ["Authlib (>=1.6.7,<2.0.0)", "GeoAlchemy2 (<0.19.0)", "GitPython (>2,<4.0.0)", "IPython (!=8.22.0,<9.0.0)", "JPype1 (<2.0.0)", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "atlassian-python-api (>=3.41.0,<5.0.0)", "azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-mgmt-datafactory (>=9.0.0,<10.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "cassandra-driver (>=3.28.0,<4.0.0)", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "confluent_kafka[avro,schemaregistry] (>=2.10.1,<2.13.0)", "cryptography (>=46.0.5,<47.0.0)", "databricks-dbapi (<0.7.0)", "databricks-sdk (>=0.30.0,<1.0.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "db-dtypes", "deepmerge (>=1.1.1,<3.0.0)", "deltalake (>=0.6.3,!=0.6.4,!=0.18.0,<1.0.0) ; platform_system == \"Darwin\" and platform_machine == \"arm64\"", "deltalake (>=0.6.3,!=0.6.4,<1.0.0) ; platform_system != \"Darwin\" or platform_machine != \"arm64\"", "dnspython (==2.7.0)", "elasticsearch (==7.13.4)", "fastavro (>=1.2.0,<2.0.0)", "filelock (>=3.13.1,<4.0.0)", "flatdict (!=4.0.1)", "google-cloud-aiplatform (>=1.80.0,<2.0.0)", "google-cloud-bigquery (<4.0.0)", "google-cloud-datacatalog (>=1.5.0,<4.0.0)", "google-cloud-datacatalog-lineage (>=0.5.0,<1.0.0)", "google-cloud-dataplex (<3.0.0)", "google-cloud-logging (<4.0.0)", "google-cloud-resource-manager (<2.0.0)", "gql[requests] (>=4.0.0)", "greenlet (<4.0.0)", "grpcio (>=1.44.0,<2.0.0)", "grpcio-tools (>=1.44.0,<2.0.0)", "hdbcli (>=2.11.20,<3.0.0) ; platform_machine != \"aarch64\" and platform_machine != \"arm64\"", "ibm_db_sa (==0.4.3) ; platform_machine == \"x86_64\" or platform_system == \"Darwin\"", "jdk4py (>=21.0,<22.0)", "jsonpath-ng (==1.7.0)", "jupyter_server (>=2.14.1,<3.0.0)", "kerberos (>=1.3.0,<2.0.0)", "litellm (==1.80.5)", "lkml (>=1.3.4,<2.0.0)", "looker-sdk (>=23.0.0,<26.0.0)", "mini-racer (==0.14.1)", "mlflow-skinny (>=2.3.0,<2.21.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "msal (>=1.31.1,<2.0.0)", "neo4j (<7.0.0)", "nest-asyncio (<2.0.0)", "networkx (>=2.6.2,<4.0.0)", "numpy (<2)", "okta (>=1.7.0,<1.8.0)", "openpyxl (>=3.1.5,<4.0.0)", "oracledb (<4.0.0)", "pandas (<2.2.0)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "protobuf (>=5.0.0,<7.0.0)", "psycopg2-binary (<3.0.0)", "pyOpenSSL (<26.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydantic (<2.12)", "pydeequ (>=1.1.0,<2.0.0)", "pydruid (>=0.6.2,<=0.6.9)", "pyiceberg[adlfs,dynamodb,glue,hive,pyarrow,s3fs,snappy,zstandard] (>=0.9.0,<=0.10.0)", "pymetastore (>=0.4.2,<1.0.0)", "pymongo[aws] (>=4.8.0,<5.0.0)", "pymysql (>=1.0.2,<2.0.0)", "pyodata (>=1.11.1,<2.0.0)", "pyodbc (>=4.0,<5.0)", "pyspark (>=3.5.6,<3.6.0)", "python-ldap (>=2.4,<4.0.0)", "python-liquid (<2)", "rdflib (==6.3.2)", "redash-toolbelt (<0.2.0)", "redshift-connector (>=2.1.5,<3.0.0)", "requests (==2.32.5)", "requests-gssapi (<2.0.0)", "requests_file (==3.0.1)", "requests_ntlm (<2.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "setuptools (<82)", "simple-salesforce (<2.0.0)", "slack-sdk (==3.18.1)", "smart-open[azure,gcs,s3] (>=5.2.1,<8.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "sql-metadata (<3.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlalchemy-cockroachdb (<2.0.0)", "sqlalchemy-hana (>=0.5.0,<5.0.0) ; platform_machine != \"aarch64\" and platform_machine != \"arm64\"", "sqlalchemy-pytds (>=0.3,<2.0.0)", "sqlalchemy-redshift (>=0.8.3,<=0.8.14)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "stopit (==1.1.2)", "tableauserverclient (>=0.24.0,<=0.40)", "tableschema (>=1.20.2,<2.0.0)", "tenacity (>=8.0.1,!=8.4.0,<9.0.0)", "teradatasqlalchemy (>=17.20.0.0,<=20.0.0.2)", "traitlets (!=5.2.2,<6.0.0)", "trino[sqlalchemy] (>=0.308,<=0.336.0)", "ujson (>=5.12.0,<6.0.0)", "unstructured-ingest[confluence,notion] (==0.7.2)", "unstructured[md] (==0.18.24)", "urllib3 (>=1.26,<3.0)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)", "wcmatch (<11.0.0)", "websocket-client (<2.0.0)", "zstd (<1.5.6.8)"] +athena = ["IPython (!=8.22.0,<9.0.0)", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "tenacity (!=8.4.0,<9.0.0)", "traitlets (!=5.2.2,<6.0.0)"] +azure-data-factory = ["azure-identity (>=1.21.0,<2.0.0)", "azure-mgmt-datafactory (>=9.0.0,<10.0.0)"] +bigquery = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "google-cloud-bigquery (<4.0.0)", "google-cloud-datacatalog (>=1.5.0,<4.0.0)", "google-cloud-datacatalog-lineage (>=0.5.0,<1.0.0)", "google-cloud-logging (<4.0.0)", "google-cloud-resource-manager (<2.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "numpy (<2)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "protobuf (>=5.0.0,<7.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "wcmatch (<11.0.0)"] +bigquery-queries = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "google-cloud-bigquery (<4.0.0)", "google-cloud-datacatalog (>=1.5.0,<4.0.0)", "google-cloud-logging (<4.0.0)", "google-cloud-resource-manager (<2.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "numpy (<2)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "wcmatch (<11.0.0)"] +bigquery-slim = ["google-cloud-bigquery (<4.0.0)", "google-cloud-datacatalog (>=1.5.0,<4.0.0)", "google-cloud-logging (<4.0.0)", "google-cloud-resource-manager (<2.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "parse (>=1.19.0,<2.0.0)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "wcmatch (<11.0.0)"] +cassandra = ["cachetools (<6.0.0)", "cassandra-driver (>=3.28.0,<4.0.0)", "numpy (<2)"] +circuit-breaker = ["gql[requests] (>=4.0.0)"] +clickhouse = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "zstd (<1.5.6.8)"] +clickhouse-usage = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "zstd (<1.5.6.8)"] cloud = ["acryl-datahub-cloud"] -cockroachdb = ["Deprecated", "GeoAlchemy2", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "psycopg2-binary", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-cockroachdb (<2.0.0)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -databricks = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "databricks-sdk (>=0.30.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pandas (<2.2.0)", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "pyspark (>=3.3.0,<3.4.0)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqllineage (==1.3.8)", "sqlparse", "sqlparse (==0.4.4)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -datahub = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "confluent-kafka (>=1.9.0)", "docker", "expandvars (>=0.6.5)", "fastavro (>=1.2.0)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "pymysql (>=1.0.2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -datahub-business-glossary = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -datahub-kafka = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "confluent-kafka (>=1.9.0)", "docker", "expandvars (>=0.6.5)", "fastavro (>=1.2.0)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -datahub-lineage-file = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -datahub-lite = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "duckdb", "expandvars (>=0.6.5)", "fastapi", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "uvicorn"] -datahub-rest = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -dbt = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "boto3", "botocore (!=1.23.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -dbt-cloud = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -debug = ["memray"] -delta-lake = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "azure-core (==1.29.4)", "azure-identity (>=1.14.0)", "azure-storage-blob (>=12.19.0)", "azure-storage-file-datalake (>=12.14.0)", "boto3", "botocore (!=1.23.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "deltalake (>=0.6.3,!=0.6.4)", "deltalake (>=0.6.3,!=0.6.4,<0.18.0)", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools (>=8.12.0)", "moto[s3] (<5.0.0)", "packaging", "parse (>=1.19.0)", "progressbar2", "psutil (>=5.8.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pydeequ (>=1.1.0,<1.2.0)", "pyspark (>=3.3.0,<3.4.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "smart-open[azure] (>=5.2.1)", "smart-open[s3] (>=5.2.1)", "tableschema (>=1.20.2)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "ujson (>=5.2.0)", "wcmatch"] -dev = ["Deprecated", "GeoAlchemy2", "GitPython (>2)", "JPype1", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-pyhive[hive-pure-sasl] (==0.6.16)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "azure-core (==1.29.4)", "azure-identity (>=1.14.0)", "azure-storage-blob (>=12.19.0)", "azure-storage-file-datalake (>=12.14.0)", "black (==22.12.0)", "boto3", "boto3-stubs[dynamodb,glue,s3,sagemaker,sts] (==1.28.15)", "botocore (!=1.23.0)", "build", "cached-property", "cachetools", "click (>=7.1.2)", "click-default-group", "click-spinner", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "confluent-kafka (>=1.9.0)", "coverage (>=5.1)", "cryptography", "cx-Oracle", "dask[dataframe] (<2024.7.0)", "databricks-dbapi", "databricks-sdk (>=0.30.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "db-dtypes", "deepdiff", "deepmerge (>=1.1.1)", "deltalake (>=0.6.3,!=0.6.4)", "deltalake (>=0.6.3,!=0.6.4,<0.18.0)", "docker", "duckdb", "elasticsearch (==7.13.4)", "expandvars (>=0.6.5)", "faker (>=18.4.0)", "fastapi", "fastavro (>=1.2.0)", "feast (>=0.34.0,<1)", "flake8 (>=6.0.0)", "flake8-bugbear (==23.3.12)", "flake8-tidy-imports (>=4.3.0)", "flask-openid (>=1.3.0)", "freezegun", "google-cloud-bigquery", "google-cloud-datacatalog (>=1.5.0)", "google-cloud-datacatalog-lineage (==0.2.2)", "google-cloud-logging (<=3.5.0)", "google-cloud-resource-manager", "great-expectations (!=0.15.23,!=0.15.24,!=0.15.25,!=0.15.26)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "grpcio (>=1.44.0,<2)", "grpcio-tools (>=1.44.0,<2)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "isort (>=5.7.0)", "jsonpickle", "jsonref", "jsonschema", "lark[regex] (==1.1.4)", "lkml (>=1.3.4)", "looker-sdk (==23.0.0)", "mixpanel (>=4.9.0)", "mlflow-skinny (>=2.3.0)", "more-itertools (>=8.12.0)", "moto[s3] (<5.0.0)", "msal", "msal (==1.22.0)", "mypy (==1.10.1)", "mypy-boto3-sagemaker (==1.28.15)", "nest-asyncio", "networkx (>=2.6.2)", "numpy (<2)", "okta (>=1.7.0,<1.8.0)", "packaging", "pandas", "pandas (<2.2.0)", "parse (>=1.19.0)", "pip", "progressbar2", "psutil (>=5.8.0)", "psycopg2-binary", "pyarrow (>=6.0.1)", "pydantic (<2)", "pydantic (>=1.10.0,!=1.10.3)", "pydeequ (>=1.1.0,<1.2.0)", "pydruid (>=0.6.2)", "pyiceberg (>=0.4,<0.7)", "pymysql (>=1.0.2)", "pyspark (>=3.3.0,<3.4.0)", "pytest (>=6.2.2)", "pytest-asyncio (>=0.16.0)", "pytest-cov (>=2.8.1)", "pytest-docker (>=1.1.0)", "pytest-random-order (>=1.1.0,<1.2.0)", "python-dateutil (>=2.8.0)", "python-ldap (>=2.4)", "python-liquid", "redash-toolbelt", "redshift-connector (>=2.1.0)", "requests", "requests-file", "requests-gssapi", "requests-mock", "requests-ntlm", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sentry-sdk", "setuptools", "simple-salesforce", "slack-sdk (==3.18.1)", "smart-open[azure] (>=5.2.1)", "smart-open[s3] (>=5.2.1)", "snowflake-connector-python (>=3.4.0)", "snowflake-sqlalchemy (>=1.4.3)", "sql-metadata", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1)", "sqlalchemy-cockroachdb (<2.0.0)", "sqlalchemy-redshift (>=0.8.3)", "sqlalchemy2-stubs", "sqllineage (==1.3.8)", "sqlparse", "sqlparse (==0.4.4)", "tableauserverclient (>=0.24.0)", "tableschema (>=1.20.2)", "tabulate", "tenacity (!=8.4.0)", "tenacity (>=8.0.1)", "teradatasqlalchemy (>=17.20.0.0)", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)", "trino[sqlalchemy] (>=0.308)", "twine", "types-Deprecated", "types-PyMySQL", "types-PyYAML", "types-cachetools", "types-click (==0.1.12)", "types-click-spinner (>=0.1.13.1)", "types-dataclasses", "types-protobuf (>=4.21.0.1)", "types-pyOpenSSL", "types-python-dateutil", "types-pytz", "types-requests (>=2.28.11.6,<=2.31.0.3)", "types-setuptools", "types-six", "types-tabulate", "types-termcolor (>=1.0.0)", "types-toml", "types-ujson (>=5.2.0)", "typing-extensions (>=3.7.4.3)", "typing-inspect", "ujson (>=5.2.0)", "uvicorn", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)", "wcmatch", "websocket-client"] -druid = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "pydruid (>=0.6.2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -dynamodb = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "boto3", "botocore (!=1.23.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -elasticsearch = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "elasticsearch (==7.13.4)", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -feast = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "dask[dataframe] (<2024.7.0)", "docker", "expandvars (>=0.6.5)", "feast (>=0.34.0,<1)", "flask-openid (>=1.3.0)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -fivetran = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "cachetools", "click (>=7.1.2)", "click-default-group", "click-spinner", "cryptography", "docker", "expandvars (>=0.6.5)", "google-cloud-bigquery", "google-cloud-datacatalog (>=1.5.0)", "google-cloud-logging (<=3.5.0)", "google-cloud-resource-manager", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools (>=8.12.0)", "msal", "numpy (<2)", "packaging", "pandas", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "snowflake-connector-python (>=3.4.0)", "snowflake-sqlalchemy (>=1.4.3)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -gcs = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "boto3", "botocore (!=1.23.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools (>=8.12.0)", "moto[s3] (<5.0.0)", "packaging", "parse (>=1.19.0)", "progressbar2", "psutil (>=5.8.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pydeequ (>=1.1.0,<1.2.0)", "pyspark (>=3.3.0,<3.4.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "smart-open[s3] (>=5.2.1)", "tableschema (>=1.20.2)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "ujson (>=5.2.0)", "wcmatch"] -glue = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "boto3", "botocore (!=1.23.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -grafana = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -great-expectations = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqllineage (==1.3.8)", "sqlparse", "sqlparse (==0.4.4)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -hana = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "hdbcli (>=2.11.20)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-hana (>=0.5.0)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -hive = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-pyhive[hive-pure-sasl] (==0.6.16)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "databricks-dbapi", "docker", "expandvars (>=0.6.5)", "great-expectations (!=0.15.23,!=0.15.24,!=0.15.25,!=0.15.26)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -hive-metastore = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-pyhive[hive-pure-sasl] (==0.6.16)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "psycopg2-binary", "pydantic (<2)", "pymysql (>=1.0.2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -iceberg = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pyiceberg (>=0.4,<0.7)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -integration-tests = ["JPype1", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-pyhive[hive-pure-sasl] (==0.6.16)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "azure-core (==1.29.4)", "azure-identity (>=1.14.0)", "azure-storage-blob (>=12.19.0)", "azure-storage-file-datalake (>=12.14.0)", "boto3", "botocore (!=1.23.0)", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "dask[dataframe] (<2024.7.0)", "databricks-dbapi", "deltalake (>=0.6.3,!=0.6.4)", "deltalake (>=0.6.3,!=0.6.4,<0.18.0)", "feast (>=0.34.0,<1)", "flask-openid (>=1.3.0)", "gql (>=3.3.0)", "gql[requests] (>=3.3.0)", "great-expectations (!=0.15.23,!=0.15.24,!=0.15.25,!=0.15.26)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "hdbcli (>=2.11.20)", "more-itertools (>=8.12.0)", "moto[s3] (<5.0.0)", "numpy (<2)", "packaging", "parse (>=1.19.0)", "pip", "pyOpenSSL", "pyarrow (>=6.0.1)", "pydantic (<2)", "pydeequ (>=1.1.0,<1.2.0)", "pydruid (>=0.6.2)", "pyiceberg (>=0.4,<0.7)", "pymongo[srv] (>=3.11)", "pymysql (>=1.0.2)", "pyspark (>=3.3.0,<3.4.0)", "python-ldap (>=2.4)", "redash-toolbelt", "requests", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "slack-sdk (==3.18.1)", "smart-open[azure] (>=5.2.1)", "smart-open[s3] (>=5.2.1)", "sql-metadata", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1)", "sqlalchemy-hana (>=0.5.0)", "sqlalchemy-pytds (>=0.3)", "sqllineage (==1.3.8)", "sqlparse", "sqlparse (==0.4.4)", "tableschema (>=1.20.2)", "tenacity (!=8.4.0)", "traitlets (<5.2.2)", "ujson (>=5.2.0)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)", "wcmatch"] -json-schema = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -kafka = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "confluent-kafka (>=1.9.0)", "docker", "expandvars (>=0.6.5)", "fastavro (>=1.2.0)", "grpcio (>=1.44.0,<2)", "grpcio-tools (>=1.44.0,<2)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "networkx (>=2.6.2)", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -kafka-connect = ["Deprecated", "JPype1", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -ldap = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "python-ldap (>=2.4)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -looker = ["Deprecated", "GitPython (>2)", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "deepmerge (>=1.1.1)", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "lkml (>=1.3.4)", "looker-sdk (==23.0.0)", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "python-liquid", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -lookml = ["Deprecated", "GitPython (>2)", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "deepmerge (>=1.1.1)", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "lkml (>=1.3.4)", "looker-sdk (==23.0.0)", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "python-liquid", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -mariadb = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "pymysql (>=1.0.2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -metabase = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -mlflow = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "mlflow-skinny (>=2.3.0)", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "setuptools", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -mode = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "python-liquid", "requests", "requests-file", "ruamel.yaml", "sqllineage (==1.3.8)", "sqlparse (==0.4.4)", "tabulate", "tenacity (>=8.0.1)", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -mongodb = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "pymongo[srv] (>=3.11)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -mssql = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pyOpenSSL", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-pytds (>=0.3)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -mssql-odbc = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pyOpenSSL", "pydantic (<2)", "pyodbc", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-pytds (>=0.3)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -mysql = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "pymysql (>=1.0.2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -nifi = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "requests-gssapi", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -okta = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "nest-asyncio", "okta (>=1.7.0,<1.8.0)", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -oracle = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "cx-Oracle", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -postgres = ["Deprecated", "GeoAlchemy2", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "psycopg2-binary", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -powerbi = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "lark[regex] (==1.1.4)", "msal (==1.22.0)", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -powerbi-report-server = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "requests-ntlm", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -presto = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-pyhive[hive-pure-sasl] (==0.6.16)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)", "trino[sqlalchemy] (>=0.308)"] -presto-on-hive = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-pyhive[hive-pure-sasl] (==0.6.16)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "psycopg2-binary", "pydantic (<2)", "pymysql (>=1.0.2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -pulsar = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -qlik-sense = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "websocket-client"] -redash = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "redash-toolbelt", "requests-file", "ruamel.yaml", "sql-metadata", "sqllineage (==1.3.8)", "sqlparse (==0.4.4)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -redshift = ["Deprecated", "GeoAlchemy2", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "cachetools", "click (>=7.1.2)", "click-default-group", "click-spinner", "db-dtypes", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "parse (>=1.19.0)", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "redshift-connector (>=2.1.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-redshift (>=0.8.3)", "sqllineage (==1.3.8)", "sqlparse", "sqlparse (==0.4.4)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)", "wcmatch"] -s3 = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "boto3", "botocore (!=1.23.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "more-itertools (>=8.12.0)", "moto[s3] (<5.0.0)", "packaging", "parse (>=1.19.0)", "progressbar2", "psutil (>=5.8.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pydeequ (>=1.1.0,<1.2.0)", "pyspark (>=3.3.0,<3.4.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "smart-open[s3] (>=5.2.1)", "tableschema (>=1.20.2)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "ujson (>=5.2.0)", "wcmatch"] -sagemaker = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "boto3", "botocore (!=1.23.0)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -salesforce = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "simple-salesforce", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -sigma = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -slack = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "slack-sdk (==3.18.1)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -snowflake = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "cachetools", "click (>=7.1.2)", "click-default-group", "click-spinner", "cryptography", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "msal", "numpy (<2)", "packaging", "pandas", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "snowflake-connector-python (>=3.4.0)", "snowflake-sqlalchemy (>=1.4.3)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -snowflake-queries = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "cachetools", "click (>=7.1.2)", "click-default-group", "click-spinner", "cryptography", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "msal", "numpy (<2)", "packaging", "pandas", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "snowflake-connector-python (>=3.4.0)", "snowflake-sqlalchemy (>=1.4.3)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -snowflake-summary = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "cachetools", "click (>=7.1.2)", "click-default-group", "click-spinner", "cryptography", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "msal", "numpy (<2)", "packaging", "pandas", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "snowflake-connector-python (>=3.4.0)", "snowflake-sqlalchemy (>=1.4.3)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -sql-parser = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -sql-queries = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -sqlalchemy = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -starburst-trino-usage = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)", "trino[sqlalchemy] (>=0.308)"] -superset = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "sqlalchemy", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -sync-file-emitter = ["Deprecated", "PyYAML", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "filelock", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -tableau = ["Deprecated", "PyYAML", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "packaging", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "sqllineage (==1.3.8)", "sqlparse (==0.4.4)", "tableauserverclient (>=0.24.0)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)"] -teradata = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "teradatasqlalchemy (>=17.20.0.0)", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -testing-utils = ["PyYAML", "deepdiff", "pytest (>=6.2.2)"] -trino = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)", "trino[sqlalchemy] (>=0.308)"] -unity-catalog = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "databricks-sdk (>=0.30.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pandas (<2.2.0)", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "pyspark (>=3.3.0,<3.4.0)", "python-dateutil (>=2.8.0)", "requests", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqllineage (==1.3.8)", "sqlparse", "sqlparse (==0.4.4)", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)"] -vertica = ["Deprecated", "PyYAML", "acryl-datahub-classify (==0.0.11)", "acryl-sqlglot[rs] (==25.8.2.dev9)", "aiohttp (<4)", "avro (>=1.11.3,<1.12)", "avro-gen3 (==0.7.13)", "cached-property", "click (>=7.1.2)", "click-default-group", "click-spinner", "docker", "expandvars (>=0.6.5)", "great-expectations (>=0.15.12,<=0.15.50)", "greenlet", "humanfriendly", "ijson", "importlib-metadata (>=4.0.0)", "jsonref", "jsonschema", "numpy (<2)", "packaging", "pip", "progressbar2", "psutil (>=5.8.0)", "pydantic (<2)", "python-dateutil (>=2.8.0)", "requests-file", "ruamel.yaml", "schwifty (<2024.08.0)", "scipy (>=1.7.2)", "sqlalchemy (>=1.4.39,<2)", "sqlparse", "tabulate", "termcolor (>=1.0.0)", "toml (>=0.10.0)", "traitlets (<5.2.2)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)"] +cockroachdb = ["GeoAlchemy2 (<0.19.0)", "IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "psycopg2-binary (<3.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-cockroachdb (<2.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "urllib3 (>=1.26,<3.0)"] +confluence = ["atlassian-python-api (>=3.41.0,<5.0.0)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "jsonpath-ng (==1.7.0)", "litellm (==1.80.5)", "unstructured-ingest[confluence] (==0.7.2)", "unstructured[md] (==0.18.24)", "urllib3 (>=1.26,<3.0)"] +databricks = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "databricks-sdk (>=0.30.0,<1.0.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "pandas (<2.2.0)", "patchy (==2.8.0)", "pip", "pyspark (>=3.5.6,<3.6.0)", "requests (<3.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +datahub = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "confluent_kafka[avro,schemaregistry] (>=2.10.1,<2.13.0)", "fastavro (>=1.2.0,<2.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pymysql (>=1.0.2,<2.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +datahub-debug = ["dnspython (==2.7.0)", "requests (<3.0.0)"] +datahub-documents = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "jsonpath-ng (==1.7.0)", "litellm (==1.80.5)", "unstructured-ingest (==0.7.2)", "unstructured[md] (==0.18.24)", "urllib3 (>=1.26,<3.0)"] +datahub-kafka = ["confluent_kafka[avro,schemaregistry] (>=1.9.0,!=2.8.1,<3.0.0)", "fastavro (>=1.2.0,<2.0.0)"] +datahub-lite = ["duckdb (>=1.0.0,<2.0.0)", "fastapi (<0.129.0)", "uvicorn (<0.41.0)"] +datahub-rest = ["requests (<3.0.0)"] +dataplex = ["google-cloud-datacatalog-lineage (>=0.5.0,<1.0.0)", "google-cloud-dataplex (<3.0.0)", "protobuf (>=5.0.0,<7.0.0)", "tenacity (>=8.0.1,<9.0.0)"] +db2 = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "ibm_db_sa (==0.4.3) ; platform_machine == \"x86_64\" or platform_system == \"Darwin\"", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pyodbc (<6.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +dbt = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "more-itertools (<11.0.0)", "patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)", "urllib3 (>=1.26,<3.0)"] +dbt-cloud = ["more-itertools (<11.0.0)", "patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)"] +debug = ["memray (<2.0.0)"] +debug-recording = ["pyzipper (>=0.3.6,<1.0)", "responses (>=0.25.0,<1.0)", "vcrpy (>=8.0.0,<9.0)"] +delta-lake = ["azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "deltalake (>=0.6.3,!=0.6.4,!=0.18.0,<1.0.0) ; platform_system == \"Darwin\" and platform_machine == \"arm64\"", "deltalake (>=0.6.3,!=0.6.4,<1.0.0) ; platform_system != \"Darwin\" or platform_machine != \"arm64\"", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydeequ (>=1.1.0,<2.0.0)", "pyspark (>=3.5.6,<3.6.0)", "smart-open[azure,s3] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "urllib3 (>=1.26,<3.0)", "wcmatch (<11.0.0)"] +dev = ["Authlib (>=1.6.7,<2.0.0)", "Deprecated (<2.0.0)", "GeoAlchemy2 (<0.19.0)", "GitPython (>2,<4.0.0)", "IPython (!=8.22.0,<9.0.0)", "JPype1 (<2.0.0)", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "PyYAML (<7.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "aiohttp (<4)", "atlassian-python-api (>=3.41.0,<5.0.0)", "avro (>=1.11.3,<1.13)", "avro-gen3 (==0.7.16)", "azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "boto3 (>=1.35.0,<2.0.0)", "boto3-stubs[dynamodb,glue,lakeformation,s3,sagemaker,sts] (==1.40.0)", "botocore (!=1.23.0,<2.0.0)", "build (<2.0.0)", "cached_property (<3.0.0)", "cachetools (<6.0.0)", "cassandra-driver (>=3.28.0,<4.0.0)", "click (>=7.1.2,!=8.2.0,<9.0.0)", "click-default-group (<2.0.0)", "click-spinner (<0.2.0)", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "confluent_kafka[avro,schemaregistry] (>=2.10.1,<2.13.0)", "coverage (>=5.1,<8.0.0)", "cryptography (>=46.0.5,<47.0.0)", "dask[dataframe] (<2024.7.0)", "databricks-dbapi (<0.7.0)", "databricks-sdk (>=0.30.0,<1.0.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "db-dtypes", "deepdiff (!=8.0.0,<9.0.0)", "deepmerge (>=1.1.1,<3.0.0)", "deltalake (>=0.6.3,!=0.6.4,!=0.18.0,<1.0.0) ; platform_system == \"Darwin\" and platform_machine == \"arm64\"", "deltalake (>=0.6.3,!=0.6.4,<1.0.0) ; platform_system != \"Darwin\" or platform_machine != \"arm64\"", "docker (<8.0.0)", "duckdb (>=1.0.0,<2.0.0)", "elasticsearch (==7.13.4)", "expandvars (>=0.6.5,<2.0.0)", "faker (>=18.4.0,<41.0.0)", "fastapi (<0.129.0)", "fastavro (>=1.2.0,<2.0.0)", "feast (>=0.34.0,<1)", "flask-openid (>=1.3.0,<2.0.0)", "flatdict (!=4.0.1)", "freezegun (<2.0.0)", "google-cloud-aiplatform (>=1.80.0,<2.0.0)", "google-cloud-bigquery (<4.0.0)", "google-cloud-datacatalog (>=1.5.0,<4.0.0)", "google-cloud-datacatalog-lineage (>=0.5.0,<1.0.0)", "google-cloud-dataplex (<3.0.0)", "google-cloud-logging (<4.0.0)", "google-cloud-resource-manager (<2.0.0)", "graphql-core (>=3.0.0,<4.0.0)", "greenlet (<4.0.0)", "grpcio (>=1.44.0,<2.0.0)", "grpcio-tools (>=1.44.0,<2.0.0)", "humanfriendly (<11.0.0)", "ijson (<4.0.0)", "jdk4py (>=21.0,<22.0)", "jsonpath-ng (==1.7.0)", "jsonpickle (<5.0.0)", "jsonref (<2.0.0)", "jsonschema (<5.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "kerberos (>=1.3.0,<2.0.0)", "litellm (==1.80.5)", "lkml (>=1.3.4,<2.0.0)", "looker-sdk (>=23.0.0,<26.0.0)", "mini-racer (==0.14.1)", "mixpanel (>=4.9.0,<6.0.0)", "mlflow-skinny (>=2.3.0,<2.21.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "msal (>=1.31.1,<2.0.0)", "mypy (==1.17.1)", "neo4j (<7.0.0)", "nest-asyncio (<2.0.0)", "networkx (>=2.6.2,<4.0.0)", "numpy (<2)", "okta (>=1.7.0,<1.8.0)", "oracledb (<4.0.0)", "orderly-set (!=5.4.0,<6.0.0)", "packaging (<26.0.0)", "pandas (<2.2.0)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "progressbar2 (<5.0.0)", "protobuf (>=5.0.0,<7.0.0)", "psutil (>=5.8.0,<8.0.0)", "psycopg2-binary (<3.0.0)", "pyOpenSSL (<26.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydantic (>=2.4.0,<2.12)", "pydeequ (>=1.1.0,<2.0.0)", "pydruid (>=0.6.2,<=0.6.9)", "pyiceberg[adlfs,dynamodb,glue,hive,pyarrow,s3fs,snappy,zstandard] (>=0.9.0,<=0.10.0)", "pymetastore (>=0.4.2,<1.0.0)", "pymongo[aws] (>=4.8.0,<5.0.0)", "pymysql (>=1.0.2,<2.0.0)", "pyodata (>=1.11.1,<2.0.0)", "pyodbc (<6.0.0)", "pyspark (>=3.5.6,<3.6.0)", "pytest (>=6.2.2,<10.0.0)", "pytest-asyncio (>=0.16.0,<2.0.0)", "pytest-cov (>=2.8.1,<8.0.0)", "pytest-docker (>=1.1.0,<4.0.0)", "pytest-random-order (>=1.1.0,<1.2.0)", "pytest-rerunfailures (<17.0)", "pytest-timeout (<3.0.0)", "python-dateutil (>=2.8.0,<3.0.0)", "python-json-logger (>=2.0.0,<5.0.0)", "python-ldap (>=2.4,<4.0.0)", "python-liquid (<2)", "rdflib (==6.3.2)", "redash-toolbelt (<0.2.0)", "redshift-connector (>=2.1.5,<3.0.0)", "requests (==2.32.5)", "requests-gssapi (<2.0.0)", "requests-mock (<2.0.0)", "requests_file (==3.0.1)", "requests_ntlm (<2.0.0)", "ruamel.yaml (<0.19.0)", "ruff (==0.11.7)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sentry-sdk (>=1.33.1,<3.0.0)", "setuptools (<82.0.0)", "simple-salesforce (<2.0.0)", "slack-sdk (==3.18.1)", "smart-open[azure,s3] (>=5.2.1,<8.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "sql-metadata (<3.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlalchemy-cockroachdb (<2.0.0)", "sqlalchemy-pytds (>=0.3,<2.0.0)", "sqlalchemy-redshift (>=0.8.3,<=0.8.14)", "sqlalchemy2-stubs (<0.1.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "stopit (==1.1.2)", "tableauserverclient (>=0.24.0,<=0.40)", "tableschema (>=1.20.2,<2.0.0)", "tabulate (<0.10.0)", "tenacity (>=8.0.1,!=8.4.0,<9.0.0)", "teradatasqlalchemy (>=17.20.0.0,<=20.0.0.2)", "time-machine (<4.0.0)", "toml (>=0.10.0,<=0.10.2)", "traitlets (!=5.2.2,<6.0.0)", "trino[sqlalchemy] (>=0.308,<=0.336.0)", "twine (<7.0.0)", "types-Deprecated (<2.0.0)", "types-PyMySQL (<2.0.0)", "types-PyYAML (<7.0.0)", "types-cachetools (<7.0.0)", "types-click (==0.1.12)", "types-click-spinner (>=0.1.13.1,<=0.1.13.20250809)", "types-dataclasses (<0.7.0)", "types-protobuf (>=4.21.0.1,<7.0.0)", "types-pyOpenSSL (<26.0.0)", "types-python-dateutil (<3.0.0)", "types-pytz (<2026.0.0)", "types-requests (>=2.28.11.6,<=2.31.0.3)", "types-six (<2.0.0)", "types-tabulate (<0.10.0)", "types-toml (<0.11.0)", "types-ujson (>=5.2.0,<6.0.0)", "typing-inspect (<0.10.0)", "typing_extensions (>=4.8.0,<5.0.0)", "ujson (>=5.12.0,<6.0.0)", "unstructured-ingest[confluence,notion] (==0.7.2)", "unstructured[md] (==0.18.24)", "urllib3 (>=1.26,<3.0)", "uvicorn (<0.41.0)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)", "wcmatch (<11.0.0)", "websocket-client (<2.0.0)", "zstd (<1.5.6.8)"] +docs = ["Authlib (>=1.6.7,<2.0.0)", "Deprecated (<2.0.0)", "GeoAlchemy2 (<0.19.0)", "GitPython (>2,<4.0.0)", "IPython (!=8.22.0,<9.0.0)", "JPype1 (<2.0.0)", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "PyYAML (<7.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "aiohttp (<4)", "atlassian-python-api (>=3.41.0,<5.0.0)", "avro (>=1.11.3,<1.13)", "avro-gen3 (==0.7.16)", "azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "boto3 (>=1.35.0,<2.0.0)", "boto3-stubs[dynamodb,glue,lakeformation,s3,sagemaker,sts] (==1.40.0)", "botocore (!=1.23.0,<2.0.0)", "build (<2.0.0)", "cached_property (<3.0.0)", "cachetools (<6.0.0)", "cassandra-driver (>=3.28.0,<4.0.0)", "click (>=7.1.2,!=8.2.0,<9.0.0)", "click-default-group (<2.0.0)", "click-spinner (<0.2.0)", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "confluent_kafka[avro,schemaregistry] (>=2.10.1,<2.13.0)", "coverage (>=5.1,<8.0.0)", "cryptography (>=46.0.5,<47.0.0)", "dask[dataframe] (<2024.7.0)", "databricks-dbapi (<0.7.0)", "databricks-sdk (>=0.30.0,<1.0.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "db-dtypes", "deepdiff (!=8.0.0,<9.0.0)", "deepmerge (>=1.1.1,<3.0.0)", "deltalake (>=0.6.3,!=0.6.4,!=0.18.0,<1.0.0) ; platform_system == \"Darwin\" and platform_machine == \"arm64\"", "deltalake (>=0.6.3,!=0.6.4,<1.0.0) ; platform_system != \"Darwin\" or platform_machine != \"arm64\"", "docker (<8.0.0)", "duckdb (>=1.0.0,<2.0.0)", "elasticsearch (==7.13.4)", "expandvars (>=0.6.5,<2.0.0)", "faker (>=18.4.0,<41.0.0)", "fastapi (<0.129.0)", "fastavro (>=1.2.0,<2.0.0)", "feast (>=0.34.0,<1)", "flask-openid (>=1.3.0,<2.0.0)", "flatdict (!=4.0.1)", "freezegun (<2.0.0)", "google-cloud-aiplatform (>=1.80.0,<2.0.0)", "google-cloud-bigquery (<4.0.0)", "google-cloud-datacatalog (>=1.5.0,<4.0.0)", "google-cloud-datacatalog-lineage (>=0.5.0,<1.0.0)", "google-cloud-dataplex (<3.0.0)", "google-cloud-logging (<4.0.0)", "google-cloud-resource-manager (<2.0.0)", "graphql-core (>=3.0.0,<4.0.0)", "greenlet (<4.0.0)", "grpcio (>=1.44.0,<2.0.0)", "grpcio-tools (>=1.44.0,<2.0.0)", "humanfriendly (<11.0.0)", "ijson (<4.0.0)", "jdk4py (>=21.0,<22.0)", "jsonpath-ng (==1.7.0)", "jsonpickle (<5.0.0)", "jsonref (<2.0.0)", "jsonschema (<5.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "kerberos (>=1.3.0,<2.0.0)", "litellm (==1.80.5)", "lkml (>=1.3.4,<2.0.0)", "looker-sdk (>=23.0.0,<26.0.0)", "mini-racer (==0.14.1)", "mixpanel (>=4.9.0,<6.0.0)", "mlflow-skinny (>=2.3.0,<2.21.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "msal (>=1.31.1,<2.0.0)", "mypy (==1.17.1)", "neo4j (<7.0.0)", "nest-asyncio (<2.0.0)", "networkx (>=2.6.2,<4.0.0)", "numpy (<2)", "okta (>=1.7.0,<1.8.0)", "oracledb (<4.0.0)", "orderly-set (!=5.4.0,<6.0.0)", "packaging (<26.0.0)", "pandas (<2.2.0)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "progressbar2 (<5.0.0)", "protobuf (>=5.0.0,<7.0.0)", "psutil (>=5.8.0,<8.0.0)", "psycopg2-binary (<3.0.0)", "pyOpenSSL (<26.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydantic (>=2.4.0,<2.12)", "pydeequ (>=1.1.0,<2.0.0)", "pydruid (>=0.6.2,<=0.6.9)", "pyiceberg[adlfs,dynamodb,glue,hive,pyarrow,s3fs,snappy,zstandard] (>=0.9.0,<=0.10.0)", "pymetastore (>=0.4.2,<1.0.0)", "pymongo[aws] (>=4.8.0,<5.0.0)", "pymysql (>=1.0.2,<2.0.0)", "pyodata (>=1.11.1,<2.0.0)", "pyodbc (<6.0.0)", "pyspark (>=3.5.6,<3.6.0)", "pytest (>=6.2.2,<10.0.0)", "pytest-asyncio (>=0.16.0,<2.0.0)", "pytest-cov (>=2.8.1,<8.0.0)", "pytest-docker (>=1.1.0,<4.0.0)", "pytest-random-order (>=1.1.0,<1.2.0)", "pytest-rerunfailures (<17.0)", "pytest-timeout (<3.0.0)", "python-dateutil (>=2.8.0,<3.0.0)", "python-json-logger (>=2.0.0,<5.0.0)", "python-ldap (>=2.4,<4.0.0)", "python-liquid (<2)", "rdflib (==6.3.2)", "redash-toolbelt (<0.2.0)", "redshift-connector (>=2.1.5,<3.0.0)", "requests (==2.32.5)", "requests-gssapi (<2.0.0)", "requests-mock (<2.0.0)", "requests_file (==3.0.1)", "requests_ntlm (<2.0.0)", "ruamel.yaml (<0.19.0)", "ruff (==0.11.7)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sentry-sdk (>=1.33.1,<3.0.0)", "setuptools (<82.0.0)", "simple-salesforce (<2.0.0)", "slack-sdk (==3.18.1)", "smart-open[azure,s3] (>=5.2.1,<8.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "sql-metadata (<3.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlalchemy-cockroachdb (<2.0.0)", "sqlalchemy-pytds (>=0.3,<2.0.0)", "sqlalchemy-redshift (>=0.8.3,<=0.8.14)", "sqlalchemy2-stubs (<0.1.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "stopit (==1.1.2)", "tableauserverclient (>=0.24.0,<=0.40)", "tableschema (>=1.20.2,<2.0.0)", "tabulate (<0.10.0)", "tenacity (>=8.0.1,!=8.4.0,<9.0.0)", "teradatasqlalchemy (>=17.20.0.0,<=20.0.0.2)", "time-machine (<4.0.0)", "toml (>=0.10.0,<=0.10.2)", "traitlets (!=5.2.2,<6.0.0)", "trino[sqlalchemy] (>=0.308,<=0.336.0)", "twine (<7.0.0)", "types-Deprecated (<2.0.0)", "types-PyMySQL (<2.0.0)", "types-PyYAML (<7.0.0)", "types-cachetools (<7.0.0)", "types-click (==0.1.12)", "types-click-spinner (>=0.1.13.1,<=0.1.13.20250809)", "types-dataclasses (<0.7.0)", "types-protobuf (>=4.21.0.1,<7.0.0)", "types-pyOpenSSL (<26.0.0)", "types-python-dateutil (<3.0.0)", "types-pytz (<2026.0.0)", "types-requests (>=2.28.11.6,<=2.31.0.3)", "types-six (<2.0.0)", "types-tabulate (<0.10.0)", "types-toml (<0.11.0)", "types-ujson (>=5.2.0,<6.0.0)", "typing-inspect (<0.10.0)", "typing_extensions (>=4.8.0,<5.0.0)", "ujson (>=5.12.0,<6.0.0)", "unstructured-ingest[confluence,notion] (==0.7.2)", "unstructured[md] (==0.18.24)", "urllib3 (>=1.26,<3.0)", "uvicorn (<0.41.0)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)", "wcmatch (<11.0.0)", "websocket-client (<2.0.0)", "zstd (<1.5.6.8)"] +doris = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pymysql (>=1.0.2,<2.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "urllib3 (>=1.26,<3.0)"] +dremio = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "requests (<3.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +druid = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pydruid (>=0.6.2,<=0.6.9)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +dynamodb = ["acryl-datahub-classify (==0.0.11)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "numpy (<2)", "pip", "schwifty (<2026.0.0)", "urllib3 (>=1.26,<3.0)"] +elasticsearch = ["cachetools (<6.0.0)", "elasticsearch (==7.13.4)"] +excel = ["azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "openpyxl (>=3.1.5,<4.0.0)", "pandas (<3.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydeequ (>=1.1.0,<2.0.0)", "pyspark (>=3.5.6,<3.6.0)", "smart-open[azure] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "urllib3 (>=1.26,<3.0)", "wcmatch (<11.0.0)"] +fabric-onelake = ["azure-identity (>=1.21.0,<2.0)", "pyodbc (>=4.0,<5.0)", "requests (>=2.28.0,<3.0)", "sqlalchemy (>=1.4,<3.0)"] +feast = ["dask[dataframe] (<2024.7.0)", "feast (>=0.34.0,<1)", "flask-openid (>=1.3.0,<2.0.0)", "numpy (<2)"] +fivetran = ["acryl-datahub-classify (==0.0.11)", "cachetools (<6.0.0)", "cryptography (>=46.0.5,<47.0.0)", "databricks-sdk (>=0.30.0,<1.0.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "google-cloud-bigquery (<4.0.0)", "google-cloud-datacatalog (>=1.5.0,<4.0.0)", "google-cloud-logging (<4.0.0)", "google-cloud-resource-manager (<2.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "msal (<2.0.0)", "numpy (<2)", "pandas (<3.0.0)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlglot[c] (==30.0.3)", "tenacity (>=8.0.1,<9.0.0)", "wcmatch (<11.0.0)"] +flink = ["requests (<3.0.0)", "tenacity (>=8.0.1,<9.0.0)"] +gcs = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydeequ (>=1.1.0,<2.0.0)", "pyspark (>=3.5.6,<3.6.0)", "smart-open[gcs,s3] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "urllib3 (>=1.26,<3.0)", "wcmatch (<11.0.0)"] +gcs-slim = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "smart-open[gcs,s3] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "urllib3 (>=1.26,<3.0)", "wcmatch (<11.0.0)"] +glue = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "urllib3 (>=1.26,<3.0)"] +grafana = ["patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)"] +hana = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "hdbcli (>=2.11.20,<3.0.0) ; platform_machine != \"aarch64\" and platform_machine != \"arm64\"", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-hana (>=0.5.0,<5.0.0) ; platform_machine != \"aarch64\" and platform_machine != \"arm64\"", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +hive = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "cachetools (<6.0.0)", "databricks-dbapi (<0.7.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +hive-metastore = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "kerberos (>=1.3.0,<2.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "psycopg2-binary (<3.0.0)", "pymetastore (>=0.4.2,<1.0.0)", "pymysql (>=1.0.2,<2.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "tenacity (>=8.0.1,<9.0.0)", "traitlets (!=5.2.2,<6.0.0)"] +iceberg = ["cachetools (<6.0.0)", "pydantic (<2.12)", "pyiceberg[adlfs,dynamodb,glue,hive,pyarrow,s3fs,snappy,zstandard] (>=0.9.0,<=0.10.0)"] +iceberg-catalog = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "urllib3 (>=1.26,<3.0)"] +integration-tests = ["IPython (!=8.22.0,<9.0.0)", "JPype1 (<2.0.0)", "PyAthena[sqlalchemy] (>=2.6.0,<3.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "azure-core (>=1.38.0,<2.0.0)", "azure-identity (>=1.21.0,<2.0.0)", "azure-mgmt-datafactory (>=9.0.0,<10.0.0)", "azure-storage-blob (>=12.19.0,<13.0.0)", "azure-storage-file-datalake (>=12.14.0,<13.0.0)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "clickhouse-sqlalchemy (>=0.2.0,<0.2.5)", "dask[dataframe] (<2024.7.0)", "databricks-dbapi (<0.7.0)", "deltalake (>=0.6.3,!=0.6.4,!=0.18.0,<1.0.0) ; platform_system == \"Darwin\" and platform_machine == \"arm64\"", "deltalake (>=0.6.3,!=0.6.4,<1.0.0) ; platform_system != \"Darwin\" or platform_machine != \"arm64\"", "feast (>=0.34.0,<1)", "flask-openid (>=1.3.0,<2.0.0)", "google-cloud-aiplatform (>=1.80.0,<2.0.0)", "gql[requests] (>=4.0.0)", "greenlet (<4.0.0)", "hdbcli (>=2.11.20,<3.0.0) ; platform_machine != \"aarch64\" and platform_machine != \"arm64\"", "ibm_db_sa (==0.4.3) ; platform_machine == \"x86_64\" or platform_system == \"Darwin\"", "jdk4py (>=21.0,<22.0)", "jupyter_server (>=2.14.1,<3.0.0)", "kerberos (>=1.3.0,<2.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "numpy (<2)", "openpyxl (>=3.1.5,<4.0.0)", "pandas (<3.0.0)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "psycopg2-binary (<3.0.0)", "pyOpenSSL (<26.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydantic (<2.12)", "pydeequ (>=1.1.0,<2.0.0)", "pydruid (>=0.6.2,<=0.6.9)", "pyiceberg[adlfs,dynamodb,glue,hive,pyarrow,s3fs,snappy,zstandard] (>=0.9.0,<=0.10.0)", "pymetastore (>=0.4.2,<1.0.0)", "pymysql (>=1.0.2,<2.0.0)", "pyodbc (>=4.0,<5.0)", "pyspark (>=3.5.6,<3.6.0)", "python-ldap (>=2.4,<4.0.0)", "pyzipper (>=0.3.6,<1.0)", "rdflib (==6.3.2)", "redash-toolbelt (<0.2.0)", "requests (==2.32.5)", "requests_file (==3.0.1)", "responses (>=0.25.0,<1.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "slack-sdk (==3.18.1)", "smart-open[azure,s3] (>=5.2.1,<8.0.0)", "sql-metadata (<3.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-bigquery (>=1.4.1,<2.0.0)", "sqlalchemy-hana (>=0.5.0,<5.0.0) ; platform_machine != \"aarch64\" and platform_machine != \"arm64\"", "sqlalchemy-pytds (>=0.3,<2.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "tableschema (>=1.20.2,<2.0.0)", "tenacity (>=8.0.1,!=8.4.0,<9.0.0)", "traitlets (!=5.2.2,<6.0.0)", "ujson (>=5.12.0,<6.0.0)", "urllib3 (>=1.26,<3.0)", "vcrpy (>=8.0.0,<9.0)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)", "wcmatch (<11.0.0)", "zstd (<1.5.6.8)"] +json-schema = ["requests (<3.0.0)"] +kafka = ["confluent_kafka[avro,schemaregistry] (>=2.10.1,<2.13.0)", "fastavro (>=1.2.0,<2.0.0)", "grpcio (>=1.44.0,<2.0.0)", "grpcio-tools (>=1.44.0,<2.0.0)", "networkx (>=2.6.2,<4.0.0)"] +kafka-connect = ["IPython (!=8.22.0,<9.0.0)", "JPype1 (<2.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jdk4py (>=21.0,<22.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "requests (<3.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +ldap = ["python-ldap (>=2.4,<4.0.0)"] +lint = ["mypy (==1.17.1)", "ruff (==0.11.7)"] +looker = ["GitPython (>2,<4.0.0)", "deepmerge (>=1.1.1,<3.0.0)", "lkml (>=1.3.4,<2.0.0)", "looker-sdk (>=23.0.0,<26.0.0)", "patchy (==2.8.0)", "python-liquid (<2)", "sqlglot[c] (==30.0.3)"] +lookml = ["GitPython (>2,<4.0.0)", "deepmerge (>=1.1.1,<3.0.0)", "lkml (>=1.3.4,<2.0.0)", "looker-sdk (>=23.0.0,<26.0.0)", "patchy (==2.8.0)", "python-liquid (<2)", "sqlglot[c] (==30.0.3)"] +mariadb = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pymysql (>=1.0.2,<2.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "urllib3 (>=1.26,<3.0)"] +metabase = ["patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)"] +mlflow = ["mlflow-skinny (>=2.3.0,<2.21.0)", "setuptools (<82)"] +mode = ["cachetools (<6.0.0)", "patchy (==2.8.0)", "python-liquid (<2)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)", "tenacity (>=8.0.1,<9.0.0)"] +mongodb = ["pymongo[aws] (>=4.8.0,<5.0.0)"] +mssql = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pyOpenSSL (<26.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-pytds (>=0.3,<2.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +mssql-odbc = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pyOpenSSL (<26.0.0)", "pyodbc (<6.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-pytds (>=0.3,<2.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +mysql = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "pymysql (>=1.0.2,<2.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "urllib3 (>=1.26,<3.0)"] +neo4j = ["neo4j (<7.0.0)", "pandas (<3.0.0)"] +nifi = ["requests (<3.0.0)", "requests-gssapi (<2.0.0)"] +notion = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "jsonpath-ng (==1.7.0)", "litellm (==1.80.5)", "unstructured-ingest[notion] (==0.7.2)", "unstructured[md] (==0.18.24)", "urllib3 (>=1.26,<3.0)"] +okta = ["flatdict (!=4.0.1)", "nest-asyncio (<2.0.0)", "okta (>=1.7.0,<1.8.0)"] +oracle = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "oracledb (<4.0.0)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +postgres = ["GeoAlchemy2 (<0.19.0)", "IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "psycopg2-binary (<3.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "urllib3 (>=1.26,<3.0)"] +powerbi = ["mini-racer (==0.14.1)", "more-itertools (<11.0.0)", "msal (>=1.31.1,<2.0.0)", "patchy (==2.8.0)", "setuptools (<82)", "sqlglot[c] (==30.0.3)", "sqlparse (<1.0.0)", "stopit (==1.1.2)"] +powerbi-report-server = ["requests (<3.0.0)", "requests_ntlm (<2.0.0)"] +preset = ["patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)"] +presto = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "trino[sqlalchemy] (>=0.308,<=0.336.0)"] +presto-on-hive = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "acryl-pyhive[hive-pure-sasl] (==0.6.18)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "psycopg2-binary (<3.0.0)", "pymysql (>=1.0.2,<2.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +pulsar = ["requests (<3.0.0)"] +qlik-sense = ["patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)", "websocket-client (<2.0.0)"] +rdf = ["rdflib (==6.3.2)", "requests (==2.32.5)", "requests_file (==3.0.1)"] +redash = ["patchy (==2.8.0)", "redash-toolbelt (<0.2.0)", "sql-metadata (<3.0.0)", "sqlglot[c] (==30.0.3)"] +redshift = ["GeoAlchemy2 (<0.19.0)", "IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "db-dtypes", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "parse (>=1.19.0,<2.0.0)", "patchy (==2.8.0)", "pip", "redshift-connector (>=2.1.5,<3.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlalchemy-redshift (>=0.8.3,<=0.8.14)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "wcmatch (<11.0.0)"] +s3 = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "pydeequ (>=1.1.0,<2.0.0)", "pyspark (>=3.5.6,<3.6.0)", "smart-open[s3] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "urllib3 (>=1.26,<3.0)", "wcmatch (<11.0.0)"] +s3-slim = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "cachetools (<6.0.0)", "more-itertools (>=8.12.0,<11.0.0)", "moto[s3] (>=5.0.0,<6.0.0)", "parse (>=1.19.0,<2.0.0)", "pyarrow (>14.0.0,<24.0.0)", "smart-open[s3] (>=5.2.1,<8.0.0)", "tableschema (>=1.20.2,<2.0.0)", "ujson (>=5.12.0,<6.0.0)", "urllib3 (>=1.26,<3.0)", "wcmatch (<11.0.0)"] +sac = ["Authlib (>=1.6.7,<2.0.0)", "pyodata (>=1.11.1,<2.0.0)", "requests (<3.0.0)"] +sagemaker = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "urllib3 (>=1.26,<3.0)"] +salesforce = ["cachetools (<6.0.0)", "simple-salesforce (<2.0.0)"] +sigma = ["patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)"] +slack = ["slack-sdk (==3.18.1)", "tenacity (>=8.0.1,<9.0.0)"] +snowflake = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "cryptography (>=46.0.5,<47.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "msal (<2.0.0)", "numpy (<2)", "pandas (<3.0.0)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "tenacity (>=8.0.1,<9.0.0)", "traitlets (!=5.2.2,<6.0.0)"] +snowflake-queries = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "cryptography (>=46.0.5,<47.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "msal (<2.0.0)", "numpy (<2)", "pandas (<3.0.0)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "tenacity (>=8.0.1,<9.0.0)", "traitlets (!=5.2.2,<6.0.0)"] +snowflake-slim = ["acryl-datahub-classify (==0.0.11)", "cachetools (<6.0.0)", "cryptography (>=46.0.5,<47.0.0)", "msal (<2.0.0)", "numpy (<2)", "pandas (<3.0.0)", "pip", "schwifty (<2026.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "tenacity (>=8.0.1,<9.0.0)"] +snowflake-summary = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "cryptography (>=46.0.5,<47.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "msal (<2.0.0)", "numpy (<2)", "pandas (<3.0.0)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "snowflake-connector-python (>=4.0.0,<5.0.0)", "snowflake-sqlalchemy (>=1.8.0,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "tenacity (>=8.0.1,<9.0.0)", "traitlets (!=5.2.2,<6.0.0)"] +snowplow = ["cachetools (<6.0.0)"] +sql-parser = ["patchy (==2.8.0)", "sqlglot[c] (==30.0.3)"] +sql-queries = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "patchy (==2.8.0)", "smart-open[s3] (>=5.2.1,<8.0.0)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "urllib3 (>=1.26,<3.0)"] +sqlalchemy = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +starburst-trino-usage = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "trino[sqlalchemy] (>=0.308,<=0.336.0)"] +superset = ["patchy (==2.8.0)", "requests (<3.0.0)", "sqlglot[c] (==30.0.3)"] +sync-file-emitter = ["filelock (>=3.13.1,<4.0.0)"] +tableau = ["patchy (==2.8.0)", "sqlglot[c] (==30.0.3)", "tableauserverclient (>=0.24.0,<=0.40)"] +teradata = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "teradatasqlalchemy (>=17.20.0.0,<=20.0.0.2)", "traitlets (!=5.2.2,<6.0.0)"] +testing-utils = ["PyYAML (<7.0.0)", "deepdiff (!=8.0.0,<9.0.0)", "orderly-set (!=5.4.0,<6.0.0)", "pytest (>=6.2.2,<10.0.0)", "pytest-docker (>=1.1.0,<4.0.0)", "pytest-timeout (<3.0.0)"] +trino = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "trino[sqlalchemy] (>=0.308,<=0.336.0)"] +unity-catalog = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "databricks-sdk (>=0.30.0,<1.0.0)", "databricks-sql-connector (>=2.8.0,<3.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "pandas (<2.2.0)", "patchy (==2.8.0)", "pip", "pyspark (>=3.5.6,<3.6.0)", "requests (<3.0.0)", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)"] +unstructured = ["boto3 (>=1.35.0,<2.0.0)", "botocore (!=1.23.0,<2.0.0)", "jsonpath-ng (==1.7.0)", "litellm (==1.80.5)", "unstructured-ingest (==0.7.2)", "unstructured[md] (==0.18.24)", "urllib3 (>=1.26,<3.0)"] +vertexai = ["google-cloud-aiplatform (>=1.80.0,<2.0.0)"] +vertica = ["IPython (!=8.22.0,<9.0.0)", "acryl-datahub-classify (==0.0.11)", "acryl-great-expectations (==0.15.50.1)", "cachetools (<6.0.0)", "greenlet (<4.0.0)", "jupyter_server (>=2.14.1,<3.0.0)", "numpy (<2)", "patchy (==2.8.0)", "pip", "schwifty (<2026.0.0)", "scipy (>=1.7.2,<2.0.0)", "sqlalchemy (>=1.4.39,<2)", "sqlglot[c] (==30.0.3)", "sqlparse (<0.6.0)", "traitlets (!=5.2.2,<6.0.0)", "vertica-sqlalchemy-dialect[vertica-python] (==0.0.8.2)"] + +[[package]] +name = "affine" +version = "2.4.0" +description = "Matrices describing affine transformation of the plane" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92"}, + {file = "affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea"}, +] + +[package.extras] +dev = ["coveralls", "flake8", "pydocstyle"] +test = ["pytest (>=4.6)", "pytest-cov"] + +[[package]] +name = "aiobotocore" +version = "3.0.0" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "aiobotocore-3.0.0-py3-none-any.whl", hash = "sha256:b3f7125d8a7a4077f43af94c5614a613b6d0ebc2eb6954abc78e421b43cd7629"}, + {file = "aiobotocore-3.0.0.tar.gz", hash = "sha256:2a039d14d18b2b89c56bf13a266f033432047c47b22444919e8a4330eab2952d"}, +] + +[package.dependencies] +aiohttp = ">=3.9.2,<4.0.0" +aioitertools = ">=0.5.1,<1.0.0" +botocore = ">=1.41.0,<1.42.6" +jmespath = ">=0.7.1,<2.0.0" +multidict = ">=6.0.0,<7.0.0" +python-dateutil = ">=2.1,<3.0.0" +wrapt = ">=1.10.10,<3.0.0" + +[package.extras] +httpx = ["httpx (>=0.25.1,<0.29)"] [[package]] name = "aiohappyeyeballs" @@ -137,6 +201,7 @@ version = "2.4.0" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, @@ -148,6 +213,7 @@ version = "3.10.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, @@ -251,7 +317,19 @@ multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] + +[[package]] +name = "aioitertools" +version = "0.13.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "aioitertools-0.13.0-py3-none-any.whl", hash = "sha256:0be0292b856f08dfac90e31f4739432f4cb6d7520ab9eb73e143f4f2fa5259be"}, + {file = "aioitertools-0.13.0.tar.gz", hash = "sha256:620bd241acc0bbb9ec819f1ab215866871b4bbd1f73836a55f799200ee86950c"}, +] [[package]] name = "aiosignal" @@ -259,6 +337,7 @@ version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.7" +groups = ["main", "pipelines"] files = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, @@ -273,6 +352,7 @@ version = "1.13.1" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, @@ -284,7 +364,7 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["backports.zoneinfo"] +tz = ["backports.zoneinfo ; python_version < \"3.9\""] [[package]] name = "aniso8601" @@ -292,6 +372,7 @@ version = "9.0.1" description = "A library for parsing ISO 8601 strings." optional = false python-versions = "*" +groups = ["dagster"] files = [ {file = "aniso8601-9.0.1-py2.py3-none-any.whl", hash = "sha256:1d2b7ef82963909e93c4f24ce48d4de9e66009a21bf1c1e1c85bdd0812fe412f"}, {file = "aniso8601-9.0.1.tar.gz", hash = "sha256:72e3117667eedf66951bb2d93f4296a56b94b078a8a95905a052611fb3f1b973"}, @@ -300,12 +381,37 @@ files = [ [package.extras] dev = ["black", "coverage", "isort", "pre-commit", "pyenchant", "pylint"] +[[package]] +name = "annotated-doc" +version = "0.0.4" +description = "Document parameters, class attributes, return types, and variables inline, with Annotated." +optional = false +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320"}, + {file = "annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"}, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["dagster", "pipelines"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + [[package]] name = "anyio" version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, @@ -317,7 +423,7 @@ sniffio = ">=1.1" [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\""] trio = ["trio (>=0.23)"] [[package]] @@ -326,6 +432,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" +groups = ["notebook"] +markers = "platform_system == \"Darwin\"" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -337,6 +445,7 @@ version = "23.1.0" description = "Argon2 for Python" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, @@ -357,6 +466,7 @@ version = "21.2.0" description = "Low-level CFFI bindings for Argon2" optional = false python-versions = ">=3.6" +groups = ["notebook"] files = [ {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, @@ -394,6 +504,7 @@ version = "1.3.0" description = "Better dates & times for Python" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, @@ -413,6 +524,7 @@ version = "3.1.0" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, @@ -424,6 +536,7 @@ version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" +groups = ["main", "dev", "notebook"] files = [ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, @@ -433,8 +546,8 @@ files = [ six = ">=1.12.0" [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=1,<2) ; python_version < \"3\"", "astroid (>=2,<4) ; python_version >= \"3\""] +test = ["astroid (>=1,<2) ; python_version < \"3\"", "astroid (>=2,<4) ; python_version >= \"3\"", "pytest"] [[package]] name = "async-lru" @@ -442,6 +555,7 @@ version = "2.0.4" description = "Simple LRU cache for asyncio" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, @@ -453,6 +567,7 @@ version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" +groups = ["main", "notebook", "pipelines"] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, @@ -463,8 +578,8 @@ cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6) ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\""] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "avro" @@ -472,6 +587,7 @@ version = "1.11.3" description = "Avro is a serialization and RPC framework." optional = false python-versions = ">=3.6" +groups = ["pipelines"] files = [ {file = "avro-1.11.3.tar.gz", hash = "sha256:3393bb5139f9cf0791d205756ce1e39a5b58586af5b153d6a3b5a199610e9d17"}, ] @@ -482,13 +598,14 @@ zstandard = ["zstandard"] [[package]] name = "avro-gen3" -version = "0.7.13" +version = "0.7.16" description = "Avro record class and specific record reader generator" optional = false python-versions = "*" +groups = ["pipelines"] files = [ - {file = "avro_gen3-0.7.13-py3-none-any.whl", hash = "sha256:90509208b36a39d118c62e6c8ec723aa3b42014449fcc75847a348d80c66877d"}, - {file = "avro_gen3-0.7.13.tar.gz", hash = "sha256:b1227861b37960ec6864d85c68f0b01f367aa01b8e95896d39a7c5c3ddf279eb"}, + {file = "avro_gen3-0.7.16-py3-none-any.whl", hash = "sha256:9f26de26214a8730d5e7d86b4a2c4afe8bedfaac5b770beb122cd0fa5fea60f8"}, + {file = "avro_gen3-0.7.16.tar.gz", hash = "sha256:1ef593e22d8876ec55b91aa75cb0581a4526bae4bb990fde7892208679dc44dc"}, ] [package.dependencies] @@ -501,6 +618,7 @@ version = "1.30.1" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.7" +groups = ["main", "pipelines"] files = [ {file = "azure-core-1.30.1.tar.gz", hash = "sha256:26273a254131f84269e8ea4464f3560c731f29c0c1f69ac99010845f239c1a8f"}, {file = "azure_core-1.30.1-py3-none-any.whl", hash = "sha256:7c5ee397e48f281ec4dd773d67a0a47a0962ed6fa833036057f9ea067f688e74"}, @@ -520,6 +638,7 @@ version = "1.17.1" description = "Microsoft Azure Identity Library for Python" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "azure-identity-1.17.1.tar.gz", hash = "sha256:32ecc67cc73f4bd0595e4f64b1ca65cd05186f4fe6f98ed2ae9f1aa32646efea"}, {file = "azure_identity-1.17.1-py3-none-any.whl", hash = "sha256:db8d59c183b680e763722bfe8ebc45930e6c57df510620985939f7f3191e0382"}, @@ -538,6 +657,7 @@ version = "12.19.1" description = "Microsoft Azure Blob Storage Client Library for Python" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "azure-storage-blob-12.19.1.tar.gz", hash = "sha256:13e16ba42fc54ac2c7e8f976062173a5c82b9ec0594728e134aac372965a11b0"}, {file = "azure_storage_blob-12.19.1-py3-none-any.whl", hash = "sha256:c5530dc51c21c9564e4eb706cd499befca8819b10dd89716d3fc90d747556243"}, @@ -558,6 +678,7 @@ version = "12.14.0" description = "Microsoft Azure File DataLake Storage Client Library for Python" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "azure-storage-file-datalake-12.14.0.tar.gz", hash = "sha256:358f1616db479b8272b74fb7d5f10f93dfc695a264137dd1959b50b50dcd6346"}, {file = "azure_storage_file_datalake-12.14.0-py3-none-any.whl", hash = "sha256:736b565e8c46fc0a36f64102d5fa63e1367b698496d845b7572fc7cad4925cec"}, @@ -578,6 +699,7 @@ version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, @@ -592,6 +714,7 @@ version = "2.2.1" description = "Function decoration for backoff and retry" optional = false python-versions = ">=3.7,<4.0" +groups = ["dagster"] files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, @@ -603,6 +726,7 @@ version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" +groups = ["notebook", "pipelines"] files = [ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, @@ -624,6 +748,7 @@ version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, @@ -636,12 +761,48 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.3)"] +[[package]] +name = "botocore" +version = "1.42.5" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "botocore-1.42.5-py3-none-any.whl", hash = "sha256:6aa487f1876c881e2143f6a186b7d8faaf042fc05e0ba7421d821f145356a0c9"}, + {file = "botocore-1.42.5.tar.gz", hash = "sha256:37bfc487f14286d9795920807fcb8318b940835b18fff6bec5253449f377136f"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.29.2)"] + +[[package]] +name = "bs4" +version = "0.0.2" +description = "Dummy package for Beautiful Soup (beautifulsoup4)" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"}, + {file = "bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + [[package]] name = "cached-property" version = "1.5.2" description = "A decorator for caching properties in classes." optional = false python-versions = "*" +groups = ["pipelines"] files = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, @@ -653,6 +814,7 @@ version = "5.3.3" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, @@ -664,6 +826,7 @@ version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, @@ -675,6 +838,7 @@ version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main", "notebook", "pipelines"] files = [ {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, @@ -729,6 +893,7 @@ files = [ {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] +markers = {pipelines = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -739,6 +904,7 @@ version = "5.2.0" description = "Universal encoding detector for Python 3" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, @@ -750,6 +916,7 @@ version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, @@ -843,12 +1010,35 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "ckanapi" +version = "4.11" +description = "A command line interface and Python module for accessing the CKAN Action API" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "ckanapi-4.11-py3-none-any.whl", hash = "sha256:6625efd482ef969487dfcd3cc5d6c81d296cf240c7371b7daf5e7a5e430a9f2a"}, + {file = "ckanapi-4.11.tar.gz", hash = "sha256:913dc04e23e16dac9357d013eefda797f2ae5b7a5b584077c10b70d7336b467e"}, +] + +[package.dependencies] +docopt = "*" +python-slugify = ">=1.0" +requests = "*" +setuptools = "*" +simplejson = "*" + +[package.extras] +testing = ["pyfakefs (==5.10.2)", "werkzeug"] + [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, @@ -863,6 +1053,7 @@ version = "1.2.4" description = "click_default_group" optional = false python-versions = ">=2.7" +groups = ["pipelines"] files = [ {file = "click_default_group-1.2.4-py2.py3-none-any.whl", hash = "sha256:9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f"}, {file = "click_default_group-1.2.4.tar.gz", hash = "sha256:eb3f3c99ec0d456ca6cd2a7f08f7d4e91771bef51b01bdd9580cc6450fe1251e"}, @@ -880,6 +1071,7 @@ version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." optional = false python-versions = "*" +groups = ["pipelines"] files = [ {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, @@ -897,6 +1089,7 @@ version = "0.1.10" description = "Spinner for Click" optional = false python-versions = "*" +groups = ["pipelines"] files = [ {file = "click-spinner-0.1.10.tar.gz", hash = "sha256:87eacf9d7298973a25d7615ef57d4782aebf913a532bba4b28a37e366e975daf"}, {file = "click_spinner-0.1.10-py2.py3-none-any.whl", hash = "sha256:d1ffcff1fdad9882396367f15fb957bcf7f5c64ab91927dee2127e0d2991ee84"}, @@ -911,6 +1104,7 @@ version = "0.7.2" description = "Click params for commmand line interfaces to GeoJSON" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" +groups = ["pipelines"] files = [ {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, @@ -928,10 +1122,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dagster", "dev", "notebook", "pipelines"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {dagster = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "sys_platform == \"win32\"", notebook = "sys_platform == \"win32\"", pipelines = "sys_platform == \"win32\" or platform_system == \"Windows\""} [[package]] name = "coloredlogs" @@ -939,6 +1135,7 @@ version = "14.0" description = "Colored terminal output for Python's logging module" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["dagster", "pipelines"] files = [ {file = "coloredlogs-14.0-py2.py3-none-any.whl", hash = "sha256:346f58aad6afd48444c2468618623638dadab76e4e70d5e10822676f2d32226a"}, {file = "coloredlogs-14.0.tar.gz", hash = "sha256:a1fab193d2053aa6c0a97608c4342d031f1f93a3d1218432c59322441d31a505"}, @@ -956,6 +1153,7 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -973,6 +1171,7 @@ version = "1.2" description = "The country converter (coco) - a Python package for converting country names between different classifications schemes" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "country_converter-1.2-py3-none-any.whl", hash = "sha256:5a5e54f9542cc8e109d53a39fa9e9179e6a97826e72594dd16e948611cb278fa"}, {file = "country_converter-1.2.tar.gz", hash = "sha256:74e87db54b91eda56c5eecc9e36e1b5ca79ca2bca58012ecc4f55ef8a13a6631"}, @@ -992,6 +1191,7 @@ version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, @@ -1048,7 +1248,7 @@ files = [ ] [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cramjam" @@ -1056,6 +1256,7 @@ version = "2.8.3" description = "Thin Python bindings to de/compression algorithms in Rust" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "cramjam-2.8.3-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8c8aa6d08c135ae7f0da01e6559a332c5d8fe4989a594db401040e385d04dffd"}, {file = "cramjam-2.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bd8c601fe8717e52517a2f2eef78217086acf449627bfdda97e3f53fd79c92af"}, @@ -1168,6 +1369,7 @@ version = "2.0.3" description = "croniter provides iteration for datetime object with cron like format" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main", "dagster", "pipelines"] files = [ {file = "croniter-2.0.3-py2.py3-none-any.whl", hash = "sha256:84dc95b2eb6760144cc01eca65a6b9cc1619c93b2dc37d8a27f4319b3eb740de"}, {file = "croniter-2.0.3.tar.gz", hash = "sha256:28763ad39c404e159140874f08010cfd8a18f4c2a7cea1ce73e9506a4380cfc1"}, @@ -1183,6 +1385,7 @@ version = "42.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" +groups = ["main", "pipelines"] files = [ {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, @@ -1237,6 +1440,7 @@ version = "2.0.0" description = "Next generation GUIDs. Collision-resistant ids optimized for horizontal scaling and performance." optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "cuid2-2.0.0-py3-none-any.whl", hash = "sha256:5105ae457fdd1448013f6de73008d221c2654766dd3dafd459ef02c59a34a077"}, {file = "cuid2-2.0.0.tar.gz", hash = "sha256:3595ca0b1f61ff9d65da1a3a1359d291e2243b682cdd52ed1e7bc05ab7b7247d"}, @@ -1248,6 +1452,7 @@ version = "1.6.13" description = "Dagster is an orchestration platform for the development, production, and observation of data assets." optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "dagster-1.6.13-py3-none-any.whl", hash = "sha256:1ae0109cf173550f1f18ea6870b03eb9774f86f36ec4268f063458b795dacce0"}, {file = "dagster-1.6.13.tar.gz", hash = "sha256:779ddf5d4f348cab7d5f3e09c1748462ccb9676f1275977122a4cef44e439eed"}, @@ -1265,8 +1470,8 @@ grpcio-health-checking = ">=1.44.0" Jinja2 = "*" packaging = ">=20.9" pendulum = [ - {version = ">=3,<4", markers = "python_version >= \"3.12\""}, {version = ">=0.7.0,<4", markers = "python_version >= \"3.9\" and python_version < \"3.12\""}, + {version = ">=3,<4", markers = "python_version >= \"3.12\""}, ] protobuf = {version = ">=4,<5", markers = "python_version >= \"3.11\""} psutil = {version = ">=1.0", markers = "platform_system == \"Windows\""} @@ -1287,8 +1492,8 @@ toposort = ">=1.0" tqdm = "<5" typing-extensions = ">=4.4.0,<5" universal-pathlib = [ - {version = ">=0.2.0", markers = "python_version >= \"3.12\""}, {version = "*", markers = "python_version < \"3.12\""}, + {version = ">=0.2.0", markers = "python_version >= \"3.12\""}, ] watchdog = ">=0.8.3" @@ -1297,7 +1502,7 @@ docker = ["docker"] mypy = ["mypy (==1.8.0)"] pyright = ["pandas-stubs", "pyright (==1.1.349)", "types-PyYAML", "types-backports", "types-certifi", "types-chardet", "types-croniter", "types-cryptography", "types-mock", "types-paramiko", "types-pkg-resources", "types-pyOpenSSL", "types-python-dateutil", "types-pytz", "types-requests", "types-simplejson", "types-six", "types-sqlalchemy (==1.4.53.34)", "types-tabulate", "types-toml", "types-tzlocal"] ruff = ["ruff (==0.3.0)"] -test = ["buildkite-test-collector", "docker", "grpcio-tools (>=1.44.0)", "mock (==3.0.5)", "morefs[asynclocal]", "mypy-protobuf", "objgraph", "pytest (>=7.0.1)", "pytest-cov (==2.10.1)", "pytest-dependency (==0.5.1)", "pytest-mock (==3.3.1)", "pytest-rerunfailures (==10.0)", "pytest-runner (==5.2)", "pytest-xdist (==3.3.1)", "rapidfuzz", "responses (<=0.23.1)", "syrupy (>=4.0.0)", "tox (==3.25.0)"] +test = ["buildkite-test-collector ; python_version >= \"3.8\"", "docker", "grpcio-tools (>=1.44.0)", "mock (==3.0.5)", "morefs[asynclocal] ; python_version >= \"3.8\"", "mypy-protobuf", "objgraph", "pytest (>=7.0.1)", "pytest-cov (==2.10.1)", "pytest-dependency (==0.5.1)", "pytest-mock (==3.3.1)", "pytest-rerunfailures (==10.0)", "pytest-runner (==5.2)", "pytest-xdist (==3.3.1)", "rapidfuzz", "responses (<=0.23.1)", "syrupy (>=4.0.0)", "tox (==3.25.0)"] [[package]] name = "dagster-docker" @@ -1305,6 +1510,7 @@ version = "0.22.13" description = "A Dagster integration for docker" optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster"] files = [ {file = "dagster-docker-0.22.13.tar.gz", hash = "sha256:72e17e638f8c33b05b66d1fe16f416a0f47c5d3b67dea2e65ab2718740f6a561"}, {file = "dagster_docker-0.22.13-py3-none-any.whl", hash = "sha256:a272fa0ebf99388d45307dad50d2c21d3ae470d6c6e737d0ca57e3ae563420e5"}, @@ -1321,6 +1527,7 @@ version = "1.6.13" description = "The GraphQL frontend to python dagster." optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster"] files = [ {file = "dagster-graphql-1.6.13.tar.gz", hash = "sha256:27a2395d2a44398cd12cbee63a6e9a41b4e22776c8cd946db405101e84504398"}, {file = "dagster_graphql-1.6.13-py3-none-any.whl", hash = "sha256:19fa5001e2e6ae3e79f5d985bc428aca0d532754a38b34b33d91c07bb9f4ca9a"}, @@ -1339,6 +1546,7 @@ version = "0.22.13" description = "A Dagster integration for k8s" optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster"] files = [ {file = "dagster-k8s-0.22.13.tar.gz", hash = "sha256:7dc58fef27188b56be47d23868e26908aed0643c76bf9a59d595450c9fd748d0"}, {file = "dagster_k8s-0.22.13-py3-none-any.whl", hash = "sha256:eb2488ba4ccf5b48dc131ff2de27b82181733f1a4b34df34e2ae2ead4c57961b"}, @@ -1355,6 +1563,7 @@ version = "1.6.13" description = "Toolkit for Dagster integrations with transform logic outside of Dagster" optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "dagster-pipes-1.6.13.tar.gz", hash = "sha256:4efba77428ce47ccbe9d25ed00990f4975eb328225e41b1f110b7ee34dbe0b2e"}, {file = "dagster_pipes-1.6.13-py3-none-any.whl", hash = "sha256:f3f6b100fe049686d96919908bf3998c163a995a5188574914e0155413ce46b4"}, @@ -1366,6 +1575,7 @@ version = "0.22.13" description = "A Dagster integration for postgres" optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster"] files = [ {file = "dagster-postgres-0.22.13.tar.gz", hash = "sha256:a6e024883a11d96cdd9ab62bc2612cd3f066fa99ebb791c935005cc42ed1472b"}, {file = "dagster_postgres-0.22.13-py3-none-any.whl", hash = "sha256:e0093573e1e13e1566f5c8fd4953cb7c9c66ef283d58dcb8cde5c2c4eafeaaf4"}, @@ -1381,6 +1591,7 @@ version = "0.22.13" description = "Package for PySpark Dagster framework components." optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster"] files = [ {file = "dagster-pyspark-0.22.13.tar.gz", hash = "sha256:e53d2b931babfc87207454e04061c1c0602f6b42dc7af4861a1084b96912c2f6"}, {file = "dagster_pyspark-0.22.13-py3-none-any.whl", hash = "sha256:9be81d2ce9f48554a1c7c97f662e42b0524750d3b36cdfa3c62b333b870d058b"}, @@ -1397,6 +1608,7 @@ version = "0.22.13" description = "Package for Spark Dagster framework components." optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster"] files = [ {file = "dagster-spark-0.22.13.tar.gz", hash = "sha256:6ac38243a2ba44a04aa54e752cf1cb599bd59e325a1f01463ce272dcea8be131"}, {file = "dagster_spark-0.22.13-py3-none-any.whl", hash = "sha256:78fd65cc9712870c22586500f7ed45dac75d2396e1059999fe2ecb603af07ce7"}, @@ -1411,6 +1623,7 @@ version = "1.6.13" description = "Web UI for dagster." optional = false python-versions = "<3.13,>=3.8" +groups = ["dagster"] files = [ {file = "dagster-webserver-1.6.13.tar.gz", hash = "sha256:f018726d133b073b6890993f0920214fad86a59eb48186906c0703645a81c59e"}, {file = "dagster_webserver-1.6.13-py3-none-any.whl", hash = "sha256:9d1e6de1e8b9ce248b2e1aad218c1c2be2586689b2db54a8681b768670408d1b"}, @@ -1433,6 +1646,7 @@ version = "1.8.11" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" +groups = ["dev", "notebook"] files = [ {file = "debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd"}, {file = "debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f"}, @@ -1468,17 +1682,39 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["dev", "notebook"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "defopt" +version = "7.0.0" +description = "Effortless argument parser" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "defopt-7.0.0-py3-none-any.whl", hash = "sha256:88b6747561d803e3fc020b9080fd0aa6a300927f64167c76d95544495f1a8307"}, + {file = "defopt-7.0.0.tar.gz", hash = "sha256:d7ac98810005880717e1df62527fd35dfe083f551b6d4fb5da0b25f608e8ef4c"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +docutils = ">=0.12" +sphinxcontrib-napoleon = ">=0.7.0" + +[package.extras] +docs = ["sphinx (>=4.4)"] + [[package]] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["notebook"] files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -1490,6 +1726,7 @@ version = "3.0.0" description = "Python APIs for using Delta Lake with Apache Spark" optional = false python-versions = ">=3.6" +groups = ["spark"] files = [ {file = "delta-spark-3.0.0.tar.gz", hash = "sha256:95109ed364b4c68e3f6c628c77eb5e37c02e29e23bb771ddd8b31f66aae0d555"}, {file = "delta_spark-3.0.0-py3-none-any.whl", hash = "sha256:98fd66445c1de0e5c276b7bf7fbec73c46c378cf9440a2984f5d208b09b4ffc5"}, @@ -1499,36 +1736,13 @@ files = [ importlib-metadata = ">=1.0.0" pyspark = ">=3.5.0,<3.6.0" -[[package]] -name = "deltalake" -version = "0.12.0" -description = "Native Delta Lake Python binding based on delta-rs with Pandas integration" -optional = false -python-versions = ">=3.7" -files = [ - {file = "deltalake-0.12.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:a7271910604834ca71da0a5f4cc009dfa23da01bed5a86c1a17a99eaab203c6e"}, - {file = "deltalake-0.12.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9ddacf6bfe9fea3c4af813c6f83e52dcf2b4790c478958a3a07fbf573041424d"}, - {file = "deltalake-0.12.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:ba710ddc4c80d5c067d56564c5ae255ec0fcd277aed6fb303415d8eb40c28532"}, - {file = "deltalake-0.12.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0148d912b5da2eb298cdd0d8b604a043bb47916ec2d06a6f4406988e0550be3"}, - {file = "deltalake-0.12.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef2406c0a4f3759ecccec135056d175d36f09999807702c6f5a865aad72f0e9"}, - {file = "deltalake-0.12.0-cp37-abi3-win_amd64.whl", hash = "sha256:efdf81a5b3adc4c0de45a635e4a60e69654faf7bafa1bb4c1f4c7841a4f36edc"}, - {file = "deltalake-0.12.0.tar.gz", hash = "sha256:79ab7d55f13e2a2ab118e54428e0a1fa31b17a078353c9fe13a5f35194de9521"}, -] - -[package.dependencies] -pyarrow = ">=8,<=12" - -[package.extras] -devel = ["black", "mypy", "packaging (>=20)", "pytest", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-timeout", "ruff", "sphinx (<=4.5)", "sphinx-rtd-theme", "toml", "wheel"] -pandas = ["pandas (<2)"] -pyspark = ["delta-spark", "numpy (==1.22.2)", "pyspark"] - [[package]] name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main", "pipelines"] files = [ {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, @@ -1546,6 +1760,7 @@ version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -1561,6 +1776,7 @@ version = "2.6.1" description = "DNS toolkit" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, @@ -1581,6 +1797,7 @@ version = "7.0.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "docker-7.0.0-py3-none-any.whl", hash = "sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b"}, {file = "docker-7.0.0.tar.gz", hash = "sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3"}, @@ -1602,6 +1819,7 @@ version = "0.1.12" description = "Parse docker image as distribution does." optional = false python-versions = "*" +groups = ["dagster"] files = [ {file = "docker-image-py-0.1.12.tar.gz", hash = "sha256:c0eebb6c25714b2a4f91a1462183e70252fa34fb189496d3c54711a64f12f96e"}, {file = "docker_image_py-0.1.12-py2-none-any.whl", hash = "sha256:44e18e8000aaaddbd2e02d40050dca850acd071c4780cbe2b3366cb5dc1a6d62"}, @@ -1610,23 +1828,71 @@ files = [ [package.dependencies] regex = ">=2019.4.14" +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + [[package]] name = "docstring-parser" version = "0.16" description = "Parse Python docstrings in reST, Google and Numpydoc format" optional = false python-versions = ">=3.6,<4.0" +groups = ["dagster", "pipelines"] files = [ {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, ] +[[package]] +name = "docutils" +version = "0.22.4" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de"}, + {file = "docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"}, +] + +[[package]] +name = "earthengine-api" +version = "1.7.20" +description = "Earth Engine Python API" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "earthengine_api-1.7.20-py3-none-any.whl", hash = "sha256:8a661064e116d34fcf64e08501efe77611d783782c6f1389326c5cc0551f2b9c"}, + {file = "earthengine_api-1.7.20.tar.gz", hash = "sha256:9cd0527bda33b53fca16e8b9af09d7944ae38e55d21688219b47f7cbc24ec82c"}, +] + +[package.dependencies] +google-api-python-client = ">=1.12.1" +google-auth = ">=1.4.1" +google-auth-httplib2 = ">=0.0.3" +google-cloud-storage = "*" +httplib2 = ">=0.9.2,<1dev" +requests = "*" + +[package.extras] +tests = ["absl-py", "geopandas", "numpy"] + [[package]] name = "email-validator" version = "2.1.1" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, @@ -1642,6 +1908,7 @@ version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false python-versions = ">=3.6" +groups = ["main", "pipelines"] files = [ {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, @@ -1653,13 +1920,14 @@ version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.5" +groups = ["main", "dev", "notebook"] files = [ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "expandvars" @@ -1667,6 +1935,7 @@ version = "0.12.0" description = "Expand system variables Unix style" optional = false python-versions = ">=3" +groups = ["pipelines"] files = [ {file = "expandvars-0.12.0-py3-none-any.whl", hash = "sha256:7432c1c2ae50c671a8146583177d60020dd210ada7d940e52af91f1f84f753b2"}, {file = "expandvars-0.12.0.tar.gz", hash = "sha256:7d1adfa55728cf4b5d812ece3d087703faea953e0c0a1a78415de9df5024d844"}, @@ -1681,6 +1950,7 @@ version = "2.19.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" +groups = ["notebook"] files = [ {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, @@ -1695,6 +1965,7 @@ version = "2023.10.1" description = "Python support for Parquet file format" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "fastparquet-2023.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:75a00475e96d26214dace147b27ab782da7a0ae230cade05ea9181c3aec2e637"}, {file = "fastparquet-2023.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:af0c1d5559aa0a4fff8eb3b301c8177b6813bb15fe9d2007ad0dc89f8fa519c5"}, @@ -1752,6 +2023,7 @@ version = "1.10.0rc1" description = "Fiona reads and writes spatial data files" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "fiona-1.10.0rc1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:40d5e3091469d98aa82b28ac0db7148ccd22c55614618a495fd00cc0b2e67794"}, {file = "fiona-1.10.0rc1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4c37d1a6c07520077d5169f52d48353b6af3a6ef6a30c998dfe67902c2d3c8a"}, @@ -1799,17 +2071,75 @@ version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" optional = false python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +groups = ["notebook"] files = [ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] +[[package]] +name = "frictionless" +version = "5.18.1" +description = "Data management framework for Python that provides functionality to describe, extract, validate, and transform tabular data" +optional = false +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd"}, + {file = "frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +chardet = ">=3.0" +humanize = ">=4.2" +isodate = ">=0.6" +jinja2 = ">=3.0" +jsonschema = ">=4.20" +marko = ">=1.0" +petl = ">=1.6" +pydantic = ">=2.0" +python-dateutil = ">=2.8" +python-slugify = ">=1.2" +pyyaml = ">=5.3" +requests = ">=2.10" +rfc3986 = ">=1.4" +simpleeval = ">=0.9.11" +tabulate = ">=0.8.10" +typer = ">=0.12" +typing-extensions = ">=4.3" +validators = ">=0.18" + +[package.extras] +aws = ["boto3 (>=1.9)"] +bigquery = ["google-api-python-client (>=1.12.1)"] +ckan = ["frictionless-ckan-mapper (>=1.0)"] +datasette = ["datasette (>=0.64.2)"] +dev = ["hatch", "httpx", "ipython", "livemark", "moto", "neovim", "oauth2client", "pyright (==1.1.317)", "pytest", "pytest-cov", "pytest-dotenv", "pytest-lazy-fixtures", "pytest-mock", "pytest-timeout", "pytest-vcr", "requests-mock", "ruff", "yattag"] +duckdb = ["duckdb (>=0.8)", "duckdb-engine (>=0.7)", "sqlalchemy (>=1.4,<=2.0.35)"] +excel = ["openpyxl (>=3.0)", "tableschema-to-template (>=0.0)", "xlrd (>=1.2)", "xlwt (>=1.2)"] +github = ["pygithub (>=1.50)"] +gsheets = ["pygsheets (>=2.0)"] +html = ["pyquery (>=1.4)"] +json = ["ijson (>=3.0)", "jsonlines (>=1.2)"] +mysql = ["pymysql (>=1.0)", "sqlalchemy (>=1.4)"] +ods = ["ezodf (>=0.3)", "lxml (>=4.0)"] +pandas = ["pandas (>=1.0)", "pyarrow (>=14.0)"] +parquet = ["fastparquet (>=0.8)"] +postgresql = ["psycopg (>=3.0)", "psycopg2 (>=2.9)", "sqlalchemy (>=1.4)"] +spss = ["savreaderwriter (>=3.0)"] +sql = ["sqlalchemy (>=1.4)"] +visidata = ["visidata (>=2.10)"] +wkt = ["tatsu (>=5.8.3)"] +zenodo = ["pyzenodo3 (>=1.0)"] + [[package]] name = "frozenlist" version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, @@ -1892,13 +2222,14 @@ files = [ [[package]] name = "fsspec" -version = "2024.3.1" +version = "2026.3.0" description = "File-system specification" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["dagster", "pipelines"] files = [ - {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, - {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, + {file = "fsspec-2026.3.0-py3-none-any.whl", hash = "sha256:d2ceafaad1b3457968ed14efa28798162f1638dbb5d2a6868a2db002a5ee39a4"}, + {file = "fsspec-2026.3.0.tar.gz", hash = "sha256:1ee6a0e28677557f8c2f994e3eea77db6392b4de9cd1f5d7a9e87a0ae9d01b41"}, ] [package.extras] @@ -1906,11 +2237,12 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +dev = ["pre-commit", "ruff (>=0.5)"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] -full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs (>2024.2.0)", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs (>2024.2.0)", "smbprotocol", "tqdm"] fuse = ["fusepy"] -gcs = ["gcsfs"] +gcs = ["gcsfs (>2024.2.0)"] git = ["pygit2"] github = ["requests"] gs = ["gcsfs"] @@ -1919,18 +2251,34 @@ hdfs = ["pyarrow (>=1)"] http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] -s3 = ["s3fs"] +s3 = ["s3fs (>2024.2.0)"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "backports-zstd ; python_version < \"3.14\"", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas (<3.0.0)", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] tqdm = ["tqdm"] +[[package]] +name = "future" +version = "1.0.0" +description = "Clean single-source support for Python 3 and 2" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["pipelines"] +files = [ + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, +] + [[package]] name = "geographiclib" version = "2.0" description = "The geodesic routines from GeographicLib" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "geographiclib-2.0-py3-none-any.whl", hash = "sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734"}, {file = "geographiclib-2.0.tar.gz", hash = "sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859"}, @@ -1938,21 +2286,27 @@ files = [ [[package]] name = "geopandas" -version = "0.14.3" +version = "1.1.3" description = "Geographic pandas extensions" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["pipelines"] files = [ - {file = "geopandas-0.14.3-py3-none-any.whl", hash = "sha256:41b31ad39e21bc9e8c4254f78f8dc4ce3d33d144e22e630a00bb336c83160204"}, - {file = "geopandas-0.14.3.tar.gz", hash = "sha256:748af035d4a068a4ae00cab384acb61d387685c833b0022e0729aa45216b23ac"}, + {file = "geopandas-1.1.3-py3-none-any.whl", hash = "sha256:90d62a64f95eaa3be2ccc115c5f3d6e24208bb11983b390fdc0621a3eccd0230"}, + {file = "geopandas-1.1.3.tar.gz", hash = "sha256:91a31989b6f566012838d21d5f8033f37dce882079ccb7cfdc40d5ccce7f284f"}, ] [package.dependencies] -fiona = ">=1.8.21" +numpy = ">=1.24" packaging = "*" -pandas = ">=1.4.0" -pyproj = ">=3.3.0" -shapely = ">=1.8.0" +pandas = ">=2.0.0" +pyogrio = ">=0.7.2" +pyproj = ">=3.5.0" +shapely = ">=2.0.0" + +[package.extras] +all = ["GeoAlchemy2", "SQLAlchemy (>=2.0)", "folium", "geopy", "mapclassify (>=2.5)", "matplotlib (>=3.7)", "pointpats (>=2.5.3)", "psycopg[binary] (>=3.1.0)", "pyarrow (>=10.0.0)", "scipy", "xyzservices"] +dev = ["codecov", "pre-commit", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist", "ruff"] [[package]] name = "geopy" @@ -1960,6 +2314,7 @@ version = "2.4.1" description = "Python Geocoding Toolbox" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "geopy-2.4.1-py3-none-any.whl", hash = "sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7"}, {file = "geopy-2.4.1.tar.gz", hash = "sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1"}, @@ -1977,12 +2332,103 @@ dev-test = ["coverage", "pytest (>=3.10)", "pytest-asyncio (>=0.17)", "sphinx (< requests = ["requests (>=2.16.2)", "urllib3 (>=1.24.2)"] timezone = ["pytz"] +[[package]] +name = "giga-spatial" +version = "0.9.2" +description = "A package for spatial data download & processing" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "giga_spatial-0.9.2-py3-none-any.whl", hash = "sha256:80b0ec2ba5f843b77e7f0ef2a2b8694ccdea53b0c1745d0c8ab0d87c31c411d2"}, + {file = "giga_spatial-0.9.2.tar.gz", hash = "sha256:07651718e26e28133636fe87d412ac7a858388641a40168324cfbf09d28ad3e0"}, +] + +[package.dependencies] +bs4 = "0.0.2" +geopandas = ">=1.0.1" +h3 = ">=4.2.0" +hdx-python-api = ">=6.3.8" +httpx = ">=0.27" +mercantile = "1.2.1" +networkx = ">=3.2.1" +numpy = ">=2.2.2" +OWSLib = ">=0.31.0" +pandas = ">=2.2.3" +psutil = ">=6.0.0" +pycountry = "24.6.1" +pydantic = ">=2.10.6" +pydantic-settings = ">=2.7.1" +rasterio = "1.3.10" +requests = ">=2.32.4" +s2sphere = "0.2.5" +s3fs = ">=2024.12.0" +scipy = ">=1.15.1" +Shapely = ">=2.0.7" +tqdm = ">=4.65.0" + +[package.extras] +all = ["SQLAlchemy (>=2.0.0)", "azure-storage-blob (>=12.22.0)", "dask (>=2024.12.1)", "db-dtypes (>=1.0.0)", "delta-sharing (==1.2.0)", "duckdb (==1.2.0)", "earthengine-api (>=1.7.0)", "geemap (>=0.36.6)", "google-auth (>=2.0.0)", "google-auth-httplib2 (>=0.2.0)", "google-auth-oauthlib (>=1.0.0)", "google-cloud-bigquery (>=3.0.0)", "google-cloud-bigquery-storage (>=2.0.0)", "snowflake-connector-python (>=3.0.0)", "sqlalchemy-trino (==0.5.0)", "unicefdata (>=2.4.0)"] +azure = ["azure-storage-blob (>=12.22.0)"] +bq = ["db-dtypes (>=1.0.0)", "google-auth (>=2.0.0)", "google-auth-httplib2 (>=0.2.0)", "google-auth-oauthlib (>=1.0.0)", "google-cloud-bigquery (>=3.0.0)", "google-cloud-bigquery-storage (>=2.0.0)"] +db = ["SQLAlchemy (>=2.0.0)", "dask (>=2024.12.1)", "sqlalchemy-trino (==0.5.0)"] +delta = ["delta-sharing (==1.2.0)"] +duckdb = ["duckdb (==1.2.0)"] +gee = ["earthengine-api (>=1.7.0)", "geemap (>=0.36.6)"] +snowflake = ["snowflake-connector-python (>=3.0.0)"] +unicef = ["unicefdata (>=2.4.0)"] + +[[package]] +name = "google-api-core" +version = "2.29.0" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "google_api_core-2.29.0-py3-none-any.whl", hash = "sha256:d30bc60980daa36e314b5d5a3e5958b0200cb44ca8fa1be2b614e932b75a3ea9"}, + {file = "google_api_core-2.29.0.tar.gz", hash = "sha256:84181be0f8e6b04006df75ddfe728f24489f0af57c96a529ff7cf45bc28797f7"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.0" +googleapis-common-protos = ">=1.56.2,<2.0.0" +proto-plus = ">=1.22.3,<2.0.0" +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,<7.0.0" +requests = ">=2.18.0,<3.0.0" + +[package.extras] +async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.0)"] +grpc = ["grpcio (>=1.33.2,<2.0.0)", "grpcio (>=1.49.1,<2.0.0) ; python_version >= \"3.11\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "grpcio-status (>=1.33.2,<2.0.0)", "grpcio-status (>=1.49.1,<2.0.0) ; python_version >= \"3.11\"", "grpcio-status (>=1.75.1,<2.0.0) ; python_version >= \"3.14\""] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.0)"] + +[[package]] +name = "google-api-python-client" +version = "2.193.0" +description = "Google API Client Library for Python" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "google_api_python_client-2.193.0-py3-none-any.whl", hash = "sha256:c42aa324b822109901cfecab5dc4fc3915d35a7b376835233c916c70610322db"}, + {file = "google_api_python_client-2.193.0.tar.gz", hash = "sha256:8f88d16e89d11341e0a8b199cafde0fb7e6b44260dffb88d451577cbd1bb5d33"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.0.0" +uritemplate = ">=3.0.1,<5" + [[package]] name = "google-auth" version = "2.29.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, @@ -2000,12 +2446,136 @@ pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] +[[package]] +name = "google-auth-httplib2" +version = "0.3.1" +description = "Google Authentication Library: httplib2 transport" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "google_auth_httplib2-0.3.1-py3-none-any.whl", hash = "sha256:682356a90ef4ba3d06548c37e9112eea6fc00395a11b0303a644c1a86abc275c"}, + {file = "google_auth_httplib2-0.3.1.tar.gz", hash = "sha256:0af542e815784cb64159b4469aa5d71dd41069ba93effa006e1916b1dcd88e55"}, +] + +[package.dependencies] +google-auth = ">=1.32.0,<3.0.0" +httplib2 = ">=0.19.0,<1.0.0" + +[[package]] +name = "google-cloud-core" +version = "2.5.1" +description = "Google Cloud API client core library" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "google_cloud_core-2.5.1-py3-none-any.whl", hash = "sha256:ea62cdf502c20e3e14be8a32c05ed02113d7bef454e40ff3fab6fe1ec9f1f4e7"}, + {file = "google_cloud_core-2.5.1.tar.gz", hash = "sha256:3dc94bdec9d05a31d9f355045ed0f369fbc0d8c665076c734f065d729800f811"}, +] + +[package.dependencies] +google-api-core = ">=2.11.0,<3.0.0" +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "grpcio-status (>=1.38.0,<2.0.0)"] + +[[package]] +name = "google-cloud-storage" +version = "3.10.1" +description = "Google Cloud Storage API client library" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "google_cloud_storage-3.10.1-py3-none-any.whl", hash = "sha256:a72f656759b7b99bda700f901adcb3425a828d4a29f911bc26b3ea79c5b1217f"}, + {file = "google_cloud_storage-3.10.1.tar.gz", hash = "sha256:97db9aa4460727982040edd2bd13ff3d5e2260b5331ad22895802da1fc2a5286"}, +] + +[package.dependencies] +google-api-core = ">=2.27.0,<3.0.0" +google-auth = ">=2.26.1,<3.0.0" +google-cloud-core = ">=2.4.2,<3.0.0" +google-crc32c = ">=1.1.3,<2.0.0" +google-resumable-media = ">=2.7.2,<3.0.0" +requests = ">=2.22.0,<3.0.0" + +[package.extras] +grpc = ["google-api-core[grpc] (>=2.27.0,<3.0.0)", "grpc-google-iam-v1 (>=0.14.0,<1.0.0)", "grpcio (>=1.33.2,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "grpcio-status (>=1.76.0,<2.0.0)", "proto-plus (>=1.22.3,<2.0.0) ; python_version < \"3.13\"", "proto-plus (>=1.25.0,<2.0.0) ; python_version >= \"3.13\"", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0)"] +protobuf = ["protobuf (>=3.20.2,<7.0.0)"] +testing = ["PyYAML", "black", "brotli", "coverage", "flake8", "google-cloud-iam", "google-cloud-kms", "google-cloud-pubsub", "google-cloud-testutils", "google-cloud-testutils", "mock", "numpy", "opentelemetry-sdk", "psutil", "py-cpuinfo", "pyopenssl", "pytest", "pytest-asyncio", "pytest-benchmark", "pytest-cov", "pytest-rerunfailures", "pytest-xdist"] +tracing = ["opentelemetry-api (>=1.1.0,<2.0.0)"] + +[[package]] +name = "google-crc32c" +version = "1.8.0" +description = "A python wrapper of the C library 'Google CRC32C'" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "google_crc32c-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff"}, + {file = "google_crc32c-1.8.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288"}, + {file = "google_crc32c-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d"}, + {file = "google_crc32c-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092"}, + {file = "google_crc32c-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733"}, + {file = "google_crc32c-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8"}, + {file = "google_crc32c-1.8.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7"}, + {file = "google_crc32c-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15"}, + {file = "google_crc32c-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a"}, + {file = "google_crc32c-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2"}, + {file = "google_crc32c-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113"}, + {file = "google_crc32c-1.8.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb"}, + {file = "google_crc32c-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411"}, + {file = "google_crc32c-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454"}, + {file = "google_crc32c-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962"}, + {file = "google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b"}, + {file = "google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27"}, + {file = "google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa"}, + {file = "google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8"}, + {file = "google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f"}, + {file = "google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697"}, + {file = "google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651"}, + {file = "google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2"}, + {file = "google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21"}, + {file = "google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2"}, + {file = "google_crc32c-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc"}, + {file = "google_crc32c-1.8.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2"}, + {file = "google_crc32c-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215"}, + {file = "google_crc32c-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a"}, + {file = "google_crc32c-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f"}, + {file = "google_crc32c-1.8.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93"}, + {file = "google_crc32c-1.8.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c"}, + {file = "google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79"}, +] + +[[package]] +name = "google-resumable-media" +version = "2.8.2" +description = "Utilities for Google Media Downloads and Resumable Uploads" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "google_resumable_media-2.8.2-py3-none-any.whl", hash = "sha256:82b6d8ccd11765268cdd2a2123f417ec806b8eef3000a9a38dfe3033da5fb220"}, + {file = "google_resumable_media-2.8.2.tar.gz", hash = "sha256:f3354a182ebd193ae3f42e3ef95e6c9b10f128320de23ac7637236713b1acd70"}, +] + +[package.dependencies] +google-crc32c = ">=1.0.0,<2.0.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "google-auth (>=1.22.0,<2.0.0)"] +requests = ["requests (>=2.18.0,<3.0.0)"] + [[package]] name = "googleapis-common-protos" version = "1.63.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, @@ -2023,6 +2593,7 @@ version = "3.5.0" description = "GraphQL client for Python" optional = false python-versions = "*" +groups = ["dagster"] files = [ {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"}, {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"}, @@ -2037,13 +2608,13 @@ requests-toolbelt = {version = ">=1.0.0,<2", optional = true, markers = "extra = yarl = ">=1.6,<2.0" [package.extras] -aiohttp = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)"] -all = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"] +aiohttp = ["aiohttp (>=3.8.0,<4) ; python_version <= \"3.11\"", "aiohttp (>=3.9.0b0,<4) ; python_version > \"3.11\""] +all = ["aiohttp (>=3.8.0,<4) ; python_version <= \"3.11\"", "aiohttp (>=3.9.0b0,<4) ; python_version > \"3.11\"", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"] botocore = ["botocore (>=1.21,<2)"] -dev = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] +dev = ["aiofiles", "aiohttp (>=3.8.0,<4) ; python_version <= \"3.11\"", "aiohttp (>=3.9.0b0,<4) ; python_version > \"3.11\"", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] httpx = ["httpx (>=0.23.1,<1)"] requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)"] -test = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] +test = ["aiofiles", "aiohttp (>=3.8.0,<4) ; python_version <= \"3.11\"", "aiohttp (>=3.9.0b0,<4) ; python_version > \"3.11\"", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.4.0)"] websockets = ["websockets (>=10,<12)"] @@ -2053,6 +2624,7 @@ version = "3.3" description = "GraphQL Framework for Python" optional = false python-versions = "*" +groups = ["dagster"] files = [ {file = "graphene-3.3-py2.py3-none-any.whl", hash = "sha256:bb3810be33b54cb3e6969506671eb72319e8d7ba0d5ca9c8066472f75bf35a38"}, {file = "graphene-3.3.tar.gz", hash = "sha256:529bf40c2a698954217d3713c6041d69d3f719ad0080857d7ee31327112446b0"}, @@ -2073,6 +2645,7 @@ version = "3.2.3" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." optional = false python-versions = ">=3.6,<4" +groups = ["dagster", "pipelines"] files = [ {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, @@ -2084,6 +2657,7 @@ version = "3.2.0" description = "Relay library for graphql-core" optional = false python-versions = ">=3.6,<4" +groups = ["dagster"] files = [ {file = "graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c"}, {file = "graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5"}, @@ -2098,6 +2672,8 @@ version = "3.0.3" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "pipelines"] +markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\"" files = [ {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, @@ -2169,6 +2745,7 @@ version = "1.62.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "grpcio-1.62.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:179bee6f5ed7b5f618844f760b6acf7e910988de77a4f75b95bbfaa8106f3c1e"}, {file = "grpcio-1.62.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:48611e4fa010e823ba2de8fd3f77c1322dd60cb0d180dc6630a7e157b205f7ea"}, @@ -2235,6 +2812,7 @@ version = "1.62.1" description = "Standard Health Checking Service for gRPC" optional = false python-versions = ">=3.6" +groups = ["dagster", "pipelines"] files = [ {file = "grpcio-health-checking-1.62.1.tar.gz", hash = "sha256:9e56180a941b1d32a077d7491e0611d0483c396358afd5349bf00152612e4583"}, {file = "grpcio_health_checking-1.62.1-py3-none-any.whl", hash = "sha256:9ce761c09fc383e7aa2f7e6c0b0b65d5a1157c1b98d1f5871f7c38aca47d49b9"}, @@ -2250,6 +2828,7 @@ version = "1.62.1" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.6" +groups = ["pipelines"] files = [ {file = "grpcio-status-1.62.1.tar.gz", hash = "sha256:3431c8abbab0054912c41df5c72f03ddf3b7a67be8a287bb3c18a3456f96ff77"}, {file = "grpcio_status-1.62.1-py3-none-any.whl", hash = "sha256:af0c3ab85da31669f21749e8d53d669c061ebc6ce5637be49a46edcb7aa8ab17"}, @@ -2266,6 +2845,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -2277,6 +2857,7 @@ version = "4.1.0" description = "HTTP/2 State-Machine based protocol implementation" optional = false python-versions = ">=3.6.1" +groups = ["main", "pipelines"] files = [ {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, @@ -2288,57 +2869,139 @@ hyperframe = ">=6.0,<7" [[package]] name = "h3" -version = "3.7.7" -description = "Hierarchical hexagonal geospatial indexing system" +version = "4.4.2" +description = "Uber's hierarchical hexagonal geospatial indexing system" optional = false -python-versions = "*" -files = [ - {file = "h3-3.7.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:951ecc9da0bcd5091670b13636928747bc98bc76891da0fa725524ec017cd9de"}, - {file = "h3-3.7.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26b9dd605541223ef927cc913deccb236cee024b16032f4a3e4387e2791479f2"}, - {file = "h3-3.7.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:996ebb32dc26dd607af7493149f94ce316117be6f42971f7b33bbd326ec695d2"}, - {file = "h3-3.7.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa2a4aa888cd9476788b874b4e11e178293f5b86e8461c36596bf183c242d417"}, - {file = "h3-3.7.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0256e42687470c6f0044ca78fe375fe32a654be8b5a8313b4a68f52f513389c6"}, - {file = "h3-3.7.7-cp310-cp310-win_amd64.whl", hash = "sha256:a3e2bc125490f900e0513c30480722f129bab1415f23040b6cd3a3f8d5a39336"}, - {file = "h3-3.7.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d59018a50cd3b6d0ff0b18a54fdfcbaf2f79c13c831842f54fd2780c4b561ea"}, - {file = "h3-3.7.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e74526d941c1656fe162cc63b459b61aa83a15e257e9477b1570f26c544b51a"}, - {file = "h3-3.7.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7398dbab685fcf3fe92f7c4c5901ab258bc66f7fa05fd1da8693375a10a549"}, - {file = "h3-3.7.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d22ea488ab5fe01c94070e9a6b3222916905a4d3f7a9d33cb2298c93fa0ffd3"}, - {file = "h3-3.7.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c94836155e8169be393980fc059f06481a14dd1913bd9cba609f6f1e8864c171"}, - {file = "h3-3.7.7-cp311-cp311-win_amd64.whl", hash = "sha256:836e74313ff55324485cd7e07783bc67df3191ec08a318035d7cd8ee0b0badab"}, - {file = "h3-3.7.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51c2f63ef5a57e4b18ebc9c0eb56656433e280ec45ab487a514127bb6e7d6a1f"}, - {file = "h3-3.7.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d6e38dea47c220d9802af8e8bebc806f9f39358aee07b736191ff21e2c9921d"}, - {file = "h3-3.7.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e408342e94f558802a97bfcbe1baae2af8b1fd926ad9041d970ff9dbd0502099"}, - {file = "h3-3.7.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:644c3c84585aa4df62e81bc54fd305c4d6686324731de230b0ddbd7036ed172c"}, - {file = "h3-3.7.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bb4a3d5e82d0c89512dc71b4eac17976a29be29da250ba76bc94bc5b9e824f0e"}, - {file = "h3-3.7.7-cp312-cp312-win_amd64.whl", hash = "sha256:2ccff5f02589e80202597ed0b9f61ebd114e262e7dd0fe88059298602898192f"}, - {file = "h3-3.7.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ef2e71b619f984e71c4bd9d128152e2c7e3e788e2d2ec571b32cef1d295ddf38"}, - {file = "h3-3.7.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cb13f0213ed6da80e739355e5b62cfc81b7b1469af997be3384a6cbc3a1a750"}, - {file = "h3-3.7.7-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:701f72f703d892fb17e66b9fd7b6b2ad125e135b091eb7dd0ec11858b84d84d2"}, - {file = "h3-3.7.7-cp36-cp36m-win_amd64.whl", hash = "sha256:796622be7cb052690404c0ac03768183e51ae22505ce4a424b4537b2b7609fba"}, - {file = "h3-3.7.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bcd88a72d6aa97d0f3b3b87b7bfd9725a8909501e6cb9d0057d5b690b6bb37b0"}, - {file = "h3-3.7.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7358ba3f91193a2551c4a8d7ad7fd348e567b3a3581c9c161630029dfb23e07"}, - {file = "h3-3.7.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f34b204edc2e8f7d99a6db4ed1b5d202b7ea3ec6817d373ec432dee14efe04"}, - {file = "h3-3.7.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aa0f8ce89b5e694815ee7a5172a782d58f2652267329de7008354b110b53955"}, - {file = "h3-3.7.7-cp37-cp37m-win_amd64.whl", hash = "sha256:4c851baa1c2d4f29b01157ce2a4cdb1f3879fff5c36ff7861dad1526963a17a7"}, - {file = "h3-3.7.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6f3a9da5472820b0a4add342f96fe52f65fbb8f46984383885738517b38af69e"}, - {file = "h3-3.7.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1c57da776a3c1a01e2986b1f6a31d497ee0be8fcdbaaf9b23bb90f5a90eb8f0b"}, - {file = "h3-3.7.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a5c0c0ddd9c57694ecc3b9ba99cbef2842882f8943d6edc676a365e139dbc6d"}, - {file = "h3-3.7.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c1b5a0a652719b645387231bf6d7d4dd85150e4440a4ce72a804a10e86592ae"}, - {file = "h3-3.7.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:64f76dc827fef94e9f43f95a1daea2e11f2ad2e8c55deac072f3d59bd62412d4"}, - {file = "h3-3.7.7-cp38-cp38-win_amd64.whl", hash = "sha256:c993a36120d7f5607f24ba9e39caf715eaf9cd9d44f5d5660fd85e3f4e0c6bf7"}, - {file = "h3-3.7.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eb154d2af699870b888e10476e327c895078009d2d2a6ef2d053d7dcf0e2c270"}, - {file = "h3-3.7.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c96ad74e246bb7638d413efa8199dd4c58ee929424a4dcaadb16365195f77f87"}, - {file = "h3-3.7.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52901f14f8b6e2c82075fd52c0e70176b868f621d47b5dc93f468c510e963722"}, - {file = "h3-3.7.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9d82a0fcc647e7bab36ab2e7a7392d141edc95d113ccf972e0fb7b0ddf80a0"}, - {file = "h3-3.7.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f4417d09acb36f0452346052f576923d6e4334bff3459f217d6278d40397424"}, - {file = "h3-3.7.7-cp39-cp39-win_amd64.whl", hash = "sha256:7ae774cd43b057f68dc10c99e4522fa40ed6b32ab90b2df0025595ffa15e77a0"}, - {file = "h3-3.7.7.tar.gz", hash = "sha256:33d141c3cef0725a881771fd8cb80c06a0db84a6e4ca5c647ce095ae07c61e94"}, -] - -[package.extras] -all = ["flake8", "numpy", "pylint", "pytest", "pytest-cov"] +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "h3-4.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f6734ed12b316061f6ea49f30738ab8a46a4501f83604495385923423a4c43bb"}, + {file = "h3-4.4.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ae19c613264d143ba451e5fc4dae6febadcd84552934fb1b3b7305d4580b63"}, + {file = "h3-4.4.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9309319d8cf2a8e12faa2f26d4eb39802bea3aabd6197e03a8e30ca76f548ac3"}, + {file = "h3-4.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:940078b2eb815e3dd4a27b853a9215718890986ae2f0317e80350bd41b0165f8"}, + {file = "h3-4.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:0c30a7d732f3702249badb1d0c17f0faf299749aa202141ab6d49b89d2b9a721"}, + {file = "h3-4.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f3b06d2403f591aaaef96499726ced99aff560c0951e354d5c2133c43873c74"}, + {file = "h3-4.4.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28e857c8a3f8183d30e1860d997fc1c0f1f40242baba55e026bbb88623791eac"}, + {file = "h3-4.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17b9230ca5ef70ffed23ccc6ed8fe30300b5146ad1f77ec0a5d7b2e1bfd84dcf"}, + {file = "h3-4.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5ba03b202233e1bdedf52608e0ff30dd4ca52cc1b3c0fd8847a914368a1ab846"}, + {file = "h3-4.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:8cebe93fc477620354bde6e8a8c745f3a0b6996df78225a11e82902bc70b5061"}, + {file = "h3-4.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:57e0af15a694ad03f620800232bb545173ccb25ae8c9112144a1eed5b3811fd7"}, + {file = "h3-4.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0f79e9ee215e6896dae41c93ebf95b3fc594818feecbcecf7833e1f8b9c892b7"}, + {file = "h3-4.4.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03b423232cafe89b4b06c2f8c636a7c04efecf6cc0f539e4eaa6301a9b21fd46"}, + {file = "h3-4.4.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0947c86532005870eb5565bda80270dc37029f34ffa4903e5f353ce5d4acab41"}, + {file = "h3-4.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06267484978c7df7d8e675dfab660967387f9ef154c7452ae38b578d80641445"}, + {file = "h3-4.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:8d612b6dc0ccca41fe4bdcfe3b59915c9455aa791db031b49f05d48f243fcc05"}, + {file = "h3-4.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:6f1e76252ed43fd58f92fbf29d4d0d0aa9af26b97c31d2ea0a6d38f074f89e78"}, + {file = "h3-4.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:76dbf27b8bdf0d21275ad5f16206385208c11e6f1b96d5a88c9df974ff6b8fe5"}, + {file = "h3-4.4.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b61e8d5cafd39434c036a905d34729e99c3ebede591a92e8532840cad41d51f"}, + {file = "h3-4.4.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e243abf0f738d7ef5683ee52e3dd1ab0abebe9c38d05d485b5aff7cec97be3e9"}, + {file = "h3-4.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bc0059c73dabf82d9be29f524d1bd8cb670b903406d11d02e5826acd8b2f887c"}, + {file = "h3-4.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:1ddff977c69afca3bd37af0c97a942ab35d5a98830af2ba9b7450ee0365d5852"}, + {file = "h3-4.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:ff52be8019c943cc124f99664c61eb0dddf86f1c35cddce10685d86bc0e609ad"}, + {file = "h3-4.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4afd9362353852e751029e2f1933af9e0606bd0903f9e48daf35a3ded26251ad"}, + {file = "h3-4.4.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3b09636f08ab5213d703940638eaf58c8d1d8c0d0e13405b72b4d48a3e06c38"}, + {file = "h3-4.4.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa8fd684e0e0d367c65d94c33b4bc6653524688ee9d1099a5f92e46c3db4b11e"}, + {file = "h3-4.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4298da8334dfd69163d6eb4ae22e95f37dd495dddee116d1d1c964438352257e"}, + {file = "h3-4.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:d05d4e053ea288fc9e5b6eb94980ab980d160cd10db34ff1351e5959b68e7f7a"}, + {file = "h3-4.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ad6583420824f62c7dd09388eb7799644518bb79c28e1e5ddcf9583d1e3643e"}, + {file = "h3-4.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5489c06eb616d28f9905ac23449e807edd0cea280425dcf86641379267006115"}, + {file = "h3-4.4.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cfadbd484fbe2cd4aca821e516448edc5763edb208d17b9e42dd7b309fbcc5b"}, + {file = "h3-4.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:7767f82d383f4e605b9e79690ddcfaf6264edbf9046396117fdd7ee74473c839"}, + {file = "h3-4.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae447d7d502c603ccfd1921a350a74ec974dfb413a7b23590db6406799bcb68e"}, + {file = "h3-4.4.2-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dec77114f4710ee1f67cf68a1f6b998a4332be5d7d23564cacf890ebd3ef9ef4"}, + {file = "h3-4.4.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb89dd3b6abe5bd615b174bb8b8af3ab08caf3eca52051e8df041b19b285f653"}, + {file = "h3-4.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ab440dca9efdb98ec52509f44a2d3b347dc625cc31120d90708b55b976796b80"}, + {file = "h3-4.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b63035da31caab0e24785b7fd682235d0f7d8eddd794d3c497af64639e6d8b80"}, + {file = "h3-4.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f1edc99f6f1caeed0b178b5085e57057b031fb371011da134d4fbab7128bb2b"}, + {file = "h3-4.4.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4ca21dae7d57bf244dc370547214ff01829e7366890aef00528a0a90a1d1295"}, + {file = "h3-4.4.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebd0bbd94e765dd61b368df485e261d5adf6042786bf4cbf0998fc92a757ae5a"}, + {file = "h3-4.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:337fd4f451b25ae539b81beb8f1e81f81e504258d618154c8907fd353503b1d7"}, + {file = "h3-4.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:18ced443ea81ec58407a462ba039064f84fec4325250b3e67143438852f8f540"}, + {file = "h3-4.4.2.tar.gz", hash = "sha256:b25ab9f339e40b10dcb5e2e6988d07672e780a4950d79c25380d308cdf14f82f"}, +] + +[package.extras] +all = ["cartopy", "contextily", "geodatasets", "geopandas", "geoviews", "h3[test]", "jupyter-book (<2)", "jupyterlab", "jupyterlab-geojson", "matplotlib", "sphinx (>=7.3.3)"] numpy = ["numpy"] -test = ["flake8", "pylint", "pytest", "pytest-cov"] +test = ["numpy", "pytest", "pytest-cov", "ruff"] + +[[package]] +name = "hdx-python-api" +version = "6.6.5" +description = "HDX Python API for interacting with the Humanitarian Data Exchange" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "hdx_python_api-6.6.5-py3-none-any.whl", hash = "sha256:af91b2106cb11d648b21df6af5a03e4413c61a19ac2ac0a0d485580796ded507"}, + {file = "hdx_python_api-6.6.5.tar.gz", hash = "sha256:19700881264e7bede26075332df09988ba2111864bc4dbae2dc2e191780138bb"}, +] + +[package.dependencies] +ckanapi = ">=4.8" +defopt = ">=7.0.0" +email-validator = "*" +hdx-python-country = ">=4.0.1" +hdx-python-utilities = ">=4.0.4" +makefun = "*" +requests = "*" + +[package.extras] +docs = ["mkapi"] + +[[package]] +name = "hdx-python-country" +version = "4.1.1" +description = "HDX Python country code and exchange rate (fx) utilities" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "hdx_python_country-4.1.1-py3-none-any.whl", hash = "sha256:e22408664e25401a399fc2ac24cdae93b9ec9317b2238d70f09760ec5a41423a"}, + {file = "hdx_python_country-4.1.1.tar.gz", hash = "sha256:210fd077a2761dcbd28561a209d401c81f2314e4279939fd1c5ff75cae12eea0"}, +] + +[package.dependencies] +hdx-python-utilities = ">=4.0.4,<5" +tenacity = "*" + +[package.extras] +docs = ["mkapi"] + +[[package]] +name = "hdx-python-utilities" +version = "4.0.8" +description = "HDX Python Utilities for streaming tabular data, date and time handling and other helpful functions" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "hdx_python_utilities-4.0.8-py3-none-any.whl", hash = "sha256:d6f608c680ec3a19357e0e6506fed25f8c8b9ac253e1886962e60f7817de6cd6"}, + {file = "hdx_python_utilities-4.0.8.tar.gz", hash = "sha256:53a9c45f7be4ce15d4ae3c039ad696ca5dd0b1ee64f4c623a06c7ea66c4dc3b0"}, +] + +[package.dependencies] +frictionless = ">=5.18.0" +ijson = ">=3.2.3" +jsonlines = ">=4.0.0" +loguru = "*" +openpyxl = ">=3.1.2" +pyphonetics = "*" +python-dateutil = ">=2.9.0,<2.9.1" +ratelimit = "*" +requests-file = "*" +ruamel-yaml = "*" +tableschema-to-template = ">=0.0.13" +typing-extensions = "*" +xlrd = ">=2.0.1" +xlsx2csv = "*" +xlwt = ">=1.3.0" + +[package.extras] +diff = ["cydifflib"] +docs = ["mkapi"] +email = ["email-validator"] +html = ["beautifulsoup4", "html5lib"] [[package]] name = "hpack" @@ -2346,6 +3009,7 @@ version = "4.0.0" description = "Pure-Python HPACK header compression" optional = false python-versions = ">=3.6.1" +groups = ["main", "pipelines"] files = [ {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, @@ -2357,6 +3021,7 @@ version = "1.0.4" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main", "notebook", "pipelines"] files = [ {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, @@ -2372,12 +3037,28 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.25.0)"] +[[package]] +name = "httplib2" +version = "0.31.2" +description = "A comprehensive HTTP client library." +optional = false +python-versions = ">=3.6" +groups = ["pipelines"] +files = [ + {file = "httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349"}, + {file = "httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24"}, +] + +[package.dependencies] +pyparsing = ">=3.1,<4" + [[package]] name = "httptools" version = "0.6.1" description = "A collection of framework independent HTTP protocol utils." optional = false python-versions = ">=3.8.0" +groups = ["dagster"] files = [ {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, @@ -2426,6 +3107,7 @@ version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main", "notebook", "pipelines"] files = [ {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, @@ -2440,7 +3122,7 @@ idna = "*" sniffio = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -2451,6 +3133,7 @@ version = "10.0" description = "Human friendly output for text interfaces using Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["dagster", "pipelines"] files = [ {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, @@ -2459,12 +3142,28 @@ files = [ [package.dependencies] pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} +[[package]] +name = "humanize" +version = "4.15.0" +description = "Python humanize utilities" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "humanize-4.15.0-py3-none-any.whl", hash = "sha256:b1186eb9f5a9749cd9cb8565aee77919dd7c8d076161cf44d70e59e3301e1769"}, + {file = "humanize-4.15.0.tar.gz", hash = "sha256:1dd098483eb1c7ee8e32eb2e99ad1910baefa4b75c3aff3a82f4d78688993b10"}, +] + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + [[package]] name = "hyperframe" version = "6.0.1" description = "HTTP/2 framing layer for Python" optional = false python-versions = ">=3.6.1" +groups = ["main", "pipelines"] files = [ {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, @@ -2476,6 +3175,7 @@ version = "2.1.3" description = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "icecream-2.1.3-py2.py3-none-any.whl", hash = "sha256:757aec31ad4488b949bc4f499d18e6e5973c40cc4d4fc607229e78cfaec94c34"}, {file = "icecream-2.1.3.tar.gz", hash = "sha256:0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de"}, @@ -2493,6 +3193,7 @@ version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -2504,6 +3205,7 @@ version = "3.2.3" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" +groups = ["pipelines"] files = [ {file = "ijson-3.2.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a4ae076bf97b0430e4e16c9cb635a6b773904aec45ed8dcbc9b17211b8569ba"}, {file = "ijson-3.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cfced0a6ec85916eb8c8e22415b7267ae118eaff2a860c42d2cc1261711d0d31"}, @@ -2602,6 +3304,7 @@ version = "7.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines", "spark"] files = [ {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, @@ -2613,7 +3316,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "iniconfig" @@ -2621,6 +3324,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -2632,6 +3336,7 @@ version = "6.29.3" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "ipykernel-6.29.3-py3-none-any.whl", hash = "sha256:5aa086a4175b0229d4eca211e181fb473ea78ffd9869af36ba7694c947302a21"}, {file = "ipykernel-6.29.3.tar.gz", hash = "sha256:e14c250d1f9ea3989490225cc1a542781b095a18a19447fcf2b5eaf7d0ac5bd2"}, @@ -2665,6 +3370,7 @@ version = "8.22.2" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" +groups = ["dev", "notebook"] files = [ {file = "ipython-8.22.2-py3-none-any.whl", hash = "sha256:3c86f284c8f3d8f2b6c662f885c4889a91df7cd52056fd02b7d8d6195d7f56e9"}, {file = "ipython-8.22.2.tar.gz", hash = "sha256:2dcaad9049f9056f1fef63514f176c7d41f930daa78d05b82a176202818f2c14"}, @@ -2700,6 +3406,7 @@ version = "8.1.2" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, @@ -2721,6 +3428,7 @@ version = "0.6.1" description = "An ISO 8601 date/time/duration parser and formatter" optional = false python-versions = "*" +groups = ["pipelines"] files = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, @@ -2735,6 +3443,7 @@ version = "20.11.0" description = "Operations with ISO 8601 durations" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, @@ -2749,6 +3458,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -2763,6 +3473,7 @@ version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["dev", "notebook"] files = [ {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, @@ -2782,6 +3493,7 @@ version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["dagster", "notebook", "pipelines"] files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, @@ -2793,23 +3505,52 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.1.0" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64"}, + {file = "jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d"}, +] + [[package]] name = "json5" version = "0.9.24" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "json5-0.9.24-py3-none-any.whl", hash = "sha256:4ca101fd5c7cb47960c055ef8f4d0e31e15a7c6c48c3b6f1473fc83b6c462a13"}, {file = "json5-0.9.24.tar.gz", hash = "sha256:0c638399421da959a20952782800e5c1a78c14e08e1dc9738fa10d8ec14d58c8"}, ] +[[package]] +name = "jsonlines" +version = "4.0.0" +description = "Library with helpers for the jsonlines file format" +optional = false +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55"}, + {file = "jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + [[package]] name = "jsonpointer" version = "2.4" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +groups = ["notebook"] files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, @@ -2821,6 +3562,7 @@ version = "1.1.0" description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, @@ -2832,6 +3574,7 @@ version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["notebook", "pipelines"] files = [ {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, @@ -2861,6 +3604,7 @@ version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" +groups = ["notebook", "pipelines"] files = [ {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, @@ -2875,6 +3619,7 @@ version = "1.0.0" description = "Jupyter metapackage. Install all the Jupyter components in one go." optional = false python-versions = "*" +groups = ["notebook"] files = [ {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, @@ -2895,6 +3640,7 @@ version = "8.6.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, @@ -2909,7 +3655,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-console" @@ -2917,6 +3663,7 @@ version = "6.6.3" description = "Jupyter terminal console" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, @@ -2941,6 +3688,7 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, @@ -2961,6 +3709,7 @@ version = "0.10.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, @@ -2986,6 +3735,7 @@ version = "2.2.4" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyter-lsp-2.2.4.tar.gz", hash = "sha256:5e50033149344065348e688608f3c6d654ef06d9856b67655bd7b6bac9ee2d59"}, {file = "jupyter_lsp-2.2.4-py3-none-any.whl", hash = "sha256:da61cb63a16b6dff5eac55c2699cc36eac975645adee02c41bdfc03bf4802e77"}, @@ -3000,6 +3750,7 @@ version = "2.13.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyter_server-2.13.0-py3-none-any.whl", hash = "sha256:77b2b49c3831fbbfbdb5048cef4350d12946191f833a24e5f83e5f8f4803e97b"}, {file = "jupyter_server-2.13.0.tar.gz", hash = "sha256:c80bfb049ea20053c3d9641c2add4848b38073bf79f1729cea1faed32fc1c78e"}, @@ -3036,6 +3787,7 @@ version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, @@ -3055,6 +3807,7 @@ version = "4.2.5" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyterlab-4.2.5-py3-none-any.whl", hash = "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321"}, {file = "jupyterlab-4.2.5.tar.gz", hash = "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75"}, @@ -3088,6 +3841,7 @@ version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -3099,6 +3853,7 @@ version = "2.27.3" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, @@ -3124,6 +3879,7 @@ version = "3.0.10" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, @@ -3135,6 +3891,7 @@ version = "29.0.0" description = "Kubernetes python client" optional = false python-versions = ">=3.6" +groups = ["dagster"] files = [ {file = "kubernetes-29.0.0-py2.py3-none-any.whl", hash = "sha256:ab8cb0e0576ccdfb71886366efb102c6a20f268d817be065ce7f9909c631e43e"}, {file = "kubernetes-29.0.0.tar.gz", hash = "sha256:c4812e227ae74d07d53c88293e564e54b850452715a59a927e7e1bc6b9a60459"}, @@ -3161,6 +3918,7 @@ version = "0.7.2" description = "Python logging made (stupidly) simple" optional = false python-versions = ">=3.5" +groups = ["main", "pipelines"] files = [ {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, @@ -3171,7 +3929,163 @@ colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] +dev = ["Sphinx (==7.2.5) ; python_version >= \"3.9\"", "colorama (==0.4.5) ; python_version < \"3.8\"", "colorama (==0.4.6) ; python_version >= \"3.8\"", "exceptiongroup (==1.1.3) ; python_version >= \"3.7\" and python_version < \"3.11\"", "freezegun (==1.1.0) ; python_version < \"3.8\"", "freezegun (==1.2.2) ; python_version >= \"3.8\"", "mypy (==v0.910) ; python_version < \"3.6\"", "mypy (==v0.971) ; python_version == \"3.6\"", "mypy (==v1.4.1) ; python_version == \"3.7\"", "mypy (==v1.5.1) ; python_version >= \"3.8\"", "pre-commit (==3.4.0) ; python_version >= \"3.8\"", "pytest (==6.1.2) ; python_version < \"3.8\"", "pytest (==7.4.0) ; python_version >= \"3.8\"", "pytest-cov (==2.12.1) ; python_version < \"3.8\"", "pytest-cov (==4.1.0) ; python_version >= \"3.8\"", "pytest-mypy-plugins (==1.9.3) ; python_version >= \"3.6\" and python_version < \"3.8\"", "pytest-mypy-plugins (==3.0.0) ; python_version >= \"3.8\"", "sphinx-autobuild (==2021.3.14) ; python_version >= \"3.9\"", "sphinx-rtd-theme (==1.3.0) ; python_version >= \"3.9\"", "tox (==3.27.1) ; python_version < \"3.8\"", "tox (==4.11.0) ; python_version >= \"3.8\""] + +[[package]] +name = "lxml" +version = "6.0.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "lxml-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388"}, + {file = "lxml-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c"}, + {file = "lxml-6.0.2-cp310-cp310-win32.whl", hash = "sha256:1e786a464c191ca43b133906c6903a7e4d56bef376b75d97ccbb8ec5cf1f0a4b"}, + {file = "lxml-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:dacf3c64ef3f7440e3167aa4b49aa9e0fb99e0aa4f9ff03795640bf94531bcb0"}, + {file = "lxml-6.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:45f93e6f75123f88d7f0cfd90f2d05f441b808562bf0bc01070a00f53f5028b5"}, + {file = "lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607"}, + {file = "lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7"}, + {file = "lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46"}, + {file = "lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078"}, + {file = "lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285"}, + {file = "lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456"}, + {file = "lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322"}, + {file = "lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849"}, + {file = "lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f"}, + {file = "lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6"}, + {file = "lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77"}, + {file = "lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314"}, + {file = "lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2"}, + {file = "lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7"}, + {file = "lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf"}, + {file = "lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe"}, + {file = "lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c"}, + {file = "lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b"}, + {file = "lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed"}, + {file = "lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8"}, + {file = "lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d"}, + {file = "lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f"}, + {file = "lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312"}, + {file = "lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca"}, + {file = "lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c"}, + {file = "lxml-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a656ca105115f6b766bba324f23a67914d9c728dafec57638e2b92a9dcd76c62"}, + {file = "lxml-6.0.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c54d83a2188a10ebdba573f16bd97135d06c9ef60c3dc495315c7a28c80a263f"}, + {file = "lxml-6.0.2-cp38-cp38-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:1ea99340b3c729beea786f78c38f60f4795622f36e305d9c9be402201efdc3b7"}, + {file = "lxml-6.0.2-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:af85529ae8d2a453feee4c780d9406a5e3b17cee0dd75c18bd31adcd584debc3"}, + {file = "lxml-6.0.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fe659f6b5d10fb5a17f00a50eb903eb277a71ee35df4615db573c069bcf967ac"}, + {file = "lxml-6.0.2-cp38-cp38-win32.whl", hash = "sha256:5921d924aa5468c939d95c9814fa9f9b5935a6ff4e679e26aaf2951f74043512"}, + {file = "lxml-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:0aa7070978f893954008ab73bb9e3c24a7c56c054e00566a21b553dc18105fca"}, + {file = "lxml-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694"}, + {file = "lxml-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb"}, + {file = "lxml-6.0.2-cp39-cp39-win32.whl", hash = "sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f"}, + {file = "lxml-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304"}, + {file = "lxml-6.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:24a8e756c982c001ca8d59e87c80c4d9dcd4d9b44a4cbeb8d9be4482c514d41d"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e"}, + {file = "lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml_html_clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] [[package]] name = "lz4" @@ -3179,6 +4093,7 @@ version = "4.4.4" description = "LZ4 Bindings for Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "lz4-4.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f170abb8416c4efca48e76cac2c86c3185efdf841aecbe5c190121c42828ced0"}, {file = "lz4-4.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d33a5105cd96ebd32c3e78d7ece6123a9d2fb7c18b84dec61f27837d9e0c496c"}, @@ -3228,12 +4143,25 @@ docs = ["sphinx (>=1.6.0)", "sphinx_bootstrap_theme"] flake8 = ["flake8"] tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] +[[package]] +name = "makefun" +version = "1.16.0" +description = "Small library to dynamically create python functions." +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "makefun-1.16.0-py2.py3-none-any.whl", hash = "sha256:43baa4c3e7ae2b17de9ceac20b669e9a67ceeadff31581007cca20a07bbe42c4"}, + {file = "makefun-1.16.0.tar.gz", hash = "sha256:e14601831570bff1f6d7e68828bcd30d2f5856f24bad5de0ccb22921ceebc947"}, +] + [[package]] name = "mako" version = "1.3.2" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "Mako-1.3.2-py3-none-any.whl", hash = "sha256:32a99d70754dfce237019d17ffe4a282d2d3351b9c476e90d8a60e63f133b80c"}, {file = "Mako-1.3.2.tar.gz", hash = "sha256:2a0c8ad7f6274271b3bb7467dd37cf9cc6dab4bc19cb69a4ef10669402de698e"}, @@ -3253,6 +4181,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -3271,12 +4200,30 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +[[package]] +name = "marko" +version = "2.2.2" +description = "A markdown parser with high extensibility." +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "marko-2.2.2-py3-none-any.whl", hash = "sha256:f064ae8c10416285ad1d96048dc11e98ef04e662d3342ae416f662b70aa7959e"}, + {file = "marko-2.2.2.tar.gz", hash = "sha256:6940308e655f63733ca518c47a68ec9510279dbb916c83616e4c4b5829f052e8"}, +] + +[package.extras] +codehilite = ["pygments"] +repr = ["objprint"] +toc = ["python-slugify"] + [[package]] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" +groups = ["dagster", "notebook", "pipelines"] files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, @@ -3346,6 +4293,7 @@ version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.5" +groups = ["dev", "notebook"] files = [ {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, @@ -3360,6 +4308,7 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -3371,17 +4320,38 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mercantile" +version = "1.2.1" +description = "Web mercator XYZ tile utilities" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "mercantile-1.2.1-py3-none-any.whl", hash = "sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f"}, + {file = "mercantile-1.2.1.tar.gz", hash = "sha256:fa3c6db15daffd58454ac198b31887519a19caccee3f9d63d17ae7ff61b3b56b"}, +] + +[package.dependencies] +click = ">=3.0" + +[package.extras] +dev = ["check-manifest"] +test = ["hypothesis", "pytest"] + [[package]] name = "microsoft-kiota-abstractions" version = "1.3.2" description = "Core abstractions for kiota generated libraries in Python" optional = false python-versions = "*" +groups = ["main", "pipelines"] files = [ {file = "microsoft_kiota_abstractions-1.3.2-py2.py3-none-any.whl", hash = "sha256:ec4335df425874b1c0171a97c4b5ccdc4a9d076e1ecd3a5c2582af1cacc25016"}, {file = "microsoft_kiota_abstractions-1.3.2.tar.gz", hash = "sha256:acac0b34b443d3fc10a3a86dd996cdf92248080553a3768a77c23350541f1aa2"}, @@ -3398,6 +4368,7 @@ version = "1.0.0" description = "Authentication provider for Kiota using Azure Identity" optional = false python-versions = "*" +groups = ["main", "pipelines"] files = [ {file = "microsoft_kiota_authentication_azure-1.0.0-py2.py3-none-any.whl", hash = "sha256:289fe002951ae661415a6d3fa7c422c096b739165acb32d786316988120a1b27"}, {file = "microsoft_kiota_authentication_azure-1.0.0.tar.gz", hash = "sha256:752304f8d94b884cfec12583dd763ec0478805c7f80b29344e78c6d55a97bd01"}, @@ -3416,6 +4387,7 @@ version = "1.3.1" description = "Kiota http request adapter implementation for httpx library" optional = false python-versions = "*" +groups = ["main", "pipelines"] files = [ {file = "microsoft_kiota_http-1.3.1-py2.py3-none-any.whl", hash = "sha256:d62972c6ed4c785f9808a15479a7421abb38a9519b39e6933e5d05555b9fb427"}, {file = "microsoft_kiota_http-1.3.1.tar.gz", hash = "sha256:09d85310379f88af0a0967925d1fcbe82f2520a9fe6fa1fd50e79af813bc451d"}, @@ -3433,6 +4405,7 @@ version = "0.1.0" description = "Implementation of Kiota Serialization Interfaces for URI-Form encoded serialization" optional = false python-versions = "*" +groups = ["main", "pipelines"] files = [ {file = "microsoft_kiota_serialization_form-0.1.0-py2.py3-none-any.whl", hash = "sha256:5bc76fb2fc67d7c1f878f876d252ea814e4fc38df505099b9b86de52d974380a"}, {file = "microsoft_kiota_serialization_form-0.1.0.tar.gz", hash = "sha256:663ece0cb1a41fe9ddfc9195aa3f15f219e14d2a1ee51e98c53ad8d795b2785d"}, @@ -3448,6 +4421,7 @@ version = "1.1.0" description = "Implementation of Kiota Serialization interfaces for JSON" optional = false python-versions = "*" +groups = ["main", "pipelines"] files = [ {file = "microsoft_kiota_serialization_json-1.1.0-py2.py3-none-any.whl", hash = "sha256:a32c73dd92ef2677dbf1deca2fb44b5111c0ef572b15c47205bff521800cd750"}, {file = "microsoft_kiota_serialization_json-1.1.0.tar.gz", hash = "sha256:72bf65d81c0356ad87c229694733f4eb558628a13c5ee8dd274980c4b2d9b64b"}, @@ -3463,6 +4437,7 @@ version = "0.1.0" description = "Implementation of Kiota Serialization Interfaces for Multipart serialization" optional = false python-versions = "*" +groups = ["main", "pipelines"] files = [ {file = "microsoft_kiota_serialization_multipart-0.1.0-py2.py3-none-any.whl", hash = "sha256:ef183902e77807806b8a181cdde53ba5bc04c6c9bdb2f7d80f8bad5d720e0015"}, {file = "microsoft_kiota_serialization_multipart-0.1.0.tar.gz", hash = "sha256:14e89e92582e6630ddbc70ac67b70bf189dacbfc41a96d3e1d10339e86c8dde5"}, @@ -3477,6 +4452,7 @@ version = "1.0.0" description = "Implementation of Kiota Serialization interfaces for text/plain" optional = false python-versions = "*" +groups = ["main", "pipelines"] files = [ {file = "microsoft_kiota_serialization_text-1.0.0-py2.py3-none-any.whl", hash = "sha256:1d3789e012b603e059a36cc675d1fd08cb81e0dde423d970c0af2eabce9c0d43"}, {file = "microsoft_kiota_serialization_text-1.0.0.tar.gz", hash = "sha256:c3dd3f409b1c4f4963bd1e41d51b65f7e53e852130bb441d79b77dad88ee76ed"}, @@ -3492,6 +4468,7 @@ version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, @@ -3503,6 +4480,7 @@ version = "4.10.1" description = "Official Mixpanel library for Python" optional = false python-versions = ">=2.7, !=3.4.*" +groups = ["pipelines"] files = [ {file = "mixpanel-4.10.1-py2.py3-none-any.whl", hash = "sha256:a7a338b7197327e36356dbc1903086e7626db6d88367ccdd732b3f3c60d3b3ed"}, {file = "mixpanel-4.10.1.tar.gz", hash = "sha256:29a6b5773dd34f05cf8e249f4e1d16e7b6280d6b58894551ce9a5aad7700a115"}, @@ -3519,6 +4497,7 @@ version = "1.28.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" +groups = ["main", "pipelines"] files = [ {file = "msal-1.28.0-py3-none-any.whl", hash = "sha256:3064f80221a21cd535ad8c3fafbb3a3582cd9c7e9af0bb789ae14f726a0ca99b"}, {file = "msal-1.28.0.tar.gz", hash = "sha256:80bbabe34567cb734efd2ec1869b2d98195c927455369d8077b3c542088c5c9d"}, @@ -3530,7 +4509,7 @@ PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.15)"] +broker = ["pymsalruntime (>=0.13.2,<0.15) ; python_version >= \"3.6\" and platform_system == \"Windows\""] [[package]] name = "msal-extensions" @@ -3538,6 +4517,7 @@ version = "1.1.0" description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." optional = false python-versions = ">=3.7" +groups = ["main", "pipelines"] files = [ {file = "msal-extensions-1.1.0.tar.gz", hash = "sha256:6ab357867062db7b253d0bd2df6d411c7891a0ee7308d54d1e4317c1d1c54252"}, {file = "msal_extensions-1.1.0-py3-none-any.whl", hash = "sha256:01be9711b4c0b1a151450068eeb2c4f0997df3bba085ac299de3a66f585e382f"}, @@ -3557,6 +4537,7 @@ version = "1.0.0" description = "Core component of the Microsoft Graph Python SDK" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "msgraph-core-1.0.0.tar.gz", hash = "sha256:f26bcbbb3cd149dd7f1613159e0c2ed862888d61bfd20ef0b08b9408eb670c9d"}, {file = "msgraph_core-1.0.0-py3-none-any.whl", hash = "sha256:f3de5149e246833b4b03605590d0b4eacf58d9c5a10fd951c37e53f0a345afd5"}, @@ -3577,6 +4558,7 @@ version = "1.2.0" description = "The Microsoft Graph Python SDK" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "msgraph-sdk-1.2.0.tar.gz", hash = "sha256:689eec74fcb5cb29446947e4761fa57edeeb3ec1dccd7975c44d12d8d9db9c4f"}, {file = "msgraph_sdk-1.2.0-py3-none-any.whl", hash = "sha256:4a9f706413c0a497cdfffd0b741122a5e73206333d566d115089cef9f4adadb7"}, @@ -3602,6 +4584,7 @@ version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "pipelines"] files = [ {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, @@ -3701,6 +4684,7 @@ version = "1.9.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, @@ -3747,6 +4731,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev", "pipelines"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -3758,6 +4743,7 @@ version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" +groups = ["notebook"] files = [ {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, @@ -3780,6 +4766,7 @@ version = "7.16.3" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, @@ -3817,6 +4804,7 @@ version = "5.10.3" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "nbformat-5.10.3-py3-none-any.whl", hash = "sha256:d9476ca28676799af85385f409b49d95e199951477a159a576ef2a675151e5e8"}, {file = "nbformat-5.10.3.tar.gz", hash = "sha256:60ed5e910ef7c6264b87d644f276b1b49e24011930deef54605188ddeb211685"}, @@ -3838,17 +4826,42 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" +groups = ["notebook"] files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] +[[package]] +name = "networkx" +version = "3.6.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = "!=3.14.1,>=3.11" +groups = ["pipelines"] +files = [ + {file = "networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762"}, + {file = "networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509"}, +] + +[package.extras] +benchmarking = ["asv", "virtualenv"] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "iplotx (>=0.9.0)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0.40)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] + [[package]] name = "nocodb-api" version = "0.0.4" description = "Python client for NocoDB API v2" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "nocodb_api-0.0.4-py3-none-any.whl", hash = "sha256:8cce6414c2a550bc4ecf46e68d4c7beed1aa65f0e828daa4d9f3802eb26dd960"}, {file = "nocodb_api-0.0.4.tar.gz", hash = "sha256:e0d11d094b5e1d1baa41493c7b68e5259e6b516122268e985dbe5af2f362ce13"}, @@ -3866,6 +4879,7 @@ version = "7.2.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "notebook-7.2.2-py3-none-any.whl", hash = "sha256:c89264081f671bc02eec0ed470a627ed791b9156cad9285226b31611d3e9fe1c"}, {file = "notebook-7.2.2.tar.gz", hash = "sha256:2ef07d4220421623ad3fe88118d687bc0450055570cdd160814a59cf3a1c516e"}, @@ -3881,7 +4895,7 @@ tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0) ; python_version < \"3.10\"", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -3889,6 +4903,7 @@ version = "0.2.4" description = "A shim layer for notebook traits and config" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, @@ -3902,47 +4917,84 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numpy" -version = "1.26.4" +version = "2.4.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +python-versions = ">=3.11" +groups = ["main", "pipelines", "spark"] +files = [ + {file = "numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db"}, + {file = "numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0"}, + {file = "numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015"}, + {file = "numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40"}, + {file = "numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d"}, + {file = "numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502"}, + {file = "numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd"}, + {file = "numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5"}, + {file = "numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e"}, + {file = "numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e"}, + {file = "numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e"}, + {file = "numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b"}, + {file = "numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e"}, + {file = "numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842"}, + {file = "numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8"}, + {file = "numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121"}, + {file = "numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e"}, + {file = "numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44"}, + {file = "numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d"}, + {file = "numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827"}, + {file = "numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a"}, + {file = "numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec"}, + {file = "numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50"}, + {file = "numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115"}, + {file = "numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af"}, + {file = "numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c"}, + {file = "numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103"}, + {file = "numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83"}, + {file = "numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed"}, + {file = "numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959"}, + {file = "numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed"}, + {file = "numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf"}, + {file = "numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d"}, + {file = "numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5"}, + {file = "numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7"}, + {file = "numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93"}, + {file = "numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e"}, + {file = "numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40"}, + {file = "numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e"}, + {file = "numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392"}, + {file = "numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008"}, + {file = "numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8"}, + {file = "numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233"}, + {file = "numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0"}, + {file = "numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a"}, + {file = "numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a"}, + {file = "numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b"}, + {file = "numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a"}, + {file = "numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d"}, + {file = "numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252"}, + {file = "numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f"}, + {file = "numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc"}, + {file = "numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74"}, + {file = "numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb"}, + {file = "numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e"}, + {file = "numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113"}, + {file = "numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d"}, + {file = "numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d"}, + {file = "numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f"}, + {file = "numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0"}, + {file = "numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150"}, + {file = "numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871"}, + {file = "numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e"}, + {file = "numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7"}, + {file = "numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4"}, + {file = "numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e"}, + {file = "numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c"}, + {file = "numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3"}, + {file = "numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7"}, + {file = "numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f"}, + {file = "numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119"}, + {file = "numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0"}, ] [[package]] @@ -3951,6 +5003,7 @@ version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false python-versions = ">=3.6" +groups = ["dagster"] files = [ {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, @@ -3967,6 +5020,7 @@ version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.6" +groups = ["main", "pipelines"] files = [ {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, @@ -3981,6 +5035,7 @@ version = "1.24.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "opentelemetry_api-1.24.0-py3-none-any.whl", hash = "sha256:0f2c363d98d10d1ce93330015ca7fd3a65f60be64e05e30f557c61de52c80ca2"}, {file = "opentelemetry_api-1.24.0.tar.gz", hash = "sha256:42719f10ce7b5a9a73b10a4baf620574fb8ad495a9cbe5c18d76b75d8689c67e"}, @@ -3996,6 +5051,7 @@ version = "1.24.0" description = "OpenTelemetry Python SDK" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "opentelemetry_sdk-1.24.0-py3-none-any.whl", hash = "sha256:fa731e24efe832e98bcd90902085b359dcfef7d9c9c00eb5b9a18587dae3eb59"}, {file = "opentelemetry_sdk-1.24.0.tar.gz", hash = "sha256:75bc0563affffa827700e0f4f4a68e1e257db0df13372344aebc6f8a64cde2e5"}, @@ -4012,6 +5068,7 @@ version = "0.45b0" description = "OpenTelemetry Semantic Conventions" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "opentelemetry_semantic_conventions-0.45b0-py3-none-any.whl", hash = "sha256:a4a6fb9a7bacd9167c082aa4681009e9acdbfa28ffb2387af50c2fef3d30c864"}, {file = "opentelemetry_semantic_conventions-0.45b0.tar.gz", hash = "sha256:7c84215a44ac846bc4b8e32d5e78935c5c43482e491812a0bb8aaf87e4d92118"}, @@ -4023,17 +5080,37 @@ version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" +groups = ["notebook"] files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, ] +[[package]] +name = "owslib" +version = "0.35.0" +description = "OGC Web Service utility library" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "owslib-0.35.0-py3-none-any.whl", hash = "sha256:01648ea9b2b86502f456ad68a8dd07131d336416c5637f34adb358aafc0ad380"}, + {file = "owslib-0.35.0.tar.gz", hash = "sha256:0182f377bb30d25b78284bbaf82a12dece97902ed844cee88791ff38665b9b00"}, +] + +[package.dependencies] +lxml = "*" +python-dateutil = "*" +pyyaml = "*" +requests = "*" + [[package]] name = "packaging" version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, @@ -4041,46 +5118,73 @@ files = [ [[package]] name = "pandas" -version = "2.2.1" +version = "2.3.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" -files = [ - {file = "pandas-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88"}, - {file = "pandas-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944"}, - {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359"}, - {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51"}, - {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06"}, - {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9"}, - {file = "pandas-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0"}, - {file = "pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b"}, - {file = "pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a"}, - {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02"}, - {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403"}, - {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd"}, - {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7"}, - {file = "pandas-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e"}, - {file = "pandas-2.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c"}, - {file = "pandas-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee"}, - {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2"}, - {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0"}, - {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc"}, - {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89"}, - {file = "pandas-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb"}, - {file = "pandas-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397"}, - {file = "pandas-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16"}, - {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019"}, - {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df"}, - {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6"}, - {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be"}, - {file = "pandas-2.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab"}, - {file = "pandas-2.2.1.tar.gz", hash = "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572"}, +groups = ["pipelines"] +files = [ + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, ] [package.dependencies] numpy = [ - {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, - {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4117,6 +5221,7 @@ version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["notebook"] files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -4128,6 +5233,7 @@ version = "0.8.3" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["dev", "notebook"] files = [ {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, @@ -4143,6 +5249,7 @@ version = "3.0.0" description = "Python datetimes made easy" optional = false python-versions = ">=3.8" +groups = ["main", "dagster", "pipelines"] files = [ {file = "pendulum-3.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cf9e53ef11668e07f73190c805dbdf07a1939c3298b78d5a9203a86775d1bfd"}, {file = "pendulum-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb551b9b5e6059377889d2d878d940fd0bbb80ae4810543db18e6f77b02c5ef6"}, @@ -4234,7 +5341,35 @@ python-dateutil = ">=2.6" tzdata = ">=2020.1" [package.extras] -test = ["time-machine (>=2.6.0)"] +test = ["time-machine (>=2.6.0) ; implementation_name != \"pypy\""] + +[[package]] +name = "petl" +version = "1.7.17" +description = "A Python package for extracting, transforming and loading tables of data." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["pipelines"] +files = [ + {file = "petl-1.7.17-py3-none-any.whl", hash = "sha256:53785128bcdf46eb4472638ad572acc6d87cc83f80b567fed06ee4a947eea5d1"}, + {file = "petl-1.7.17.tar.gz", hash = "sha256:802696187c2ef35894c4acf3c0ff9fecff6035cb335944c194416b9a18e8390b"}, +] + +[package.extras] +avro = ["fastavro (>=0.24.0)"] +bcolz = ["bcolz (>=1.2.1)"] +db = ["SQLAlchemy (>=1.3.6,<2.0)"] +hdf5 = ["cython (>=0.29.13)", "numexpr (>=2.6.9)", "numpy (>=1.16.4)", "tables (>=3.5.2)"] +http = ["aiohttp (>=3.6.2)", "requests"] +interval = ["intervaltree (>=3.0.2)"] +numpy = ["numpy (>=1.16.4)"] +pandas = ["pandas (>=0.24.2)"] +remote = ["fsspec (>=0.7.4)"] +smb = ["smbprotocol (>=1.0.1)"] +whoosh = ["whoosh"] +xls = ["xlrd (>=2.0.1)", "xlwt (>=1.3.0)"] +xlsx = ["openpyxl (>=2.6.2)"] +xpath = ["lxml (>=4.4.0)"] [[package]] name = "pexpect" @@ -4242,6 +5377,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" +groups = ["dev", "notebook"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -4256,6 +5393,7 @@ version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.8" +groups = ["dev", "notebook"] files = [ {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, @@ -4271,6 +5409,7 @@ version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, @@ -4280,12 +5419,28 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pockets" +version = "0.9.1" +description = "A collection of helpful Python tools!" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86"}, + {file = "pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3"}, +] + +[package.dependencies] +six = ">=1.5.2" + [[package]] name = "portalocker" version = "2.8.2" description = "Wraps the portalocker recipe for easy usage" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines"] files = [ {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, @@ -4305,6 +5460,7 @@ version = "4.4.2" description = "A Python Progressbar library to provide visual (yet text based) progress to long running operations." optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "progressbar2-4.4.2-py3-none-any.whl", hash = "sha256:ec157391635b008b8a422326fb05c27045ffbb2dc8dab5e4d90d4d412c4ffd39"}, {file = "progressbar2-4.4.2.tar.gz", hash = "sha256:3fda2e0c60693600a6585a784c9d3bc4e1dac57e99e133f8c0f5c8cf3df374a2"}, @@ -4315,7 +5471,7 @@ python-utils = ">=3.8.1" [package.extras] docs = ["sphinx (>=1.8.5)", "sphinx-autodoc-typehints (>=1.6.0)"] -tests = ["dill (>=0.3.6)", "flake8 (>=3.7.7)", "freezegun (>=0.3.11)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "pytest-mypy", "pywin32", "sphinx (>=1.8.5)"] +tests = ["dill (>=0.3.6)", "flake8 (>=3.7.7)", "freezegun (>=0.3.11)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "pytest-mypy", "pywin32 ; sys_platform == \"win32\"", "sphinx (>=1.8.5)"] [[package]] name = "prometheus-client" @@ -4323,6 +5479,7 @@ version = "0.20.0" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, @@ -4337,6 +5494,7 @@ version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" +groups = ["dev", "notebook"] files = [ {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, @@ -4345,12 +5503,31 @@ files = [ [package.dependencies] wcwidth = "*" +[[package]] +name = "proto-plus" +version = "1.27.1" +description = "Beautiful, Pythonic protocol buffers" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc"}, + {file = "proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<7.0.0" + +[package.extras] +testing = ["google-api-core (>=1.31.5)"] + [[package]] name = "protobuf" version = "4.25.3" description = "" optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, @@ -4367,31 +5544,39 @@ files = [ [[package]] name = "psutil" -version = "5.9.8" -description = "Cross-platform lib for process and system monitoring in Python." +version = "7.2.2" +description = "Cross-platform lib for process and system monitoring." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, -] - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +python-versions = ">=3.6" +groups = ["dagster", "notebook", "pipelines"] +files = [ + {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, + {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312"}, + {file = "psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b"}, + {file = "psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf"}, + {file = "psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1"}, + {file = "psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc"}, + {file = "psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988"}, + {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, + {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, +] +markers = {dagster = "platform_system == \"Windows\""} + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "colorama ; os_name == \"nt\"", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3 ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "setuptools", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] [[package]] name = "psycopg2-binary" @@ -4399,6 +5584,7 @@ version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, @@ -4480,10 +5666,12 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" +groups = ["dev", "notebook"] files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, ] +markers = {dev = "sys_platform != \"win32\" and sys_platform != \"emscripten\"", notebook = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\""} [[package]] name = "pure-eval" @@ -4491,6 +5679,7 @@ version = "0.2.2" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" +groups = ["dev", "notebook"] files = [ {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, @@ -4505,6 +5694,7 @@ version = "0.10.9.7" description = "Enables Python programs to dynamically access arbitrary Java objects" optional = false python-versions = "*" +groups = ["dagster", "spark"] files = [ {file = "py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"}, {file = "py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb"}, @@ -4512,58 +5702,60 @@ files = [ [[package]] name = "pyarrow" -version = "11.0.0" +version = "16.1.0" description = "Python library for Apache Arrow" optional = false -python-versions = ">=3.7" -files = [ - {file = "pyarrow-11.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:40bb42afa1053c35c749befbe72f6429b7b5f45710e85059cdd534553ebcf4f2"}, - {file = "pyarrow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c28b5f248e08dea3b3e0c828b91945f431f4202f1a9fe84d1012a761324e1ba"}, - {file = "pyarrow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37bc81f6c9435da3c9c1e767324ac3064ffbe110c4e460660c43e144be4ed85"}, - {file = "pyarrow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7c53def8dbbc810282ad308cc46a523ec81e653e60a91c609c2233ae407689"}, - {file = "pyarrow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:25aa11c443b934078bfd60ed63e4e2d42461682b5ac10f67275ea21e60e6042c"}, - {file = "pyarrow-11.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:e217d001e6389b20a6759392a5ec49d670757af80101ee6b5f2c8ff0172e02ca"}, - {file = "pyarrow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad42bb24fc44c48f74f0d8c72a9af16ba9a01a2ccda5739a517aa860fa7e3d56"}, - {file = "pyarrow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d942c690ff24a08b07cb3df818f542a90e4d359381fbff71b8f2aea5bf58841"}, - {file = "pyarrow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f010ce497ca1b0f17a8243df3048055c0d18dcadbcc70895d5baf8921f753de5"}, - {file = "pyarrow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2f51dc7ca940fdf17893227edb46b6784d37522ce08d21afc56466898cb213b2"}, - {file = "pyarrow-11.0.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:1cbcfcbb0e74b4d94f0b7dde447b835a01bc1d16510edb8bb7d6224b9bf5bafc"}, - {file = "pyarrow-11.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaee8f79d2a120bf3e032d6d64ad20b3af6f56241b0ffc38d201aebfee879d00"}, - {file = "pyarrow-11.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:410624da0708c37e6a27eba321a72f29d277091c8f8d23f72c92bada4092eb5e"}, - {file = "pyarrow-11.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2d53ba72917fdb71e3584ffc23ee4fcc487218f8ff29dd6df3a34c5c48fe8c06"}, - {file = "pyarrow-11.0.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f12932e5a6feb5c58192209af1d2607d488cb1d404fbc038ac12ada60327fa34"}, - {file = "pyarrow-11.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:41a1451dd895c0b2964b83d91019e46f15b5564c7ecd5dcb812dadd3f05acc97"}, - {file = "pyarrow-11.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc2344be80e5dce4e1b80b7c650d2fc2061b9eb339045035a1baa34d5b8f1c"}, - {file = "pyarrow-11.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f40be0d7381112a398b93c45a7e69f60261e7b0269cc324e9f739ce272f4f70"}, - {file = "pyarrow-11.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:362a7c881b32dc6b0eccf83411a97acba2774c10edcec715ccaab5ebf3bb0835"}, - {file = "pyarrow-11.0.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ccbf29a0dadfcdd97632b4f7cca20a966bb552853ba254e874c66934931b9841"}, - {file = "pyarrow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e99be85973592051e46412accea31828da324531a060bd4585046a74ba45854"}, - {file = "pyarrow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69309be84dcc36422574d19c7d3a30a7ea43804f12552356d1ab2a82a713c418"}, - {file = "pyarrow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da93340fbf6f4e2a62815064383605b7ffa3e9eeb320ec839995b1660d69f89b"}, - {file = "pyarrow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:caad867121f182d0d3e1a0d36f197df604655d0b466f1bc9bafa903aa95083e4"}, - {file = "pyarrow-11.0.0.tar.gz", hash = "sha256:5461c57dbdb211a632a48facb9b39bbeb8a7905ec95d768078525283caef5f6d"}, +python-versions = ">=3.8" +groups = ["spark"] +files = [ + {file = "pyarrow-16.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9"}, + {file = "pyarrow-16.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd"}, + {file = "pyarrow-16.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b"}, + {file = "pyarrow-16.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7"}, + {file = "pyarrow-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed"}, + {file = "pyarrow-16.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3"}, + {file = "pyarrow-16.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a"}, + {file = "pyarrow-16.1.0.tar.gz", hash = "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315"}, ] [package.dependencies] numpy = ">=1.16.6" -[[package]] -name = "pyarrow-hotfix" -version = "0.5" -description = "" -optional = false -python-versions = ">=3.5" -files = [ - {file = "pyarrow_hotfix-0.5-py3-none-any.whl", hash = "sha256:7e20a1195f2e0dd7b50dffb9f90699481acfce3176bfbfb53eded04f34c4f7c6"}, - {file = "pyarrow_hotfix-0.5.tar.gz", hash = "sha256:ba697c743d435545e99bfbd89818b284e4404c19119c0ed63380a92998c4d0b1"}, -] - [[package]] name = "pyasn1" version = "0.5.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["dagster", "pipelines"] files = [ {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, @@ -4575,6 +5767,7 @@ version = "0.3.0" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["dagster", "pipelines"] files = [ {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, @@ -4583,69 +5776,211 @@ files = [ [package.dependencies] pyasn1 = ">=0.4.6,<0.6.0" +[[package]] +name = "pycountry" +version = "24.6.1" +description = "ISO country, subdivision, language, currency and script definitions and their translations" +optional = false +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f"}, + {file = "pycountry-24.6.1.tar.gz", hash = "sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221"}, +] + [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main", "notebook", "pipelines"] files = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] +markers = {pipelines = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" -version = "1.10.14" -description = "Data validation and settings management using python type hints" +version = "2.12.5" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["dagster", "pipelines"] +files = [ + {file = "pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d"}, + {file = "pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} +pydantic-core = "2.41.5" +typing-extensions = ">=4.14.1" +typing-inspection = ">=0.4.2" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["dagster", "pipelines"] +files = [ + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51"}, + {file = "pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e"}, +] + +[package.dependencies] +typing-extensions = ">=4.14.1" + +[[package]] +name = "pydantic-settings" +version = "2.13.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] files = [ - {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, - {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, - {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, - {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, - {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, - {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, - {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, - {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, - {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, - {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, -] - -[package.dependencies] -email-validator = {version = ">=1.0.3", optional = true, markers = "extra == \"email\""} -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] + {file = "pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237"}, + {file = "pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" +typing-inspection = ">=0.4.0" + +[package.extras] +aws-secrets-manager = ["boto3 (>=1.35.0)", "boto3-stubs[secretsmanager]"] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] +gcp-secret-manager = ["google-cloud-secret-manager (>=2.23.1)"] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] [[package]] name = "pygments" @@ -4653,13 +5988,14 @@ version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "dev", "notebook", "pipelines"] files = [ {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] -plugins = ["importlib-metadata"] +plugins = ["importlib-metadata ; python_version < \"3.8\""] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -4668,6 +6004,7 @@ version = "2.8.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.7" +groups = ["main", "pipelines"] files = [ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, @@ -4688,6 +6025,7 @@ version = "3.1.0" description = "python code static checker" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, @@ -4697,8 +6035,8 @@ files = [ astroid = ">=3.1.0,<=3.2.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" @@ -4709,12 +6047,107 @@ tomlkit = ">=0.10.1" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] +[[package]] +name = "pyogrio" +version = "0.12.1" +description = "Vectorized spatial vector file format I/O using GDAL/OGR" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "pyogrio-0.12.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c4735235ca0d8dcdb4ecd69bd73e66762d161bce913b10d4458a18137cc7062"}, + {file = "pyogrio-0.12.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:3249d06c2520857b622f3ff0f1b7b4849291ee1fb72f21587825f5fd0f24b787"}, + {file = "pyogrio-0.12.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f4011b63f9d6c278ee6605971ffabe30b0e8f5992ec2c6df8c70ecfa68a5d02b"}, + {file = "pyogrio-0.12.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:940857c45051e1e19608ebfe8338bcdf7dd005389057431a3c7b5bff5beb0a5f"}, + {file = "pyogrio-0.12.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0fd86bcd69126739325a543a489f312b5fd86db092d2dead682772ae4ee434f3"}, + {file = "pyogrio-0.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:dcf9cca273ead32beba7c002dd3db8a304105f52dd66200d48fa1ef30d0676af"}, + {file = "pyogrio-0.12.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:01b322dac2a258d24b024d1028dcaa03c9bb6d9c3988b86d298a64873d10dc65"}, + {file = "pyogrio-0.12.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:e10087abcbd6b7e8212560a7002984e5078ac7b3a969ddc2c9929044dbb0d403"}, + {file = "pyogrio-0.12.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f6c621972b09fd81a32317e742c69ff4a7763a803da211361a78317f9577765"}, + {file = "pyogrio-0.12.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c38253427b688464caad5316d4ebcec116b5e13f1f02cc4e3588502f136ca1b4"}, + {file = "pyogrio-0.12.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:5f47787251de7ce13cc06038da93a1214dc283cbccf816be6e03c080358226c8"}, + {file = "pyogrio-0.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:c1d756cf2da4cdf5609779f260d1e1e89be023184225855d6f3dcd33bbe17cb0"}, + {file = "pyogrio-0.12.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:7a0d5ca39184030aec4cde30f4258f75b227a854530d2659babc8189d76e657d"}, + {file = "pyogrio-0.12.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:feaff42bbe8087ca0b30e33b09d1ce049ca55fe83ad83db1139ef37d1d04f30c"}, + {file = "pyogrio-0.12.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:81096a5139532de5a8003ef02b41d5d2444cb382a9aecd1165b447eb549180d3"}, + {file = "pyogrio-0.12.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:41b78863f782f7a113ed0d36a5dc74d59735bd3a82af53510899bb02a18b06bb"}, + {file = "pyogrio-0.12.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:8b65be8c4258b27cc8f919b21929cecdadda4c353e3637fa30850339ef4d15c5"}, + {file = "pyogrio-0.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:1291b866c2c81d991bda15021b08b3621709b40ee3a85689229929e9465788bf"}, + {file = "pyogrio-0.12.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:ec0e47a5a704e575092b2fd5c83fa0472a1d421e590f94093eb837bb0a11125d"}, + {file = "pyogrio-0.12.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:b4c888fc08f388be4dd99dfca5e84a5cdc5994deeec0230cc45144d3460e2b21"}, + {file = "pyogrio-0.12.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:73a88436f9962750d782853727897ac2722cac5900d920e39fab3e56d7a6a7f1"}, + {file = "pyogrio-0.12.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:b5d248a0d59fe9bbf9a35690b70004c67830ee0ebe7d4f7bb8ffd8659f684b3a"}, + {file = "pyogrio-0.12.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0622bc1a186421547660271083079b38d42e6f868802936d8538c0b379f1ab6b"}, + {file = "pyogrio-0.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:207bd60c7ffbcea84584596e3637653aa7095e9ee20fa408f90c7f9460392613"}, + {file = "pyogrio-0.12.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:1511b39a283fa27cda906cd187a791578942a87a40b6a06697d9b43bb8ac80b0"}, + {file = "pyogrio-0.12.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:e486cd6aa9ea8a15394a5f84e019d61ec18f257eeeb642348bd68c3d1e57280b"}, + {file = "pyogrio-0.12.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3f1a19f63bfd1d3042e45f37ad1d6598123a5a604b6c4ba3f38b419273486cd"}, + {file = "pyogrio-0.12.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:f3dcc59b3316b8a0f59346bcc638a4d69997864a4d21da839192f50c4c92369a"}, + {file = "pyogrio-0.12.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:a0643e041dee3e8e038fce69f52a915ecb486e6d7b674c0f9919f3c9e9629689"}, + {file = "pyogrio-0.12.1-cp313-cp313t-win_amd64.whl", hash = "sha256:5881017f29e110d3613819667657844d8e961b747f2d35cf92f273c27af6d068"}, + {file = "pyogrio-0.12.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:5a1b0453d1c9e7b03715dd57296c8f3790acb8b50d7e3b5844b3074a18f50709"}, + {file = "pyogrio-0.12.1-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e7ee560422239dd09ca7f8284cc8483a8919c30d25f3049bb0249bff4c38dec4"}, + {file = "pyogrio-0.12.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:648c6f7f5f214d30e6cf493b4af1d59782907ac068af9119ca35f18153d6865a"}, + {file = "pyogrio-0.12.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:58042584f3fd4cabb0f55d26c1405053f656be8a5c266c38140316a1e981aca0"}, + {file = "pyogrio-0.12.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:b438e38e4ccbaedaa5cb5824ff5de5539315d9b2fde6547c1e816576924ee8ca"}, + {file = "pyogrio-0.12.1-cp314-cp314-win_amd64.whl", hash = "sha256:f1d8d8a2fea3781dc2a05982c050259261ebc0f6c5e03732d6d79d582adf9363"}, + {file = "pyogrio-0.12.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9fe7286946f35a73e6370dc5855bc7a5e8e7babf9e4a8bad7a3279a1d94c7ea9"}, + {file = "pyogrio-0.12.1-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:2c50345b382f1be801d654ec22c70ee974d6057d4ba7afe984b55f2192bc94ee"}, + {file = "pyogrio-0.12.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0db95765ac0ca935c7fe579e29451294e3ab19c317b0c59c31fbe92a69155e0"}, + {file = "pyogrio-0.12.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:fc882779075982b93064b3bf3d8642514a6df00d9dd752493b104817072cfb01"}, + {file = "pyogrio-0.12.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:806f620e0c54b54dbdd65e9b6368d24f344cda84c9343364b40a57eb3e1c4dca"}, + {file = "pyogrio-0.12.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5399f66730978d8852ef5f44dbafa0f738e7f28f4f784349f36830b69a9d2134"}, + {file = "pyogrio-0.12.1.tar.gz", hash = "sha256:e548ab705bb3e5383693717de1e6c76da97f3762ab92522cb310f93128a75ff1"}, +] + +[package.dependencies] +certifi = "*" +numpy = "*" +packaging = "*" + +[package.extras] +benchmark = ["pytest-benchmark"] +dev = ["cython (>=3.1)"] +geopandas = ["geopandas"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "pyparsing" +version = "3.3.2" +description = "pyparsing - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyphonetics" +version = "0.5.3" +description = "A Python 3 phonetics library." +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1"}, + {file = "pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4"}, +] + +[package.dependencies] +unidecode = ">=1,<2" + [[package]] name = "pyproj" version = "3.6.1" description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" optional = false python-versions = ">=3.9" +groups = ["pipelines"] files = [ {file = "pyproj-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab7aa4d9ff3c3acf60d4b285ccec134167a948df02347585fdd934ebad8811b4"}, {file = "pyproj-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc0472302919e59114aa140fd7213c2370d848a7249d09704f10f5b062031fe"}, @@ -4754,6 +6187,8 @@ version = "3.4.1" description = "A python implementation of GNU readline." optional = false python-versions = "*" +groups = ["dagster", "pipelines"] +markers = "sys_platform == \"win32\"" files = [ {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, @@ -4765,6 +6200,7 @@ version = "3.5.0" description = "Apache Spark Python API" optional = false python-versions = ">=3.8" +groups = ["dagster", "spark"] files = [ {file = "pyspark-3.5.0.tar.gz", hash = "sha256:d41a9b76bd2aca370a6100d075c029e22ba44c5940927877e9435a3a9c566558"}, ] @@ -4785,6 +6221,7 @@ version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, @@ -4805,6 +6242,7 @@ version = "4.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.6" +groups = ["pipelines"] files = [ {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, @@ -4823,6 +6261,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -4837,6 +6276,7 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -4851,17 +6291,37 @@ version = "2.0.7" description = "A python library adding a json log formatter" optional = false python-versions = ">=3.6" +groups = ["notebook", "pipelines"] files = [ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + [[package]] name = "python-utils" version = "3.8.2" description = "Python Utils is a module with some convenient utilities not included with the standard Python install" optional = false python-versions = ">3.8.0" +groups = ["pipelines"] files = [ {file = "python-utils-3.8.2.tar.gz", hash = "sha256:c5d161e4ca58ce3f8c540f035e018850b261a41e7cb98f6ccf8e1deb7174a1f1"}, {file = "python_utils-3.8.2-py2.py3-none-any.whl", hash = "sha256:ad0ccdbd6f856d015cace07f74828b9840b5c4072d9e868a7f6a14fd195555a8"}, @@ -4881,6 +6341,7 @@ version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main", "dagster", "pipelines"] files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, @@ -4892,6 +6353,7 @@ version = "306" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, @@ -4908,6 +6370,7 @@ files = [ {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] +markers = {main = "platform_system == \"Windows\"", dagster = "sys_platform == \"win32\" or platform_system == \"Windows\"", notebook = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", pipelines = "sys_platform == \"win32\" or platform_system == \"Windows\""} [[package]] name = "pywinpty" @@ -4915,6 +6378,8 @@ version = "2.0.13" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" +groups = ["notebook"] +markers = "os_name == \"nt\"" files = [ {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, @@ -4930,6 +6395,7 @@ version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" +groups = ["dagster", "notebook", "pipelines"] files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, @@ -4990,6 +6456,7 @@ version = "25.1.2" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" +groups = ["notebook"] files = [ {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, @@ -5095,6 +6562,7 @@ version = "5.5.1" description = "Jupyter Qt console" optional = false python-versions = ">= 3.8" +groups = ["notebook"] files = [ {file = "qtconsole-5.5.1-py3-none-any.whl", hash = "sha256:8c75fa3e9b4ed884880ff7cea90a1b67451219279ec33deaee1d59e3df1a5d2b"}, {file = "qtconsole-5.5.1.tar.gz", hash = "sha256:a0e806c6951db9490628e4df80caec9669b65149c7ba40f9bf033c025a5b56bc"}, @@ -5120,6 +6588,7 @@ version = "2.4.1" description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, @@ -5137,6 +6606,7 @@ version = "3.7.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.8" +groups = ["pipelines"] files = [ {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:860f438238f1807532aa5c5c25e74c284232ccc115fe84697b78e25d48f364f7"}, {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bb9285abeb0477cdb2f8ea0cf7fd4b5f72ed5a9a7d3f0c0bb4a5239db2fc1ed"}, @@ -5233,12 +6703,74 @@ files = [ [package.extras] full = ["numpy"] +[[package]] +name = "rasterio" +version = "1.3.10" +description = "Fast and direct raster I/O for use with Numpy and SciPy" +optional = false +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "rasterio-1.3.10-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:2ef27c3eff6f44f8b5d5de228003367c1843593edf648d85c0dc1319c00dc57d"}, + {file = "rasterio-1.3.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c711b497e9ef0c4f5e1c01e34ba910708e066e1c4a69c25df18d1bcc04481287"}, + {file = "rasterio-1.3.10-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d1ac85857144cb8075e332e9d908b65426d30ddc1f59f7a04bcf6ed6fd3c0d47"}, + {file = "rasterio-1.3.10-cp310-cp310-win_amd64.whl", hash = "sha256:ef8a496740df1e68f7a3d3449aa3be9c3210c22f4bb78a4a9e1c290183abd9b1"}, + {file = "rasterio-1.3.10-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:97d867cada29f16cb83f1743217f775f8b982676fcdda77671d25abb26698159"}, + {file = "rasterio-1.3.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:505b3e659eb3b137192c25233bf7954bc4997b1a474bae9e129fbd5ac2619404"}, + {file = "rasterio-1.3.10-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:30f27e309a14a70c821d10a0ea18b110968dc2e2186b06a900aebd92094f4e00"}, + {file = "rasterio-1.3.10-cp311-cp311-win_amd64.whl", hash = "sha256:cbb2eea127328302f9e3158a000363a7d9eea22537378dee4f824a7fa2d78c05"}, + {file = "rasterio-1.3.10-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:3a9c4fb63e050e11bcd23e53f084ca186b445f976df1f70e7abd851c4072837f"}, + {file = "rasterio-1.3.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c7ddca79444fd3b933f4cd1a1773e9f7839d0ce5d76e600bdf92ee9a79b95f8"}, + {file = "rasterio-1.3.10-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:f9cd757e11cfb07ef39b1cc79a32497bf22aff7fec41fe330b868cb3043b4db5"}, + {file = "rasterio-1.3.10-cp312-cp312-win_amd64.whl", hash = "sha256:7e653968f64840654d277e0f86f8666ed8f3030ba36fa865f420f9bc38d619ee"}, + {file = "rasterio-1.3.10-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7a22c0e0cf07dbed6576faf9a49bc4afa1afedd5a14441b64a3d3dd6d10dc274"}, + {file = "rasterio-1.3.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d29d30c2271fa265913bd3db93fa213d3a0894362ec704e7273cf30443098a90"}, + {file = "rasterio-1.3.10-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:287e8d0d0472c778aa0b6392e9c00894a80f2bace28fa6eddb76c0a895097947"}, + {file = "rasterio-1.3.10-cp38-cp38-win_amd64.whl", hash = "sha256:a420e5f25108b1c92c5d071cfd6518b3766f20a6eddb1b322d06c3d46a89fab6"}, + {file = "rasterio-1.3.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:73ea4d0e584f696ef115601bbb97ba8d2b68a67c2bb3b40999414d31b6c7cf89"}, + {file = "rasterio-1.3.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6eece6420d7d6ef9b9830633b8fcd15e86b8702cb13419abe251c16ca502cf3"}, + {file = "rasterio-1.3.10-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:0bbd62b45a35cab53cb7fe72419e823e47ab31ee2d055af8e21dc7f37fe5ed6c"}, + {file = "rasterio-1.3.10-cp39-cp39-win_amd64.whl", hash = "sha256:450f2bd45335308829da90566fbcbdb8e8aa0251a9d1f6ebb60667855dfb7554"}, + {file = "rasterio-1.3.10.tar.gz", hash = "sha256:ce182c735b4f9e8735d90600607ecab15ef895eb8aa660bf665751529477e326"}, +] + +[package.dependencies] +affine = "*" +attrs = "*" +certifi = "*" +click = ">=4.0" +click-plugins = "*" +cligj = ">=0.5" +numpy = "*" +setuptools = "*" +snuggs = ">=1.4.1" + +[package.extras] +all = ["boto3 (>=1.2.4)", "ghp-import", "hypothesis", "ipython (>=2.0)", "matplotlib", "numpydoc", "packaging", "pytest (>=2.8.2)", "pytest-cov (>=2.2.0)", "shapely ; python_version < \"3.12\"", "sphinx", "sphinx-rtd-theme"] +docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"] +ipython = ["ipython (>=2.0)"] +plot = ["matplotlib"] +s3 = ["boto3 (>=1.2.4)"] +test = ["boto3 (>=1.2.4)", "hypothesis", "packaging", "pytest (>=2.8.2)", "pytest-cov (>=2.2.0)", "shapely ; python_version < \"3.12\""] + +[[package]] +name = "ratelimit" +version = "2.2.1" +description = "API rate limit decorator" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42"}, +] + [[package]] name = "referencing" version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" +groups = ["notebook", "pipelines"] files = [ {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, @@ -5254,6 +6786,7 @@ version = "2023.12.25" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.7" +groups = ["dagster"] files = [ {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, @@ -5352,24 +6885,25 @@ files = [ [[package]] name = "requests" -version = "2.32.2" +version = "2.33.1" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ - {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, - {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, + {file = "requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a"}, + {file = "requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517"}, ] [package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +certifi = ">=2023.5.7" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" +urllib3 = ">=1.26,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] [[package]] name = "requests-file" @@ -5377,6 +6911,7 @@ version = "2.0.0" description = "File transport adapter for Requests" optional = false python-versions = "*" +groups = ["pipelines"] files = [ {file = "requests-file-2.0.0.tar.gz", hash = "sha256:20c5931629c558fda566cacc10cfe2cd502433e628f568c34c80d96a0cc95972"}, {file = "requests_file-2.0.0-py2.py3-none-any.whl", hash = "sha256:3e493d390adb44aa102ebea827a48717336d5268968c370eaf19abaf5cae13bf"}, @@ -5391,6 +6926,7 @@ version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false python-versions = ">=3.4" +groups = ["dagster"] files = [ {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, @@ -5409,6 +6945,7 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dagster"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -5423,6 +6960,7 @@ version = "0.1.4" description = "A pure python RFC3339 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["notebook"] files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, @@ -5431,12 +6969,28 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "rfc3986" +version = "2.0.0" +description = "Validating URI References per RFC 3986" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] + +[package.extras] +idna2008 = ["idna"] + [[package]] name = "rfc3986-validator" version = "0.1.1" description = "Pure python rfc3986 validator" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["notebook"] files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -5448,6 +7002,7 @@ version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" +groups = ["dagster", "pipelines"] files = [ {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, @@ -5466,6 +7021,7 @@ version = "0.9.0" description = "" optional = false python-versions = "*" +groups = ["spark"] files = [ {file = "roapi-0.9.0-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:6fd9e7e572eb6eca7d0e1b70f9376d960cb6f59689df67c6715ab6899ff8d6c9"}, {file = "roapi-0.9.0-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:defec650f02aacb899b52eaa0349d07b437ab9db32f68e8ab043f252160c35c2"}, @@ -5481,6 +7037,7 @@ version = "0.18.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" +groups = ["notebook", "pipelines"] files = [ {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, @@ -5589,6 +7146,7 @@ version = "4.9" description = "Pure-Python RSA implementation" optional = false python-versions = ">=3.6,<4" +groups = ["dagster", "pipelines"] files = [ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, @@ -5603,6 +7161,7 @@ version = "0.18.6" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, @@ -5621,6 +7180,8 @@ version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false python-versions = ">=3.6" +groups = ["pipelines"] +markers = "platform_python_implementation == \"CPython\"" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, @@ -5680,6 +7241,7 @@ version = "0.3.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"}, {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"}, @@ -5700,47 +7262,120 @@ files = [ {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"}, ] +[[package]] +name = "s2sphere" +version = "0.2.5" +description = "Python implementation of the S2 Geometry Library" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "s2sphere-0.2.5-py2.py3-none-any.whl", hash = "sha256:d2340c9cf458ddc9a89afd1d8048a4195ce6fa6b0095ab900d4be5271e537401"}, + {file = "s2sphere-0.2.5.tar.gz", hash = "sha256:c2478c1ff7c601a59a7151a57b605435897514578fa6bdb8730721c182adbbaf"}, +] + +[package.dependencies] +future = ">=0.15" + +[package.extras] +docs = ["Sphinx (>=1.6.5)", "sphinx-rtd-theme (>=0.1.9)"] +tests = ["flake8 (>=2.5.4)", "hacking (>=0.11.0)", "nose (>=1.3.4)", "numpy (>=1.11.0)"] + +[[package]] +name = "s3fs" +version = "2026.3.0" +description = "Convenient Filesystem interface over S3" +optional = false +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "s3fs-2026.3.0-py3-none-any.whl", hash = "sha256:2fa40a64c03003cfa5ae0e352788d97aa78ae8f9e25ea98b28ce9d21ba10c1b8"}, + {file = "s3fs-2026.3.0.tar.gz", hash = "sha256:ce8b30a9dc5e01c5127c96cb7377290243a689a251ef9257336ac29d72d7b0d8"}, +] + +[package.dependencies] +aiobotocore = ">=2.19.0,<4.0.0" +aiohttp = ">=3.9.0,<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1" +fsspec = "2026.3.0" + [[package]] name = "scipy" -version = "1.12.0" +version = "1.17.1" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.9" -files = [ - {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, - {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, - {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, - {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, - {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, - {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, - {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, - {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, - {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, - {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, - {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, -] - -[package.dependencies] -numpy = ">=1.22.4,<1.29.0" - -[package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +python-versions = ">=3.11" +groups = ["main", "pipelines"] +files = [ + {file = "scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd"}, + {file = "scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c"}, + {file = "scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4"}, + {file = "scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444"}, + {file = "scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082"}, + {file = "scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff"}, + {file = "scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b"}, + {file = "scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21"}, + {file = "scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458"}, + {file = "scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb"}, + {file = "scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea"}, + {file = "scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87"}, + {file = "scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b"}, + {file = "scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6"}, + {file = "scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464"}, + {file = "scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950"}, + {file = "scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369"}, + {file = "scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448"}, + {file = "scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6"}, + {file = "scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e"}, + {file = "scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475"}, + {file = "scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50"}, + {file = "scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca"}, + {file = "scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c"}, + {file = "scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866"}, + {file = "scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350"}, + {file = "scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118"}, + {file = "scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068"}, + {file = "scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118"}, + {file = "scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19"}, + {file = "scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca"}, + {file = "scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad"}, + {file = "scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a"}, + {file = "scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4"}, + {file = "scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2"}, + {file = "scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484"}, + {file = "scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21"}, + {file = "scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0"}, +] + +[package.dependencies] +numpy = ">=1.26.4,<2.7" + +[package.extras] +dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "send2trash" @@ -5748,35 +7383,79 @@ version = "1.8.2" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +groups = ["notebook"] files = [ {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, ] [package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] +nativelib = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\"", "pywin32 ; sys_platform == \"win32\""] +objc = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\""] +win32 = ["pywin32 ; sys_platform == \"win32\""] [[package]] name = "sentry-sdk" -version = "0.10.2" -description = "Python client for Sentry (https://getsentry.com)" +version = "2.56.0" +description = "Python client for Sentry (https://sentry.io)" optional = false -python-versions = "*" +python-versions = ">=3.6" +groups = ["main", "pipelines"] files = [ - {file = "sentry-sdk-0.10.2.tar.gz", hash = "sha256:d491aa6399eaa3eded433972751a9770180730fd8b4c225b0b7f49c4fa2af70b"}, - {file = "sentry_sdk-0.10.2-py2.py3-none-any.whl", hash = "sha256:d68003cdffbbfcadaa2c445b72e1050b0a44406f94199866f192986c016b23f5"}, + {file = "sentry_sdk-2.56.0-py2.py3-none-any.whl", hash = "sha256:5afafb744ceb91d22f4cc650c6bd048ac6af5f7412dcc6c59305a2e36f4dbc02"}, + {file = "sentry_sdk-2.56.0.tar.gz", hash = "sha256:fdab72030b69625665b2eeb9738bdde748ad254e8073085a0ce95382678e8168"}, ] [package.dependencies] certifi = "*" -urllib3 = "*" +urllib3 = ">=1.26.11" [package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] -flask = ["blinker (>=1.1)", "flask (>=0.8)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +google-genai = ["google-genai (>=1.29.0)"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +http2 = ["httpcore[http2] (==1.*)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface_hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +langgraph = ["langgraph (>=0.6.6)"] +launchdarkly = ["launchdarkly-server-sdk (>=9.8.0)"] +litellm = ["litellm (>=1.77.5)"] +litestar = ["litestar (>=2.0.0)"] +loguru = ["loguru (>=0.5)"] +mcp = ["mcp (>=1.15.0)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +openfeature = ["openfeature-sdk (>=0.7.1)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro"] +opentelemetry-otlp = ["opentelemetry-distro[otlp] (>=0.35b0)"] +pure-eval = ["asttokens", "executing", "pure_eval"] +pydantic-ai = ["pydantic-ai (>=1.0.0)"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +statsig = ["statsig (>=0.55.3)"] +tornado = ["tornado (>=6)"] +unleash = ["UnleashClient (>=6.0.1)"] [[package]] name = "setuptools" @@ -5784,6 +7463,7 @@ version = "69.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" +groups = ["dagster", "notebook", "pipelines"] files = [ {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, @@ -5791,65 +7471,226 @@ files = [ [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov ; platform_python_implementation != \"PyPy\"", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shapely" -version = "2.0.3" +version = "2.1.2" description = "Manipulation and analysis of geometric objects" optional = false -python-versions = ">=3.7" -files = [ - {file = "shapely-2.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:af7e9abe180b189431b0f490638281b43b84a33a960620e6b2e8d3e3458b61a1"}, - {file = "shapely-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98040462b36ced9671e266b95c326b97f41290d9d17504a1ee4dc313a7667b9c"}, - {file = "shapely-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71eb736ef2843f23473c6e37f6180f90f0a35d740ab284321548edf4e55d9a52"}, - {file = "shapely-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:881eb9dbbb4a6419667e91fcb20313bfc1e67f53dbb392c6840ff04793571ed1"}, - {file = "shapely-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f10d2ccf0554fc0e39fad5886c839e47e207f99fdf09547bc687a2330efda35b"}, - {file = "shapely-2.0.3-cp310-cp310-win32.whl", hash = "sha256:6dfdc077a6fcaf74d3eab23a1ace5abc50c8bce56ac7747d25eab582c5a2990e"}, - {file = "shapely-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:64c5013dacd2d81b3bb12672098a0b2795c1bf8190cfc2980e380f5ef9d9e4d9"}, - {file = "shapely-2.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:56cee3e4e8159d6f2ce32e421445b8e23154fd02a0ac271d6a6c0b266a8e3cce"}, - {file = "shapely-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619232c8276fded09527d2a9fd91a7885ff95c0ff9ecd5e3cb1e34fbb676e2ae"}, - {file = "shapely-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2a7d256db6f5b4b407dc0c98dd1b2fcf1c9c5814af9416e5498d0a2e4307a4b"}, - {file = "shapely-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45f0c8cd4583647db3216d965d49363e6548c300c23fd7e57ce17a03f824034"}, - {file = "shapely-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13cb37d3826972a82748a450328fe02a931dcaed10e69a4d83cc20ba021bc85f"}, - {file = "shapely-2.0.3-cp311-cp311-win32.whl", hash = "sha256:9302d7011e3e376d25acd30d2d9e70d315d93f03cc748784af19b00988fc30b1"}, - {file = "shapely-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6b464f2666b13902835f201f50e835f2f153f37741db88f68c7f3b932d3505fa"}, - {file = "shapely-2.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e86e7cb8e331a4850e0c2a8b2d66dc08d7a7b301b8d1d34a13060e3a5b4b3b55"}, - {file = "shapely-2.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c91981c99ade980fc49e41a544629751a0ccd769f39794ae913e53b07b2f78b9"}, - {file = "shapely-2.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd45d456983dc60a42c4db437496d3f08a4201fbf662b69779f535eb969660af"}, - {file = "shapely-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:882fb1ffc7577e88c1194f4f1757e277dc484ba096a3b94844319873d14b0f2d"}, - {file = "shapely-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9f2d93bff2ea52fa93245798cddb479766a18510ea9b93a4fb9755c79474889"}, - {file = "shapely-2.0.3-cp312-cp312-win32.whl", hash = "sha256:99abad1fd1303b35d991703432c9481e3242b7b3a393c186cfb02373bf604004"}, - {file = "shapely-2.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:6f555fe3304a1f40398977789bc4fe3c28a11173196df9ece1e15c5bc75a48db"}, - {file = "shapely-2.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983cc418c1fa160b7d797cfef0e0c9f8c6d5871e83eae2c5793fce6a837fad9"}, - {file = "shapely-2.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18bddb8c327f392189a8d5d6b9a858945722d0bb95ccbd6a077b8e8fc4c7890d"}, - {file = "shapely-2.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:442f4dcf1eb58c5a4e3428d88e988ae153f97ab69a9f24e07bf4af8038536325"}, - {file = "shapely-2.0.3-cp37-cp37m-win32.whl", hash = "sha256:31a40b6e3ab00a4fd3a1d44efb2482278642572b8e0451abdc8e0634b787173e"}, - {file = "shapely-2.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:59b16976c2473fec85ce65cc9239bef97d4205ab3acead4e6cdcc72aee535679"}, - {file = "shapely-2.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:705efbce1950a31a55b1daa9c6ae1c34f1296de71ca8427974ec2f27d57554e3"}, - {file = "shapely-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:601c5c0058a6192df704cb889439f64994708563f57f99574798721e9777a44b"}, - {file = "shapely-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f24ecbb90a45c962b3b60d8d9a387272ed50dc010bfe605f1d16dfc94772d8a1"}, - {file = "shapely-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c2a2989222c6062f7a0656e16276c01bb308bc7e5d999e54bf4e294ce62e76"}, - {file = "shapely-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42bceb9bceb3710a774ce04908fda0f28b291323da2688f928b3f213373b5aee"}, - {file = "shapely-2.0.3-cp38-cp38-win32.whl", hash = "sha256:54d925c9a311e4d109ec25f6a54a8bd92cc03481a34ae1a6a92c1fe6729b7e01"}, - {file = "shapely-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:300d203b480a4589adefff4c4af0b13919cd6d760ba3cbb1e56275210f96f654"}, - {file = "shapely-2.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:083d026e97b6c1f4a9bd2a9171c7692461092ed5375218170d91705550eecfd5"}, - {file = "shapely-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:27b6e1910094d93e9627f2664121e0e35613262fc037051680a08270f6058daf"}, - {file = "shapely-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71b2de56a9e8c0e5920ae5ddb23b923490557ac50cb0b7fa752761bf4851acde"}, - {file = "shapely-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d279e56bbb68d218d63f3efc80c819cedcceef0e64efbf058a1df89dc57201b"}, - {file = "shapely-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88566d01a30f0453f7d038db46bc83ce125e38e47c5f6bfd4c9c287010e9bf74"}, - {file = "shapely-2.0.3-cp39-cp39-win32.whl", hash = "sha256:58afbba12c42c6ed44c4270bc0e22f3dadff5656d711b0ad335c315e02d04707"}, - {file = "shapely-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:5026b30433a70911979d390009261b8c4021ff87c7c3cbd825e62bb2ffa181bc"}, - {file = "shapely-2.0.3.tar.gz", hash = "sha256:4d65d0aa7910af71efa72fd6447e02a8e5dd44da81a983de9d736d6e6ccbe674"}, -] - -[package.dependencies] -numpy = ">=1.14,<2" +python-versions = ">=3.10" +groups = ["pipelines"] +files = [ + {file = "shapely-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7ae48c236c0324b4e139bea88a306a04ca630f49be66741b340729d380d8f52f"}, + {file = "shapely-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eba6710407f1daa8e7602c347dfc94adc02205ec27ed956346190d66579eb9ea"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef4a456cc8b7b3d50ccec29642aa4aeda959e9da2fe9540a92754770d5f0cf1f"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e38a190442aacc67ff9f75ce60aec04893041f16f97d242209106d502486a142"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:40d784101f5d06a1fd30b55fc11ea58a61be23f930d934d86f19a180909908a4"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f6f6cd5819c50d9bcf921882784586aab34a4bd53e7553e175dece6db513a6f0"}, + {file = "shapely-2.1.2-cp310-cp310-win32.whl", hash = "sha256:fe9627c39c59e553c90f5bc3128252cb85dc3b3be8189710666d2f8bc3a5503e"}, + {file = "shapely-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:1d0bfb4b8f661b3b4ec3565fa36c340bfb1cda82087199711f86a88647d26b2f"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91121757b0a36c9aac3427a651a7e6567110a4a67c97edf04f8d55d4765f6618"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a9c722ba774cf50b5d4541242b4cce05aafd44a015290c82ba8a16931ff63d"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cc4f7397459b12c0b196c9efe1f9d7e92463cbba142632b4cc6d8bbbbd3e2b09"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:136ab87b17e733e22f0961504d05e77e7be8c9b5a8184f685b4a91a84efe3c26"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:16c5d0fc45d3aa0a69074979f4f1928ca2734fb2e0dde8af9611e134e46774e7"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ddc759f72b5b2b0f54a7e7cde44acef680a55019eb52ac63a7af2cf17cb9cd2"}, + {file = "shapely-2.1.2-cp311-cp311-win32.whl", hash = "sha256:2fa78b49485391224755a856ed3b3bd91c8455f6121fee0db0e71cefb07d0ef6"}, + {file = "shapely-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:c64d5c97b2f47e3cd9b712eaced3b061f2b71234b3fc263e0fcf7d889c6559dc"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d"}, + {file = "shapely-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454"}, + {file = "shapely-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd"}, + {file = "shapely-2.1.2-cp313-cp313-win32.whl", hash = "sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350"}, + {file = "shapely-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99"}, + {file = "shapely-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf"}, + {file = "shapely-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9a522f460d28e2bf4e12396240a5fc1518788b2fcd73535166d748399ef0c223"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ff629e00818033b8d71139565527ced7d776c269a49bd78c9df84e8f852190c"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f67b34271dedc3c653eba4e3d7111aa421d5be9b4c4c7d38d30907f796cb30df"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21952dc00df38a2c28375659b07a3979d22641aeb104751e769c3ee825aadecf"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1f2f33f486777456586948e333a56ae21f35ae273be99255a191f5c1fa302eb4"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cf831a13e0d5a7eb519e96f58ec26e049b1fad411fc6fc23b162a7ce04d9cffc"}, + {file = "shapely-2.1.2-cp314-cp314-win32.whl", hash = "sha256:61edcd8d0d17dd99075d320a1dd39c0cb9616f7572f10ef91b4b5b00c4aeb566"}, + {file = "shapely-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:a444e7afccdb0999e203b976adb37ea633725333e5b119ad40b1ca291ecf311c"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5ebe3f84c6112ad3d4632b1fd2290665aa75d4cef5f6c5d77c4c95b324527c6a"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5860eb9f00a1d49ebb14e881f5caf6c2cf472c7fd38bd7f253bbd34f934eb076"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b705c99c76695702656327b819c9660768ec33f5ce01fa32b2af62b56ba400a1"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a1fd0ea855b2cf7c9cddaf25543e914dd75af9de08785f20ca3085f2c9ca60b0"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:df90e2db118c3671a0754f38e36802db75fe0920d211a27481daf50a711fdf26"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:361b6d45030b4ac64ddd0a26046906c8202eb60d0f9f53085f5179f1d23021a0"}, + {file = "shapely-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:b54df60f1fbdecc8ebc2c5b11870461a6417b3d617f555e5033f1505d36e5735"}, + {file = "shapely-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9"}, + {file = "shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9"}, +] + +[package.dependencies] +numpy = ">=1.21" [package.extras] docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] -test = ["pytest", "pytest-cov"] +test = ["pytest", "pytest-cov", "scipy-doctest"] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +groups = ["pipelines"] +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "simpleeval" +version = "1.0.7" +description = "A simple, safe single expression evaluator library." +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "simpleeval-1.0.7-py3-none-any.whl", hash = "sha256:97ac271bfd8f2af9e7b9a36ceea67617f26fa873f9d5ae1922f64d4c1442534b"}, + {file = "simpleeval-1.0.7.tar.gz", hash = "sha256:1e10e5f9fec597814444e20c0892ed15162fa214c8a88f434b5b077cf2fef85b"}, +] + +[[package]] +name = "simplejson" +version = "3.20.2" +description = "Simple, fast, extensible JSON encoder/decoder for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.5" +groups = ["pipelines"] +files = [ + {file = "simplejson-3.20.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:11847093fd36e3f5a4f595ff0506286c54885f8ad2d921dfb64a85bce67f72c4"}, + {file = "simplejson-3.20.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d291911d23b1ab8eb3241204dd54e3ec60ddcd74dfcb576939d3df327205865"}, + {file = "simplejson-3.20.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:da6d16d7108d366bbbf1c1f3274662294859c03266e80dd899fc432598115ea4"}, + {file = "simplejson-3.20.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9ddf9a07694c5bbb4856271cbc4247cc6cf48f224a7d128a280482a2f78bae3d"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:3a0d2337e490e6ab42d65a082e69473717f5cc75c3c3fb530504d3681c4cb40c"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8ba88696351ed26a8648f8378a1431223f02438f8036f006d23b4f5b572778fa"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:00bcd408a4430af99d1f8b2b103bb2f5133bb688596a511fcfa7db865fbb845e"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4fc62feb76f590ccaff6f903f52a01c58ba6423171aa117b96508afda9c210f0"}, + {file = "simplejson-3.20.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6d7286dc11af60a2f76eafb0c2acde2d997e87890e37e24590bb513bec9f1bc5"}, + {file = "simplejson-3.20.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c01379b4861c3b0aa40cba8d44f2b448f5743999aa68aaa5d3ef7049d4a28a2d"}, + {file = "simplejson-3.20.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16b029ca25645b3bc44e84a4f941efa51bf93c180b31bd704ce6349d1fc77c1"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e22a5fb7b1437ffb057e02e1936a3bfb19084ae9d221ec5e9f4cf85f69946b6"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b6ff02fc7b8555c906c24735908854819b0d0dc85883d453e23ca4c0445d01"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bfc1c396ad972ba4431130b42307b2321dba14d988580c1ac421ec6a6b7cee3"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a97249ee1aee005d891b5a211faf58092a309f3d9d440bc269043b08f662eda"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f1036be00b5edaddbddbb89c0f80ed229714a941cfd21e51386dc69c237201c2"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5d6f5bacb8cdee64946b45f2680afa3f54cd38e62471ceda89f777693aeca4e4"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8db6841fb796ec5af632f677abf21c6425a1ebea0d9ac3ef1a340b8dc69f52b8"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0a341f7cc2aae82ee2b31f8a827fd2e51d09626f8b3accc441a6907c88aedb7"}, + {file = "simplejson-3.20.2-cp310-cp310-win32.whl", hash = "sha256:27f9c01a6bc581d32ab026f515226864576da05ef322d7fc141cd8a15a95ce53"}, + {file = "simplejson-3.20.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0a63ec98a4547ff366871bf832a7367ee43d047bcec0b07b66c794e2137b476"}, + {file = "simplejson-3.20.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:06190b33cd7849efc413a5738d3da00b90e4a5382fd3d584c841ac20fb828c6f"}, + {file = "simplejson-3.20.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ad4eac7d858947a30d2c404e61f16b84d16be79eb6fb316341885bdde864fa8"}, + {file = "simplejson-3.20.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b392e11c6165d4a0fde41754a0e13e1d88a5ad782b245a973dd4b2bdb4e5076a"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51eccc4e353eed3c50e0ea2326173acdc05e58f0c110405920b989d481287e51"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:306e83d7c331ad833d2d43c76a67f476c4b80c4a13334f6e34bb110e6105b3bd"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f820a6ac2ef0bc338ae4963f4f82ccebdb0824fe9caf6d660670c578abe01013"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e7a066528a5451433eb3418184f05682ea0493d14e9aae690499b7e1eb6b81"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:438680ddde57ea87161a4824e8de04387b328ad51cfdf1eaf723623a3014b7aa"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cac78470ae68b8d8c41b6fca97f5bf8e024ca80d5878c7724e024540f5cdaadb"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7524e19c2da5ef281860a3d74668050c6986be15c9dd99966034ba47c68828c2"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e9b6d845a603b2eef3394eb5e21edb8626cd9ae9a8361d14e267eb969dbe413"}, + {file = "simplejson-3.20.2-cp311-cp311-win32.whl", hash = "sha256:47d8927e5ac927fdd34c99cc617938abb3624b06ff86e8e219740a86507eb961"}, + {file = "simplejson-3.20.2-cp311-cp311-win_amd64.whl", hash = "sha256:ba4edf3be8e97e4713d06c3d302cba1ff5c49d16e9d24c209884ac1b8455520c"}, + {file = "simplejson-3.20.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4376d5acae0d1e91e78baeba4ee3cf22fbf6509d81539d01b94e0951d28ec2b6"}, + {file = "simplejson-3.20.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f8fe6de652fcddae6dec8f281cc1e77e4e8f3575249e1800090aab48f73b4259"}, + {file = "simplejson-3.20.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25ca2663d99328d51e5a138f22018e54c9162438d831e26cfc3458688616eca8"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12a6b2816b6cab6c3fd273d43b1948bc9acf708272074c8858f579c394f4cbc9"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac20dc3fcdfc7b8415bfc3d7d51beccd8695c3f4acb7f74e3a3b538e76672868"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db0804d04564e70862ef807f3e1ace2cc212ef0e22deb1b3d6f80c45e5882c6b"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:979ce23ea663895ae39106946ef3d78527822d918a136dbc77b9e2b7f006237e"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a2ba921b047bb029805726800819675249ef25d2f65fd0edb90639c5b1c3033c"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:12d3d4dc33770069b780cc8f5abef909fe4a3f071f18f55f6d896a370fd0f970"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aff032a59a201b3683a34be1169e71ddda683d9c3b43b261599c12055349251e"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30e590e133b06773f0dc9c3f82e567463df40598b660b5adf53eb1c488202544"}, + {file = "simplejson-3.20.2-cp312-cp312-win32.whl", hash = "sha256:8d7be7c99939cc58e7c5bcf6bb52a842a58e6c65e1e9cdd2a94b697b24cddb54"}, + {file = "simplejson-3.20.2-cp312-cp312-win_amd64.whl", hash = "sha256:2c0b4a67e75b945489052af6590e7dca0ed473ead5d0f3aad61fa584afe814ab"}, + {file = "simplejson-3.20.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90d311ba8fcd733a3677e0be21804827226a57144130ba01c3c6a325e887dd86"}, + {file = "simplejson-3.20.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:feed6806f614bdf7f5cb6d0123cb0c1c5f40407ef103aa935cffaa694e2e0c74"}, + {file = "simplejson-3.20.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6b1d8d7c3e1a205c49e1aee6ba907dcb8ccea83651e6c3e2cb2062f1e52b0726"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:552f55745044a24c3cb7ec67e54234be56d5d6d0e054f2e4cf4fb3e297429be5"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2da97ac65165d66b0570c9e545786f0ac7b5de5854d3711a16cacbcaa8c472d"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f59a12966daa356bf68927fca5a67bebac0033cd18b96de9c2d426cd11756cd0"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133ae2098a8e162c71da97cdab1f383afdd91373b7ff5fe65169b04167da976b"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7977640af7b7d5e6a852d26622057d428706a550f7f5083e7c4dd010a84d941f"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b530ad6d55e71fa9e93e1109cf8182f427a6355848a4ffa09f69cc44e1512522"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bd96a7d981bf64f0e42345584768da4435c05b24fd3c364663f5fbc8fabf82e3"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f28ee755fadb426ba2e464d6fcf25d3f152a05eb6b38e0b4f790352f5540c769"}, + {file = "simplejson-3.20.2-cp313-cp313-win32.whl", hash = "sha256:472785b52e48e3eed9b78b95e26a256f59bb1ee38339be3075dad799e2e1e661"}, + {file = "simplejson-3.20.2-cp313-cp313-win_amd64.whl", hash = "sha256:a1a85013eb33e4820286139540accbe2c98d2da894b2dcefd280209db508e608"}, + {file = "simplejson-3.20.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a135941a50795c934bdc9acc74e172b126e3694fe26de3c0c1bc0b33ea17e6ce"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ba488decb18738f5d6bd082018409689ed8e74bc6c4d33a0b81af6edf1c9f4"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d81f8e982923d5e9841622ff6568be89756428f98a82c16e4158ac32b92a3787"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdad497ccb1edc5020bef209e9c3e062a923e8e6fca5b8a39f0fb34380c8a66c"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a3f1db97bcd9fb592928159af7a405b18df7e847cbcc5682a209c5b2ad5d6b1"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:215b65b0dc2c432ab79c430aa4f1e595f37b07a83c1e4c4928d7e22e6b49a748"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:ece4863171ba53f086a3bfd87f02ec3d6abc586f413babfc6cf4de4d84894620"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:4a76d7c47d959afe6c41c88005f3041f583a4b9a1783cf341887a3628a77baa0"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:e9b0523582a57d9ea74f83ecefdffe18b2b0a907df1a9cef06955883341930d8"}, + {file = "simplejson-3.20.2-cp36-cp36m-win32.whl", hash = "sha256:16366591c8e08a4ac76b81d76a3fc97bf2bcc234c9c097b48d32ea6bfe2be2fe"}, + {file = "simplejson-3.20.2-cp36-cp36m-win_amd64.whl", hash = "sha256:732cf4c4ac1a258b4e9334e1e40a38303689f432497d3caeb491428b7547e782"}, + {file = "simplejson-3.20.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6c3a98e21e5f098e4f982ef302ebb1e681ff16a5d530cfce36296bea58fe2396"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10cf9ca1363dc3711c72f4ec7c1caed2bbd9aaa29a8d9122e31106022dc175c6"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:106762f8aedf3fc3364649bfe8dc9a40bf5104f872a4d2d86bae001b1af30d30"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b21659898b7496322e99674739193f81052e588afa8b31b6a1c7733d8829b925"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fa1db6a02bca88829f2b2057c76a1d2dc2fccb8c5ff1199e352f213e9ec719"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:156139d94b660448ec8a4ea89f77ec476597f752c2ff66432d3656704c66b40e"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:b2620ac40be04dff08854baf6f4df10272f67079f61ed1b6274c0e840f2e2ae1"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:9ccef5b5d3e3ac5d9da0a0ca1d2de8cf2b0fb56b06aa0ab79325fa4bcc5a1d60"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f526304c2cc9fd8b8d18afacb75bc171650f83a7097b2c92ad6a431b5d7c1b72"}, + {file = "simplejson-3.20.2-cp37-cp37m-win32.whl", hash = "sha256:e0f661105398121dd48d9987a2a8f7825b8297b3b2a7fe5b0d247370396119d5"}, + {file = "simplejson-3.20.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dab98625b3d6821e77ea59c4d0e71059f8063825a0885b50ed410e5c8bd5cb66"}, + {file = "simplejson-3.20.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b8205f113082e7d8f667d6cd37d019a7ee5ef30b48463f9de48e1853726c6127"}, + {file = "simplejson-3.20.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fc8da64929ef0ff16448b602394a76fd9968a39afff0692e5ab53669df1f047f"}, + {file = "simplejson-3.20.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfe704864b5fead4f21c8d448a89ee101c9b0fc92a5f40b674111da9272b3a90"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40ca7cbe7d2f423b97ed4e70989ef357f027a7e487606628c11b79667639dc84"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cec1868b237fe9fb2d466d6ce0c7b772e005aadeeda582d867f6f1ec9710cad"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:792debfba68d8dd61085ffb332d72b9f5b38269cda0c99f92c7a054382f55246"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e022b2c4c54cb4855e555f64aa3377e3e5ca912c372fa9e3edcc90ebbad93dce"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5de26f11d5aca575d3825dddc65f69fdcba18f6ca2b4db5cef16f41f969cef15"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e2162b2a43614727ec3df75baeda8881ab129824aa1b49410d4b6c64f55a45b4"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e11a1d6b2f7e72ca546bdb4e6374b237ebae9220e764051b867111df83acbd13"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:daf7cd18fe99eb427fa6ddb6b437cfde65125a96dc27b93a8969b6fe90a1dbea"}, + {file = "simplejson-3.20.2-cp38-cp38-win32.whl", hash = "sha256:da795ea5f440052f4f497b496010e2c4e05940d449ea7b5c417794ec1be55d01"}, + {file = "simplejson-3.20.2-cp38-cp38-win_amd64.whl", hash = "sha256:6a4b5e7864f952fcce4244a70166797d7b8fd6069b4286d3e8403c14b88656b6"}, + {file = "simplejson-3.20.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b3bf76512ccb07d47944ebdca44c65b781612d38b9098566b4bb40f713fc4047"}, + {file = "simplejson-3.20.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:214e26acf2dfb9ff3314e65c4e168a6b125bced0e2d99a65ea7b0f169db1e562"}, + {file = "simplejson-3.20.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2fb1259ca9c385b0395bad59cdbf79535a5a84fb1988f339a49bfbc57455a35a"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34e028a2ba8553a208ded1da5fa8501833875078c4c00a50dffc33622057881"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b538f9d9e503b0dd43af60496780cb50755e4d8e5b34e5647b887675c1ae9fee"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab998e416ded6c58f549a22b6a8847e75a9e1ef98eb9fbb2863e1f9e61a4105b"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a8f1c307edf5fbf0c6db3396c5d3471409c4a40c7a2a466fbc762f20d46601a"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5a7bbac80bdb82a44303f5630baee140aee208e5a4618e8b9fde3fc400a42671"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5ef70ec8fe1569872e5a3e4720c1e1dcb823879a3c78bc02589eb88fab920b1f"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:cb11c09c99253a74c36925d461c86ea25f0140f3b98ff678322734ddc0f038d7"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:66f7c78c6ef776f8bd9afaad455e88b8197a51e95617bcc44b50dd974a7825ba"}, + {file = "simplejson-3.20.2-cp39-cp39-win32.whl", hash = "sha256:619ada86bfe3a5aa02b8222ca6bfc5aa3e1075c1fb5b3263d24ba579382df472"}, + {file = "simplejson-3.20.2-cp39-cp39-win_amd64.whl", hash = "sha256:44a6235e09ca5cc41aa5870a952489c06aa4aee3361ae46daa947d8398e57502"}, + {file = "simplejson-3.20.2-py3-none-any.whl", hash = "sha256:3b6bb7fb96efd673eac2e4235200bfffdc2353ad12c54117e1e4e2fc485ac017"}, + {file = "simplejson-3.20.2.tar.gz", hash = "sha256:5fe7a6ce14d1c300d80d08695b7f7e633de6cd72c80644021874d985b3393649"}, +] [[package]] name = "six" @@ -5857,6 +7698,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main", "dagster", "dev", "notebook", "pipelines"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -5868,28 +7710,66 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "snuggs" +version = "1.4.7" +description = "Snuggs are s-expressions for Numpy" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "snuggs-1.4.7-py3-none-any.whl", hash = "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07"}, + {file = "snuggs-1.4.7.tar.gz", hash = "sha256:501cf113fe3892e14e2fee76da5cd0606b7e149c411c271898e6259ebde2617b"}, +] + +[package.dependencies] +numpy = "*" +pyparsing = ">=2.1.6" + +[package.extras] +test = ["hypothesis", "pytest"] + [[package]] name = "soupsieve" version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" +groups = ["notebook", "pipelines"] files = [ {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] +[[package]] +name = "sphinxcontrib-napoleon" +version = "0.7" +description = "Sphinx \"napoleon\" extension." +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "sphinxcontrib-napoleon-0.7.tar.gz", hash = "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8"}, + {file = "sphinxcontrib_napoleon-0.7-py2.py3-none-any.whl", hash = "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef"}, +] + +[package.dependencies] +pockets = ">=0.3" +six = ">=1.5.2" + [[package]] name = "sqlalchemy" version = "2.0.29" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "pipelines"] files = [ {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, @@ -5977,6 +7857,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" +groups = ["dev", "notebook"] files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -5996,6 +7877,7 @@ version = "0.37.2" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" +groups = ["dagster"] files = [ {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, @@ -6013,6 +7895,7 @@ version = "0.0.55" description = "std-uritemplate implementation for Python" optional = false python-versions = ">=3.8,<4.0" +groups = ["main", "pipelines"] files = [ {file = "std_uritemplate-0.0.55-py3-none-any.whl", hash = "sha256:4c5e3c068db007697c11e6047d16c9b64f07e8259ffa4dd4d9248ed8491ad430"}, {file = "std_uritemplate-0.0.55.tar.gz", hash = "sha256:9073f56a77e44d0583fb6645c37e4a640a34f22a255d00e3793cd3f30da58a68"}, @@ -6024,6 +7907,7 @@ version = "24.1.0" description = "Structured Logging for Python" optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "structlog-24.1.0-py3-none-any.whl", hash = "sha256:3f6efe7d25fab6e86f277713c218044669906537bb717c1807a09d46bca0714d"}, {file = "structlog-24.1.0.tar.gz", hash = "sha256:41a09886e4d55df25bdcb9b5c9674bccfab723ff43e0a86a1b7b236be8e57b16"}, @@ -6035,12 +7919,30 @@ docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib- tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] typing = ["mypy (>=1.4)", "rich", "twisted"] +[[package]] +name = "tableschema-to-template" +version = "0.0.13" +description = "Given a Frictionless Table Schema, generates an Excel template with input validation" +optional = false +python-versions = ">=3.6" +groups = ["pipelines"] +files = [ + {file = "tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c"}, + {file = "tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c"}, +] + +[package.dependencies] +jsonschema = ">=1.0.0" +pyyaml = ">=3.13" +xlsxwriter = ">=1.2.8" + [[package]] name = "tabulate" version = "0.9.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -6055,6 +7957,7 @@ version = "9.1.4" description = "Retry code until it succeeds" optional = false python-versions = ">=3.10" +groups = ["main", "pipelines"] files = [ {file = "tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55"}, {file = "tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a"}, @@ -6064,26 +7967,13 @@ files = [ doc = ["reno", "sphinx"] test = ["pytest", "tornado (>=4.5)", "typeguard"] -[[package]] -name = "termcolor" -version = "2.4.0" -description = "ANSI color formatting for output in terminal" -optional = false -python-versions = ">=3.8" -files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, -] - -[package.extras] -tests = ["pytest", "pytest-cov"] - [[package]] name = "terminado" version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, @@ -6099,12 +7989,25 @@ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + [[package]] name = "thefuzz" version = "0.20.0" description = "Fuzzy string matching in python" optional = false python-versions = ">=3.7" +groups = ["pipelines"] files = [ {file = "thefuzz-0.20.0-py3-none-any.whl", hash = "sha256:bd2b657a12bd8518917d2d71c53125368706233b822fac688fca956730154388"}, {file = "thefuzz-0.20.0.tar.gz", hash = "sha256:a25e49786b1c4603c7fc6e2d69e6bc660982a2919698b536ff8354e0631cc40d"}, @@ -6119,6 +8022,7 @@ version = "1.2.1" description = "A tiny CSS parser" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, @@ -6137,6 +8041,7 @@ version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["pipelines"] files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -6148,6 +8053,7 @@ version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, @@ -6159,6 +8065,7 @@ version = "0.12.4" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, @@ -6170,6 +8077,7 @@ version = "1.10" description = "Implements a topological sort algorithm." optional = false python-versions = "*" +groups = ["dagster", "pipelines"] files = [ {file = "toposort-1.10-py3-none-any.whl", hash = "sha256:cbdbc0d0bee4d2695ab2ceec97fe0679e9c10eab4b2a87a9372b929e70563a87"}, {file = "toposort-1.10.tar.gz", hash = "sha256:bfbb479c53d0a696ea7402601f4e693c97b0367837c8898bc6471adfca37a6bd"}, @@ -6181,6 +8089,7 @@ version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" +groups = ["notebook", "pipelines"] files = [ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, @@ -6201,6 +8110,7 @@ version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["dagster", "pipelines"] files = [ {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, @@ -6221,6 +8131,7 @@ version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" +groups = ["dev", "notebook"] files = [ {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, @@ -6236,6 +8147,7 @@ version = "0.335.0" description = "Client for the Trino distributed SQL Engine" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "trino-0.335.0-py3-none-any.whl", hash = "sha256:5c96d89d610ab7712ede532d2eb41beb8627339571bceff6134370a8a496f685"}, {file = "trino-0.335.0.tar.gz", hash = "sha256:b5e6c928953689be8446cbf7dbb87894cbfe54cf099a85cf461c4206c252cd67"}, @@ -6258,12 +8170,31 @@ kerberos = ["requests_kerberos"] sqlalchemy = ["sqlalchemy (>=1.3)"] tests = ["black", "boto3", "httpretty (<1.1)", "isort", "keyring", "krb5 (==0.5.1)", "pre-commit", "pytest", "pytest-runner", "requests_gssapi", "requests_kerberos", "sqlalchemy (>=1.3)", "testcontainers"] +[[package]] +name = "typer" +version = "0.23.1" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e"}, + {file = "typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134"}, +] + +[package.dependencies] +annotated-doc = ">=0.0.2" +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" + [[package]] name = "types-python-dateutil" version = "2.9.0.20240316" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" +groups = ["notebook"] files = [ {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, @@ -6271,13 +8202,14 @@ files = [ [[package]] name = "typing-extensions" -version = "4.10.0" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main", "dagster", "dev", "pipelines"] files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] @@ -6286,6 +8218,7 @@ version = "0.9.0" description = "Runtime inspection utilities for typing module." optional = false python-versions = "*" +groups = ["pipelines"] files = [ {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, @@ -6295,12 +8228,28 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" +[[package]] +name = "typing-inspection" +version = "0.4.2" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["dagster", "pipelines"] +files = [ + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main", "dagster", "pipelines"] files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, @@ -6312,6 +8261,7 @@ version = "5.3.1" description = "tzinfo object for the local timezone" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d"}, {file = "tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd"}, @@ -6329,6 +8279,7 @@ version = "1.3.8" description = "ASCII transliterations of Unicode text" optional = false python-versions = ">=3.5" +groups = ["pipelines"] files = [ {file = "Unidecode-1.3.8-py3-none-any.whl", hash = "sha256:d130a61ce6696f8148a3bd8fe779c99adeb4b870584eeb9526584e9aa091fd39"}, {file = "Unidecode-1.3.8.tar.gz", hash = "sha256:cfdb349d46ed3873ece4586b96aa75258726e2fa8ec21d6f00a591d98806c2f4"}, @@ -6340,6 +8291,7 @@ version = "0.2.2" description = "pathlib api extended to use fsspec backends" optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "universal_pathlib-0.2.2-py3-none-any.whl", hash = "sha256:9bc176112d593348bb29806a47e409eda78dff8d95391d66dd6f85e443aaa75d"}, {file = "universal_pathlib-0.2.2.tar.gz", hash = "sha256:6bc215548792ad5db3553708b1c19bafd9e2fa1667dc925ed404c95e52ae2f13"}, @@ -6358,6 +8310,7 @@ version = "1.3.0" description = "RFC 6570 URI Template Processor" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -6366,19 +8319,32 @@ files = [ [package.extras] dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] +[[package]] +name = "uritemplate" +version = "4.2.0" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686"}, + {file = "uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e"}, +] + [[package]] name = "urllib3" version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" +groups = ["main", "dagster", "notebook", "pipelines"] files = [ {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -6389,6 +8355,7 @@ version = "0.29.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" +groups = ["dagster"] files = [ {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, @@ -6401,12 +8368,12 @@ h11 = ">=0.8" httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] name = "uvloop" @@ -6414,6 +8381,8 @@ version = "0.19.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = false python-versions = ">=3.8.0" +groups = ["dagster"] +markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"" files = [ {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, @@ -6450,7 +8419,22 @@ files = [ [package.extras] docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0) ; python_version >= \"3.12\"", "aiohttp (>=3.8.1) ; python_version < \"3.12\"", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "validators" +version = "0.35.0" +description = "Python Data Validation for Humans™" +optional = false +python-versions = ">=3.9" +groups = ["pipelines"] +files = [ + {file = "validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd"}, + {file = "validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a"}, +] + +[package.extras] +crypto-eth-addresses = ["eth-hash[pycryptodome] (>=0.7.0)"] [[package]] name = "watchdog" @@ -6458,6 +8442,7 @@ version = "4.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" +groups = ["dagster", "pipelines"] files = [ {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, @@ -6499,6 +8484,7 @@ version = "0.21.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.8" +groups = ["dagster"] files = [ {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, @@ -6586,6 +8572,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["dev", "notebook"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -6597,6 +8584,7 @@ version = "1.13" description = "A library for working with the color formats defined by HTML and CSS." optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, @@ -6612,6 +8600,7 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = false python-versions = "*" +groups = ["notebook"] files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -6623,6 +8612,7 @@ version = "1.7.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.8" +groups = ["dagster", "notebook"] files = [ {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, @@ -6639,6 +8629,7 @@ version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.8" +groups = ["dagster"] files = [ {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, @@ -6720,6 +8711,7 @@ version = "4.0.10" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" +groups = ["notebook"] files = [ {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, @@ -6731,13 +8723,15 @@ version = "1.1.0" description = "A small Python utility to set file creation time on Windows" optional = false python-versions = ">=3.5" +groups = ["main", "pipelines"] +markers = "sys_platform == \"win32\"" files = [ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] [package.extras] -dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] +dev = ["black (>=19.3b0) ; python_version >= \"3.6\"", "pytest (>=4.6.2)"] [[package]] name = "wrapt" @@ -6745,6 +8739,7 @@ version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.6" +groups = ["main", "pipelines"] files = [ {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, @@ -6824,6 +8819,7 @@ version = "2.0.1" description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +groups = ["pipelines"] files = [ {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, @@ -6834,12 +8830,49 @@ build = ["twine", "wheel"] docs = ["sphinx"] test = ["pytest", "pytest-cov"] +[[package]] +name = "xlsx2csv" +version = "0.8.6" +description = "xlsx to csv converter" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "xlsx2csv-0.8.6-py3-none-any.whl", hash = "sha256:415341e348b4c474cc84a4c23c4d116e0be07c89be6a84c5fde5e4c948db1943"}, + {file = "xlsx2csv-0.8.6.tar.gz", hash = "sha256:618fc502612860de8ab8e3d6195e99ef332fffc68337f6b89e59690aad0d20b5"}, +] + +[[package]] +name = "xlsxwriter" +version = "3.2.9" +description = "A Python module for creating Excel XLSX files." +optional = false +python-versions = ">=3.8" +groups = ["pipelines"] +files = [ + {file = "xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3"}, + {file = "xlsxwriter-3.2.9.tar.gz", hash = "sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c"}, +] + +[[package]] +name = "xlwt" +version = "1.3.0" +description = "Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.7, 3.3+" +optional = false +python-versions = "*" +groups = ["pipelines"] +files = [ + {file = "xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e"}, + {file = "xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88"}, +] + [[package]] name = "yarl" version = "1.9.4" description = "Yet another URL library" optional = false python-versions = ">=3.7" +groups = ["main", "dagster", "pipelines"] files = [ {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, @@ -6943,17 +8976,18 @@ version = "3.20.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" +groups = ["main", "pipelines", "spark"] files = [ {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [[package]] @@ -6962,6 +8996,7 @@ version = "0.23.0" description = "Zstandard bindings for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, @@ -7069,6 +9104,6 @@ cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\ cffi = ["cffi (>=1.11)"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.11,<3.13" -content-hash = "3ab5b4a98d8d889bbcfa54a8a6fdf79f763733ae903a9edfa87486e9dcd6f99c" +content-hash = "3e5052e864fa91fcbb7acec6ce8a5604490ab80ffb75fbaca5896e0ce4ddabd2" diff --git a/dagster/pyproject.toml b/dagster/pyproject.toml index d49012a81..25ced3c9a 100644 --- a/dagster/pyproject.toml +++ b/dagster/pyproject.toml @@ -9,7 +9,7 @@ readme = "../docs/README.md" python = ">=3.11,<3.13" scipy = ">=1.10.0" cryptography = ">=42.0.4" -sentry-sdk = "0.10.2" +sentry-sdk = ">=1.33.1" openpyxl = "^3.1.2" loguru = "^0.7.2" icecream = "^2.1.3" @@ -34,18 +34,19 @@ azure-storage-file-datalake = "^12.13.1" pytest-cov = "4.0.0" azure-identity = ">=1.16.1" geopy = "^2.4.0" -h3 = "^3.7.6" +h3 = "^4.2" fastparquet = "^2023.8.0" grpcio-status = "^1.59.0" -acryl-datahub = { extras = ["azure-ad"], version = "0.14.0.2" } +acryl-datahub = { extras = ["azure-ad"], version = "^1.3.1" } shapely = "^2.0.2" -geopandas = "^0.14.1" +geopandas = "^1.0" thefuzz = "^0.20.0" country-converter = "^1.1.1" sqlalchemy = "^2.0.28" psycopg2-binary = "^2.9.9" cuid2 = "^2.0.0" -pydantic = { extras = ["email"], version = "<2.0.0" } +pydantic = { extras = ["email"], version = "^2.10" } +pydantic-settings = "^2.0" msgraph-sdk = "^1.2.0" unidecode = "^1.3.8" aiohttp = ">=3.10.2" @@ -60,13 +61,16 @@ urllib3 = ">=2.2.2" tornado = ">=6.4.1" xlrd = "^2.0.1" chardet = "^5.2.0" +giga-spatial = "==0.9.2" +numpy = "^2.4.4" +pandas = "^2.1" +networkx = "^3.2" +earthengine-api = ">=0.1.400" [tool.poetry.group.spark.dependencies] pyspark = "3.5.0" delta-spark = "3.0.0" -deltalake = "0.12.0" -pyarrow = "11.0.0" -pyarrow-hotfix = "^0.5" +pyarrow = "^16.0" roapi = "0.9.0" [tool.poetry.group.notebook.dependencies] @@ -124,7 +128,7 @@ combine-as-imports = true force-wrap-aliases = true [tool.ruff.lint.pep8-naming] -classmethod-decorators = ["pydantic.validator"] +classmethod-decorators = ["pydantic.field_validator"] [tool.bandit] tests = [ diff --git a/dagster/src/assets/adhoc/master_csv_to_gold.py b/dagster/src/assets/adhoc/master_csv_to_gold.py index 648fd2a35..3d0d2f480 100644 --- a/dagster/src/assets/adhoc/master_csv_to_gold.py +++ b/dagster/src/assets/adhoc/master_csv_to_gold.py @@ -42,7 +42,6 @@ check_table_exists, create_delta_table, create_schema, - sync_schema, ) from src.utils.logger import ContextLoggerWithLoguruFallback from src.utils.metadata import get_output_metadata, get_table_preview @@ -608,38 +607,6 @@ def adhoc__publish_master_to_gold( ) gold = compute_row_hash(gold) - table_exists = check_table_exists( - spark=spark.spark_session, - schema_name="school_master", - table_name=config.country_code.lower(), - data_tier=DataTier.GOLD, - ) - - if table_exists: - table_name = f"{config.metastore_schema}.{config.country_code}" - updated_schema = StructType( - get_schema_columns( - spark=spark.spark_session, schema_name=config.metastore_schema - ) - ) - - context.log.info(f"Existing table name: {table_name}") - - spark.spark_session.catalog.refreshTable(table_name) - existing_df = DeltaTable.forName( - sparkSession=spark.spark_session, tableOrViewName=table_name - ).toDF() - - existing_schema = existing_df.schema - - sync_schema( - table_name=table_name, - existing_schema=existing_schema, - updated_schema=updated_schema, - spark=spark.spark_session, - context=context, - ) - schema_reference = get_schema_columns_datahub( spark.spark_session, config.metastore_schema, @@ -690,38 +657,6 @@ def adhoc__publish_reference_to_gold( ) gold = compute_row_hash(gold) - table_exists = check_table_exists( - spark=spark.spark_session, - schema_name="school_reference", - table_name=config.country_code.lower(), - data_tier=DataTier.GOLD, - ) - - if table_exists: - table_name = f"{config.metastore_schema}.{config.country_code}" - updated_schema = StructType( - get_schema_columns( - spark=spark.spark_session, schema_name=config.metastore_schema - ) - ) - - context.log.info(f"Existing table name: {table_name}") - - spark.spark_session.catalog.refreshTable(table_name) - existing_df = DeltaTable.forName( - sparkSession=spark.spark_session, - tableOrViewName=table_name, - ).toDF() - existing_schema = existing_df.schema - - sync_schema( - table_name=table_name, - existing_schema=existing_schema, - updated_schema=updated_schema, - spark=spark.spark_session, - context=context, - ) - schema_reference = get_schema_columns_datahub( spark.spark_session, config.metastore_schema, diff --git a/dagster/src/assets/admin/assets.py b/dagster/src/assets/admin/assets.py index 813d5be1a..288b8b72b 100644 --- a/dagster/src/assets/admin/assets.py +++ b/dagster/src/assets/admin/assets.py @@ -1,6 +1,8 @@ +from typing import Annotated + from dagster_pyspark import PySparkResource from delta import DeltaTable -from pydantic import conint +from pydantic import Field from pyspark.sql import SparkSession from src.constants.constants_class import constants from src.settings import settings @@ -47,7 +49,7 @@ def admin__terminate_all_runs(context: OpExecutionContext): class RollbackTableConfig(Config): schema_name: str table_name: str - version: conint(ge=0) + version: Annotated[int, Field(ge=0)] @asset diff --git a/dagster/src/assets/common/assets.py b/dagster/src/assets/common/assets.py index d00882d3b..d48b30fff 100644 --- a/dagster/src/assets/common/assets.py +++ b/dagster/src/assets/common/assets.py @@ -630,7 +630,7 @@ def reset_staging_table( raise -def _handle_null_columns(schema_columns, primary_key): +def handle_null_columns(schema_columns, primary_key): """Handle null columns by providing default values based on data type. If the column value is NULL, add a placeholder value if the following @@ -790,7 +790,7 @@ def master( else: new_master = silver - column_actions = _handle_null_columns(schema_columns, primary_key) + column_actions = handle_null_columns(schema_columns, primary_key) new_master = new_master.withColumns(column_actions) new_master = compute_row_hash(new_master) @@ -862,7 +862,7 @@ def reference( else: new_reference = silver - column_actions = _handle_null_columns(schema_columns, primary_key) + column_actions = handle_null_columns(schema_columns, primary_key) new_reference = new_reference.withColumns(column_actions) new_reference = compute_row_hash(new_reference) diff --git a/dagster/src/assets/debug/assets.py b/dagster/src/assets/debug/assets.py index 537195299..32023df02 100644 --- a/dagster/src/assets/debug/assets.py +++ b/dagster/src/assets/debug/assets.py @@ -226,10 +226,10 @@ async def debug__send_test_email( res = await client.post( "/api/email/send-email", headers={"Authorization": f"Bearer {settings.EMAIL_RENDERER_BEARER_TOKEN}"}, - json=config.dict(), + json=config.model_dump(), ) if res.is_error: context.log.error(res.json()) res.raise_for_status() - return Output(None, metadata=config.dict()) + return Output(None, metadata=config.model_dump()) diff --git a/dagster/src/assets/migrations/core.py b/dagster/src/assets/migrations/core.py index 06c18f153..323cd4dac 100644 --- a/dagster/src/assets/migrations/core.py +++ b/dagster/src/assets/migrations/core.py @@ -4,7 +4,11 @@ from models import VALID_PRIMITIVES, Schema from pyspark import sql from pyspark.sql.functions import col, when -from src.utils.delta import execute_query_with_error_handler +from src.utils.delta import ( + create_delta_table, + persist_column_id_map, + sync_schema, +) from dagster import OpExecutionContext @@ -42,17 +46,32 @@ def save_schema_delta_table(context: OpExecutionContext, df: sql.DataFrame): full_table_name = f"{schema_name}.{table_name}" columns = Schema.fields - query = ( - DeltaTable.createOrReplace(spark).tableName(full_table_name).addColumns(columns) + create_delta_table( + spark, + schema_name, + table_name, + columns, + context, + if_not_exists=True, + ) + sync_schema( + table_name=full_table_name, + existing_schema=spark.table(full_table_name).schema, + updated_schema=Schema.schema, + spark=spark, + context=context, ) - execute_query_with_error_handler(spark, query, schema_name, table_name, context) spark.catalog.refreshTable(full_table_name) ( DeltaTable.forName(spark, full_table_name) .alias("master") - .merge(df.alias("updates"), "master.name = updates.name") + .merge(df.alias("updates"), "master.id = updates.id") .whenMatchedUpdateAll() .whenNotMatchedInsertAll() + .whenNotMatchedBySourceDelete() .execute() ) + + # Persist column-ID mapping after merge succeeds + persist_column_id_map(spark, full_table_name, table_name) diff --git a/dagster/src/assets/school_geolocation/assets.py b/dagster/src/assets/school_geolocation/assets.py index 226614aa4..425892570 100644 --- a/dagster/src/assets/school_geolocation/assets.py +++ b/dagster/src/assets/school_geolocation/assets.py @@ -15,6 +15,7 @@ from pyspark.sql.types import StringType, StructField, StructType from sqlalchemy import select from src.constants import DataTier +from src.data_quality_checks.dq_context import DQContext, DQMode from src.data_quality_checks.utils import ( aggregate_report_json, aggregate_report_spark_df, @@ -128,10 +129,19 @@ def geolocation_metadata( context.log.info("Create spark dataframe") metadata_df = s.createDataFrame(metadata_df) - table_columns = get_schema_columns(s, "school_geolocation_metadata") table_name = "school_geolocation_metadata" table_schema_name = "pipeline_tables" + context.log.info("Get schema columns for metadata table") + try: + table_columns = get_schema_columns(s, "school_geolocation_metadata") + except Exception: + context.log.warning( + "Schema table schemas.school_geolocation_metadata not found; " + "using DataFrame schema for metadata table creation" + ) + table_columns = list(metadata_df.schema.fields) + context.log.info("Create the schema and table if they do not exist") metadata_df = add_missing_columns(metadata_df, table_columns) metadata_df = metadata_df.select(*StructType(table_columns).fieldNames()) @@ -228,7 +238,7 @@ def geolocation_bronze( df = df.withColumn("school_id_govt", f.col("school_id_govt").cast(StringType())) df = create_bronze_layer_columns_updated( - df, mode, uploaded_columns, country_code, s + df, mode, uploaded_columns, country_code, file_upload.source, s ) t2 = time.time() @@ -301,9 +311,13 @@ def geolocation_data_quality_results( dq_results = row_level_checks( df=renamed_bronze, silver=casted_silver, - dataset_type=dataset_type, - _country_code_iso3=country_code, - mode=config.metadata["mode"], + dq_context=DQContext( + dq_mode=DQMode(config.metadata.get("dq_mode", "master")), + dataset_type=dataset_type, + country_code_iso3=country_code, + upload_id=id, + upload_mode=config.metadata.get("mode"), + ), context=context, ) @@ -327,7 +341,9 @@ def geolocation_data_quality_results( ) dq_results_schema_name = f"{schema_name}_dq_results" - table_name = f"{id}_{country_code}_{current_timestamp}" + # Replace hyphens with underscores so the identifier is valid in Spark SQL + safe_id = id.replace("-", "_") + table_name = f"{safe_id}_{country_code}_{current_timestamp}" schema_columns = [ StructField(field.name, field.dataType, nullable=True) @@ -696,6 +712,10 @@ def geolocation_staging( spark: PySparkResource, config: FileConfig, ) -> Output[None]: + if config.metadata.get("dq_mode") == "uploaded": + context.log.info("Skipping staging as dq_mode is 'uploaded'") + return Output(None) + if geolocation_dq_passed_rows.isEmpty(): context.log.warning("Skipping staging as there are no rows passing DQ checks") return Output(None) diff --git a/dagster/src/constants/constants_class.py b/dagster/src/constants/constants_class.py index b8de8b94d..80fbc92ff 100644 --- a/dagster/src/constants/constants_class.py +++ b/dagster/src/constants/constants_class.py @@ -1,4 +1,5 @@ from datetime import datetime +from typing import ClassVar from datahub.metadata.schema_classes import ( BooleanTypeClass, @@ -7,7 +8,7 @@ StringTypeClass, ) from models import TypeMapping, TypeMappings -from pydantic import BaseSettings +from pydantic_settings import BaseSettings from pyspark.sql.types import ( BooleanType, DoubleType, @@ -22,32 +23,38 @@ class Constants(BaseSettings): UPLOAD_PATH_PREFIX: str = "raw/uploads" UPLOAD_METADATA_PATH_PREFIX: str = "raw/upload_metadata" - datetime_partition_key_format = "%Y-%m-%d-%H:%M" + datetime_partition_key_format: ClassVar[str] = "%Y-%m-%d-%H:%M" - connectivity_updates_folder = "raw/connectivity_updates" - raw_folder = "raw" # if settings.IN_PRODUCTION else "adls-testing-raw" - raw_schema_folder = "raw/schema" - raw_schema_folder_source = "raw/schema" - bronze_folder = "bronze" - silver_folder = "silver" - gold_folder = "gold" - dq_results_folder = "data-quality-results" - staging_folder = "staging" + connectivity_updates_folder: ClassVar[str] = "raw/connectivity_updates" + raw_folder: ClassVar[str] = ( + "raw" # if settings.IN_PRODUCTION else "adls-testing-raw" + ) + raw_schema_folder: ClassVar[str] = "raw/schema" + raw_schema_folder_source: ClassVar[str] = "raw/schema" + bronze_folder: ClassVar[str] = "bronze" + silver_folder: ClassVar[str] = "silver" + gold_folder: ClassVar[str] = "gold" + dq_results_folder: ClassVar[str] = "data-quality-results" + staging_folder: ClassVar[str] = "staging" - dq_passed_folder = "staging/pending-review" - staging_approved_folder = "staging/approved" - archive_manual_review_rejected_folder = "archive/manual-review-rejected" - gold_source_folder = "updated_master_schema" - adhoc_master_updates_source_folder = "updated_master_schema/master_updates" - qos_source_folder = "gold/qos" - qos_raw_source_folder = "gold/qos-raw" - error_folder = "error" + dq_passed_folder: ClassVar[str] = "staging/pending-review" + staging_approved_folder: ClassVar[str] = "staging/approved" + archive_manual_review_rejected_folder: ClassVar[str] = ( + "archive/manual-review-rejected" + ) + gold_source_folder: ClassVar[str] = "updated_master_schema" + adhoc_master_updates_source_folder: ClassVar[str] = ( + "updated_master_schema/master_updates" + ) + qos_source_folder: ClassVar[str] = "gold/qos" + qos_raw_source_folder: ClassVar[str] = "gold/qos-raw" + error_folder: ClassVar[str] = "error" # can't set infinite, just set to a value most likely beyond the extinction of the human race - school_master_retention_period = "interval 1000000 weeks" - qos_retention_period = "interval 90 days" - PING_PARQUET_PATH = "giga_meter/ping" - PING_RETRY_FILE_PATH = "giga_meter/ping/.retry.json" + school_master_retention_period: ClassVar[str] = "interval 1000000 weeks" + qos_retention_period: ClassVar[str] = "interval 90 days" + PING_PARQUET_PATH: ClassVar[str] = "giga_meter/ping" + PING_RETRY_FILE_PATH: ClassVar[str] = "giga_meter/ping/.retry.json" TYPE_MAPPINGS: TypeMappings = TypeMappings( string=TypeMapping( @@ -60,6 +67,11 @@ class Constants(BaseSettings): pyspark=IntegerType, datahub=NumberTypeClass, ), + int=TypeMapping( + native=int, + pyspark=IntegerType, + datahub=NumberTypeClass, + ), long=TypeMapping( native=int, pyspark=LongType, diff --git a/dagster/src/data_quality_checks/dq_context.py b/dagster/src/data_quality_checks/dq_context.py new file mode 100644 index 000000000..a3199bb35 --- /dev/null +++ b/dagster/src/data_quality_checks/dq_context.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass +from enum import Enum +from typing import Optional + + +class DQMode(str, Enum): + UPLOADED = "uploaded" + MASTER = "master" + + +@dataclass(frozen=True) +class DQContext: + dq_mode: DQMode + dataset_type: str + country_code_iso3: str + upload_id: Optional[int] = None + upload_mode: Optional[str] = None + + @property + def mode(self) -> DQMode: + return self.dq_mode diff --git a/dagster/src/data_quality_checks/geospatial.py b/dagster/src/data_quality_checks/geospatial.py new file mode 100644 index 000000000..5b3c9d0f0 --- /dev/null +++ b/dagster/src/data_quality_checks/geospatial.py @@ -0,0 +1,613 @@ +import geopandas as gpd +import networkx as nx +import pandas as pd +from gigaspatial.core.io import LocalDataStore +from gigaspatial.generators.poi import PoiViewGenerator +from gigaspatial.processing.algorithms import build_distance_graph +from networkx.algorithms.clique import find_cliques as maximal_cliques +from pyspark import sql +from pyspark.sql import functions as f + +from dagster import OpExecutionContext +from src.settings import settings +from src.utils.logger import get_context_with_fallback_logger + +# Uninhabited area threshold: if the nearest building is farther than this distance (in meters), +# the school is considered to be in an uninhabited area. +UNINHABITED_DISTANCE_THRESHOLD_M = 150 + +# Built surface threshold: if the total built surface area (m²) within the buffer radius +# is below this value, the location has insufficient built infrastructure. +BUILT_SURFACE_THRESHOLD_M2 = 10.0 + +# Buffer radius for built surface area check (in meters) +BUILT_SURFACE_BUFFER_M = 150 + +# Proximity duplicate threshold: schools within this distance (in meters) are considered +# potential duplicates. +PROXIMITY_DUPLICATE_THRESHOLD_M = 50 + +# SMOD class labels mapping +# Ref: https://ghsl.jrc.ec.europa.eu/ghs_smod2023.php +SMOD_CLASS_LABELS = { + 30: "Urban Centre", + 23: "Dense Urban Cluster", + 22: "Semi-Dense Urban Cluster", + 21: "Suburban or Peri-Urban", + 13: "Rural Cluster", + 12: "Low Density Rural", + 11: "Very Low Density Rural", + 10: "Water", +} + +SMOD_URBAN_CLASSES = {20, 21, 22, 23, 30} + +# Population radii to compute (in meters) +POPULATION_RADII_M = { + "pop_within_1km": 1000, + "pop_within_2km": 2000, + "pop_within_3km": 3000, + "pop_within_5km": 5000, + "pop_within_10km": 10000, +} + +SURROUNDING_SCHOOLS_RADII_M = [1000, 2000, 3000, 5000, 10000] + + +def _get_data_store(): + """Return a giga-spatial LocalDataStore""" + if settings.GEOSPATIAL_DATA_DIR: + return LocalDataStore(settings.GEOSPATIAL_DATA_DIR) + return LocalDataStore() + + +def _spark_to_pandas_coords(df: sql.DataFrame) -> pd.DataFrame: + """Extract school_id_giga, latitude, longitude from Spark DF to Pandas, + filtering out rows with NULL/NaN coordinates. + """ + pdf = df.select("school_id_giga", "latitude", "longitude").toPandas() + pdf["latitude"] = pd.to_numeric(pdf["latitude"], errors="coerce") + pdf["longitude"] = pd.to_numeric(pdf["longitude"], errors="coerce") + return pdf + + +def _get_valid_coords_mask(pdf: pd.DataFrame) -> pd.Series: + """Return a boolean mask for rows with valid (non-null, non-NaN) coordinates.""" + return ( + pdf["latitude"].notna() + & pdf["longitude"].notna() + & pdf["latitude"].between(-90, 90) + & pdf["longitude"].between(-180, 180) + ) + + +def _join_pandas_result_to_spark( + df: sql.DataFrame, + result_pdf: pd.DataFrame, + result_columns: list[str], +) -> sql.DataFrame: + """Join a Pandas result DataFrame back to the original Spark DataFrame + using school_id_giga as the join key. + """ + spark = df.sparkSession + result_sdf = spark.createDataFrame(result_pdf[["school_id_giga"] + result_columns]) + df = df.join(result_sdf, on="school_id_giga", how="left") + return df + + +def _null_guard_int(df: sql.DataFrame, col_name: str) -> sql.DataFrame: + """Set column to NULL for rows with invalid coordinates, then cast to int.""" + df = df.withColumn( + col_name, + f.when( + f.col("latitude").isNull() + | f.isnan(f.col("latitude")) + | f.col("longitude").isNull() + | f.isnan(f.col("longitude")), + f.lit(None).cast("int"), + ).otherwise(f.col(col_name)), + ) + return df.withColumn(col_name, f.col(col_name).cast("int")) + + +def _null_guard_string(df: sql.DataFrame, col_name: str) -> sql.DataFrame: + """Set column to NULL for rows with invalid coordinates (string type).""" + return df.withColumn( + col_name, + f.when( + f.col("latitude").isNull() + | f.isnan(f.col("latitude")) + | f.col("longitude").isNull() + | f.isnan(f.col("longitude")), + f.lit(None).cast("string"), + ).otherwise(f.col(col_name)), + ) + + +def uninhabited_area_check( # noqa + df: sql.DataFrame, + country_code_iso3: str, + context: OpExecutionContext = None, +) -> sql.DataFrame: + """Check if schools are in uninhabited areas using multiple signals + 1. Nearest Google building distance > threshold + 2. Nearest MS building distance > threshold + 3. Built surface area (GHSL GHS_BUILT_S) within buffer < threshold + + Adds columns: + - dq_is_in_uninhabited_area: 1 = ALL signals indicate uninhabited + - dq_is_suspect_location: 1 = ANY signal indicates uninhabited + """ + logger = get_context_with_fallback_logger(context) + logger.info("Running uninhabited area check...") + + null_cols = [ + "dq_is_in_uninhabited_area", + "dq_is_suspect_location", + ] + + try: + pdf = _spark_to_pandas_coords(df) + valid_mask = _get_valid_coords_mask(pdf) + pdf_valid = pdf[valid_mask].copy() + + if pdf_valid.empty: + logger.warning("No valid coordinates found for uninhabited area check") + for c in null_cols: + df = df.withColumn(c, f.lit(None).cast("int")) + return df + + data_store = _get_data_store() + view = PoiViewGenerator( + points=pdf_valid, + poi_id_column="school_id_giga", + data_store=data_store, + ) + + logger.info("Mapping Google Open Buildings...") + view.map_google_buildings() + logger.info("Mapping Microsoft Open Buildings...") + view.map_ms_buildings() + logger.info("Mapping built surface area (GHSL GHS_BUILT_S)...") + view.map_built_s(map_radius_meters=BUILT_SURFACE_BUFFER_M) + + view_df = view.view + view_indexed = view_df.set_index("poi_id") + + result_pdf = pdf.copy() + for c in null_cols: + result_pdf[c] = None + + for idx in result_pdf.index: + sid = result_pdf.at[idx, "school_id_giga"] + if sid not in view_indexed.index: + continue + + row = view_indexed.loc[sid] + conditions = [] + + if "nearest_google_building_distance" in view_indexed.columns and pd.notna( + row.get("nearest_google_building_distance") + ): + conditions.append( + row["nearest_google_building_distance"] + > UNINHABITED_DISTANCE_THRESHOLD_M + ) + if "nearest_ms_building_distance" in view_indexed.columns and pd.notna( + row.get("nearest_ms_building_distance") + ): + conditions.append( + row["nearest_ms_building_distance"] + > UNINHABITED_DISTANCE_THRESHOLD_M + ) + if "built_surface_m2" in view_indexed.columns and pd.notna( + row.get("built_surface_m2") + ): + conditions.append(row["built_surface_m2"] < BUILT_SURFACE_THRESHOLD_M2) + + if conditions: + result_pdf.at[idx, "dq_is_in_uninhabited_area"] = ( + 1 if all(conditions) else 0 + ) + result_pdf.at[idx, "dq_is_suspect_location"] = ( + 1 if any(conditions) else 0 + ) + + df = _join_pandas_result_to_spark(df, result_pdf, null_cols) + + except Exception as e: + logger.error(f"Uninhabited area check failed: {e}") + for c in null_cols: + df = df.withColumn(c, f.lit(None).cast("int")) + + for c in null_cols: + df = _null_guard_int(df, c) + + return df + + +def _is_complete_graph(G: nx.Graph) -> bool: + """Check if graph is complete (all nodes connected to each other).""" + n = len(G.nodes) + m = len(G.edges) + required_edges = n * (n - 1) // 2 + return m == required_edges + + +def _partition_graph_by_max_cliques(G: nx.Graph) -> list: + """Partition graph into maximal cliques for duplicate grouping.""" + + def total_clique_weight(G, clique): + return sum( + G[u][v].get("weight", 1) + for u in clique + for v in clique + if u < v and G.has_edge(u, v) + ) + + G2 = G.copy() + cliques = [] + while len(G2.nodes) > 0: + all_cliques = list(maximal_cliques(G2)) + max_size = max(len(c) for c in all_cliques) + largest_cliques = [c for c in all_cliques if len(c) == max_size] + chosen_clique = min(largest_cliques, key=lambda c: total_clique_weight(G2, c)) + cliques.append(chosen_clique) + G2.remove_nodes_from(chosen_clique) + return cliques + + +def proximity_duplicate_check( # noqa + df: sql.DataFrame, + context: OpExecutionContext = None, +) -> sql.DataFrame: + """Check if schools have potential duplicates within a proximity threshold + + Adds columns: + - dq_duplicate_group_flag_50m: 1 = has nearby duplicate, 0 = no nearby duplicate + - dq_duplicate_group_id_50m: integer cluster ID (schools in the same cluster share an ID) + - dq_duplicate_group_count_50m: number of direct neighbors within threshold + """ + logger = get_context_with_fallback_logger(context) + logger.info( + "Running proximity duplicate check (50m, build_distance_graph + clique partitioning)..." + ) + + dup_cols = [ + "dq_duplicate_group_flag_50m", + "dq_duplicate_group_id_50m", + "dq_duplicate_group_count_50m", + ] + + pdf = _spark_to_pandas_coords(df) + valid_mask = _get_valid_coords_mask(pdf) + pdf_valid = pdf[valid_mask].copy() + + if pdf_valid.empty or len(pdf_valid) < 2: + logger.warning("Not enough valid coordinates for proximity duplicate check") + for c in dup_cols: + df = df.withColumn(c, f.lit(None).cast("int")) + return df + + try: + # Convert to GeoDataFrame indexed by school_id_giga + gdf = gpd.GeoDataFrame( + pdf_valid.set_index("school_id_giga"), + geometry=gpd.points_from_xy(pdf_valid["longitude"], pdf_valid["latitude"]), + crs="EPSG:4326", + ) + + # Build distance graph using giga-spatial (geodesic distance) + G = build_distance_graph(gdf, gdf, PROXIMITY_DUPLICATE_THRESHOLD_M) + + # Find connected components and partition with cliques + connected_components = [ + G.subgraph(comp).copy() for comp in nx.connected_components(G) + ] + + group_id = 0 + duplicate_map = {} + + for cc in connected_components: + if len(cc) > 1: + if _is_complete_graph(cc): + for node in cc.nodes(): + duplicate_map[node] = group_id + group_id += 1 + else: + cliques = _partition_graph_by_max_cliques(cc) + for clique in cliques: + if len(clique) > 1: + for node in clique: + duplicate_map[node] = group_id + group_id += 1 + + # Graph degree = count of direct neighbors within threshold + degree_dict = dict(G.degree()) + + # Build result + result_pdf = pdf.copy() + for c in dup_cols: + result_pdf[c] = None + + for idx in result_pdf.index: + sid = result_pdf.at[idx, "school_id_giga"] + if sid in duplicate_map: + result_pdf.at[idx, "dq_duplicate_group_flag_50m"] = 1 + result_pdf.at[idx, "dq_duplicate_group_id_50m"] = duplicate_map[sid] + elif sid in degree_dict: + result_pdf.at[idx, "dq_duplicate_group_flag_50m"] = 0 + + if sid in degree_dict: + result_pdf.at[idx, "dq_duplicate_group_count_50m"] = degree_dict[sid] + + df = _join_pandas_result_to_spark(df, result_pdf, dup_cols) + + num_flagged = len(duplicate_map) + num_groups = len(set(duplicate_map.values())) + logger.info( + f"Duplicate check complete: {num_flagged} schools in {num_groups} groups" + ) + + except Exception as e: + logger.error(f"Proximity duplicate check failed: {e}") + for c in dup_cols: + df = df.withColumn(c, f.lit(None).cast("int")) + + for c in dup_cols: + df = _null_guard_int(df, c) + + return df + + +def smod_classification( + df: sql.DataFrame, + country_code_iso3: str, + context: OpExecutionContext = None, +) -> sql.DataFrame: + """Classify schools as urban/rural using GHSL Settlement Model (SMOD) data + via giga-spatial. + + Adds columns: + - rurban_detected: ("Urban" or "Rural") + """ + logger = get_context_with_fallback_logger(context) + logger.info("Running SMOD urban/rural classification...") + + smod_cols_str = ["rurban_detected"] + + try: + pdf = _spark_to_pandas_coords(df) + valid_mask = _get_valid_coords_mask(pdf) + pdf_valid = pdf[valid_mask].copy() + + if pdf_valid.empty: + logger.warning("No valid coordinates found for SMOD classification") + for c in smod_cols_str: + df = df.withColumn(c, f.lit(None).cast("string")) + return df + + data_store = _get_data_store() + view = PoiViewGenerator( + points=pdf_valid, + poi_id_column="school_id_giga", + data_store=data_store, + ) + result = view.map_smod(output_column="smod_class") + + if "smod_class" not in result.columns: + logger.warning("No SMOD data available") + for c in smod_cols_str: + df = df.withColumn(c, f.lit(None).cast("string")) + return df + + # Map SMOD numeric classes to human-readable labels and urban/rural + result_pdf = pdf.copy() + result_pdf["rurban_detected"] = None + + smod_map = result.set_index("poi_id")["smod_class"].to_dict() + for idx in result_pdf.index: + sid = result_pdf.at[idx, "school_id_giga"] + if sid in smod_map and pd.notna(smod_map[sid]): + smod_val = int(smod_map[sid]) + result_pdf.at[idx, "rurban_detected"] = ( + "Urban" if smod_val in SMOD_URBAN_CLASSES else "Rural" + ) + + df = _join_pandas_result_to_spark(df, result_pdf, smod_cols_str) + + except Exception as e: + logger.error(f"SMOD classification failed: {e}") + for c in smod_cols_str: + df = df.withColumn(c, f.lit(None).cast("string")) + + for c in smod_cols_str: + df = _null_guard_string(df, c) + + return df + + +def population_context_check( # noqa + df: sql.DataFrame, + country_code_iso3: str, + context: OpExecutionContext = None, +) -> sql.DataFrame: + """Check and add population counts at multiple radii using WorldPop data + Updates/adds columns: pop_within_1km, pop_within_2km, pop_within_3km, pop_within_5km, pop_within_10km + """ + logger = get_context_with_fallback_logger(context) + logger.info("Running population context check...") + + try: + pdf = _spark_to_pandas_coords(df) + valid_mask = _get_valid_coords_mask(pdf) + pdf_valid = pdf[valid_mask].copy() + + if pdf_valid.empty: + logger.warning("No valid coordinates found for population check") + for col_name in POPULATION_RADII_M: + if col_name not in df.columns: + df = df.withColumn(col_name, f.lit(None).cast("long")) + return df + + data_store = _get_data_store() + view = PoiViewGenerator( + points=pdf_valid, + poi_id_column="school_id_giga", + data_store=data_store, + ) + + for col_name, radius_m in POPULATION_RADII_M.items(): + logger.info(f"Computing {col_name} (radius={radius_m}m)...") + try: + view.map_wp_pop( + country=country_code_iso3, + map_radius_meters=radius_m, + output_column=col_name, + ) + except Exception as e: + logger.error(f"Population check failed for {col_name}: {e}") + + # Extract results from view + view_df = view.view + view_indexed = view_df.set_index("poi_id") + pop_columns = list(POPULATION_RADII_M.keys()) + + result_pdf = pdf.copy() + for col_name in pop_columns: + result_pdf[col_name] = None + if col_name in view_indexed.columns: + pop_map = view_indexed[col_name].to_dict() + for idx in result_pdf.index: + sid = result_pdf.at[idx, "school_id_giga"] + if sid in pop_map and pd.notna(pop_map[sid]): + result_pdf.at[idx, col_name] = int(pop_map[sid]) + + # Drop existing population columns from Spark DF before joining + existing_pop_cols = [c for c in pop_columns if c in df.columns] + if existing_pop_cols: + df = df.drop(*existing_pop_cols) + + df = _join_pandas_result_to_spark(df, result_pdf, pop_columns) + + for col_name in pop_columns: + df = df.withColumn(col_name, f.col(col_name).cast("long")) + + except Exception as e: + logger.error(f"Population context check failed: {e}") + for col_name in POPULATION_RADII_M: + if col_name not in df.columns: + df = df.withColumn(col_name, f.lit(None).cast("long")) + + # Ensure NULL for invalid coordinates + for col_name in POPULATION_RADII_M: + if col_name in df.columns: + df = df.withColumn( + col_name, + f.when( + f.col("latitude").isNull() + | f.isnan(f.col("latitude")) + | f.col("longitude").isNull() + | f.isnan(f.col("longitude")), + f.lit(None).cast("long"), + ).otherwise(f.col(col_name)), + ) + + return df + + +def surrounding_schools_check( + df: sql.DataFrame, + context: OpExecutionContext = None, +) -> sql.DataFrame: + """Count schools within various radii using giga-spatial's build_distance_graph. + Adds columns: + - schools_within_1km, schools_within_2km, schools_within_3km, schools_within_5km, schools_within_10km + """ + logger = get_context_with_fallback_logger(context) + logger.info("Running surrounding schools count...") + + col_names = [ + f"schools_within_{int(r / 1000)}km" for r in SURROUNDING_SCHOOLS_RADII_M + ] + + pdf = _spark_to_pandas_coords(df) + valid_mask = _get_valid_coords_mask(pdf) + pdf_valid = pdf[valid_mask].copy() + + if pdf_valid.empty or len(pdf_valid) < 2: + logger.warning("Not enough valid coordinates for surrounding schools check") + for c in col_names: + df = df.withColumn(c, f.lit(None).cast("int")) + return df + + try: + gdf = gpd.GeoDataFrame( + pdf_valid.set_index("school_id_giga"), + geometry=gpd.points_from_xy(pdf_valid["longitude"], pdf_valid["latitude"]), + crs="EPSG:4326", + ) + + result_pdf = pdf.copy() + + for col_name, radius in zip( + col_names, SURROUNDING_SCHOOLS_RADII_M, strict=False + ): + logger.info(f"Computing {col_name} (radius={radius}m)...") + G = build_distance_graph(gdf, gdf, radius) + neighbor_counts = {node: len(list(G.neighbors(node))) for node in G.nodes} + result_pdf[col_name] = result_pdf["school_id_giga"].map(neighbor_counts) + + df = _join_pandas_result_to_spark(df, result_pdf, col_names) + + except Exception as e: + logger.error(f"Surrounding schools check failed: {e}") + for c in col_names: + df = df.withColumn(c, f.lit(None).cast("int")) + + for c in col_names: + df = _null_guard_int(df, c) + + return df + + +def run_geospatial_checks( + df: sql.DataFrame, + country_code_iso3: str, + context: OpExecutionContext = None, +) -> sql.DataFrame: + """Orchestrate all geospatial checks in the correct order. + Single entry point that runs all geospatial DQ checks: + 1. Uninhabited area + suspect flag (buildings + built surface) + 2. Proximity duplicate detection (50m graph clustering + clique partitioning) + 3. SMOD urban/rural classification + 4. Population context (multi-radius WorldPop) + 5. Surrounding schools count (multi-radius) + Returns: + Spark DataFrame enriched with all geospatial DQ columns. + """ + logger = get_context_with_fallback_logger(context) + logger.info(f"Starting geospatial checks for country={country_code_iso3}...") + logger.info(f"GEOSPATIAL_DATA_DIR={settings.GEOSPATIAL_DATA_DIR}") + + initial_count = df.count() + logger.info(f"Input rows: {initial_count}") + + # 1. Uninhabited area + suspect flag + df = uninhabited_area_check(df, country_code_iso3, context) + + # 2. Proximity duplicate detection + df = proximity_duplicate_check(df, context) + + # 3. SMOD classification + df = smod_classification(df, country_code_iso3, context) + + # 4. Population context + df = population_context_check(df, country_code_iso3, context) + + # 5. Surrounding schools count + df = surrounding_schools_check(df, context) + + final_count = df.count() + logger.info(f"Geospatial checks complete. Rows: {initial_count} -> {final_count}") + return df diff --git a/dagster/src/data_quality_checks/utils.py b/dagster/src/data_quality_checks/utils.py index 0522eae17..86947afb8 100644 --- a/dagster/src/data_quality_checks/utils.py +++ b/dagster/src/data_quality_checks/utils.py @@ -1,4 +1,5 @@ from datetime import UTC, datetime +from typing import Any import pandas as pd from jinja2 import BaseLoader, Environment @@ -23,6 +24,7 @@ update_checks, ) from src.data_quality_checks.critical import critical_error_checks +from src.data_quality_checks.dq_context import DQContext, DQMode from src.data_quality_checks.duplicates import ( duplicate_all_except_checks, duplicate_set_checks, @@ -33,6 +35,9 @@ school_density_check, similar_name_level_within_110_check, ) +from src.data_quality_checks.geospatial import ( + run_geospatial_checks, +) from src.data_quality_checks.precision import precision_check from src.data_quality_checks.standard import standard_checks from src.settings import settings @@ -204,7 +209,7 @@ def aggregate_report_json( return transformed_data -def aggregate_report_statistics(df: sql.DataFrame, upload_details: dict): +def aggregate_report_statistics(df: sql.DataFrame, upload_details: dict): # noqa: C901 df = _normalize_dq_results_map(df) # dq_results is now a map; access specific keys via element_at(). @@ -268,6 +273,16 @@ def _check(key): "dq_is_null_connectivity_type_when_connectivity_govt", ] + # Add geospatial columns if they exist in the DataFrame + geospatial_dq_columns = [ + "dq_is_in_uninhabited_area", + "dq_is_suspect_location", + "dq_duplicate_group_flag_50m", + ] + for col_name in geospatial_dq_columns: + if col_name in df.columns: + dq_report_columns.append(col_name) + dq_duplicate_columns = [ col for col in dq_report_columns if col.startswith("dq_duplicate") ] @@ -432,6 +447,28 @@ def _check(key): ], } + # Geospatial check stats (added conditionally if columns exist) + if "is_in_uninhabited_area" in columns_in_dataset: + uninhabited_count = agg_df_pd.at["is_in_uninhabited_area", "count_schools"] + stats["count_uninhabited_area"] = uninhabited_count + stats["percent_uninhabited_area"] = round( + 100 * uninhabited_count / count_schools_raw_file, 2 + ) + + if "is_suspect_location" in columns_in_dataset: + suspect_count = agg_df_pd.at["is_suspect_location", "count_schools"] + stats["count_suspect_location"] = suspect_count + stats["percent_suspect_location"] = round( + 100 * suspect_count / count_schools_raw_file, 2 + ) + + if "duplicate_group_flag_50m" in columns_in_dataset: + dup_50m_count = agg_df_pd.at["duplicate_group_flag_50m", "count_schools"] + stats["count_duplicate_proximity_50m"] = dup_50m_count + stats["percent_duplicate_proximity_50m"] = round( + 100 * dup_50m_count / count_schools_raw_file, 2 + ) + def add_null_count_and_pct(dq_column_name): col_base_name = dq_column_name.split("-")[-1] counts_name = f"count_null_{col_base_name}" @@ -470,6 +507,7 @@ def add_column_counts_summary(column): "water_availability", "school_area_type", "school_funding_type", + "rurban_detected", ] for column in cols_for_counts_summary: @@ -630,101 +668,206 @@ def dq_geolocation_extract_relevant_columns( return df, human_readable_mappings -def row_level_checks( +def run_master_checks( df: sql.DataFrame, - dataset_type: str, - _country_code_iso3: str, + dq_context: DQContext, + context: OpExecutionContext = None, +) -> sql.DataFrame: + df = is_not_within_country(df, dq_context.country_code_iso3, context) + df = similar_name_level_within_110_check(df, context) + df = school_density_check(df, context) + df = standard_checks(df, dq_context.dataset_type, context) + df = duplicate_all_except_checks( + df, + CONFIG_COLUMNS_EXCEPT_SCHOOL_ID[dq_context.dataset_type], + context, + ) + df = precision_check(df, config.PRECISION, context) + df = duplicate_set_checks(df, config.UNIQUE_SET_COLUMNS, context) + df = duplicate_name_level_110_check(df, context) + df = run_geospatial_checks(df, dq_context.country_code_iso3, context) + df = column_relation_checks(df, dq_context.dataset_type, context) + df = critical_error_checks( + df, + dq_context.dataset_type, + CONFIG_NONEMPTY_COLUMNS[dq_context.dataset_type], + context, + ) + return df + + +def run_geolocation_checks( + df: sql.DataFrame, + dq_context: DQContext, silver: sql.DataFrame = None, - mode=None, context: OpExecutionContext = None, ) -> sql.DataFrame: - logger = get_context_with_fallback_logger(context) - logger.info("Starting row level checks...") - - if dataset_type == "master": - df = is_not_within_country(df, _country_code_iso3, context) - df = similar_name_level_within_110_check(df, context) - df = school_density_check(df, context) - df = standard_checks(df, dataset_type, context) - df = duplicate_all_except_checks( - df, - CONFIG_COLUMNS_EXCEPT_SCHOOL_ID[dataset_type], - context, - ) - df = precision_check(df, config.PRECISION, context) - df = duplicate_set_checks(df, config.UNIQUE_SET_COLUMNS, context) - df = duplicate_name_level_110_check(df, context) - df = column_relation_checks(df, dataset_type, context) - df = critical_error_checks( - df, - dataset_type, - CONFIG_NONEMPTY_COLUMNS[dataset_type], - context, - ) - elif dataset_type == "geolocation": - if mode == UploadMode.CREATE.value: + if dq_context.dq_mode == DQMode.MASTER: + if dq_context.upload_mode == UploadMode.CREATE.value: df = create_checks(bronze=df, silver=silver, context=context) - elif mode == UploadMode.UPDATE.value: + elif dq_context.upload_mode == UploadMode.UPDATE.value: df = update_checks(bronze=df, silver=silver, context=context) + else: + # For assessment-only (uploaded mode), skip cross-checks against silver + # but ensure the columns exist to avoid downstream errors. + if dq_context.upload_mode == UploadMode.CREATE.value: + df = df.withColumn("dq_is_not_create", f.lit(0)) + elif dq_context.upload_mode == UploadMode.UPDATE.value: + df = df.withColumn("dq_is_not_update", f.lit(0)) + + df = is_not_within_country(df, dq_context.country_code_iso3, context) + df = similar_name_level_within_110_check(df, context) + df = run_geospatial_checks(df, dq_context.country_code_iso3, context) + df = school_density_check(df, context) + df = standard_checks(df, dq_context.dataset_type, context) + df = duplicate_all_except_checks( + df, + CONFIG_COLUMNS_EXCEPT_SCHOOL_ID[dq_context.dataset_type], + context, + ) + df = precision_check(df, config.PRECISION, context) + df = duplicate_set_checks(df, config.UNIQUE_SET_COLUMNS, context) + df = duplicate_name_level_110_check(df, context) + df = critical_error_checks( + df, + dq_context.dataset_type, + CONFIG_NONEMPTY_COLUMNS[dq_context.dataset_type], + dq_context.upload_mode, + context, + ) + df = column_relation_checks(df, dq_context.dataset_type, context) + return df - df = is_not_within_country(df, _country_code_iso3, context) - df = similar_name_level_within_110_check(df, context) - df = school_density_check(df, context) - df = standard_checks(df, dataset_type, context) - df = duplicate_all_except_checks( - df, - CONFIG_COLUMNS_EXCEPT_SCHOOL_ID[dataset_type], - context, - ) - df = precision_check(df, config.PRECISION, context) - df = duplicate_set_checks(df, config.UNIQUE_SET_COLUMNS, context) - df = duplicate_name_level_110_check(df, context) - df = critical_error_checks( - df, - dataset_type, - CONFIG_NONEMPTY_COLUMNS[dataset_type], - mode, - context, - ) - df = column_relation_checks(df, dataset_type, context) - elif dataset_type == "reference": - df = standard_checks(df, dataset_type, context) - df = critical_error_checks( - df, - dataset_type, - CONFIG_NONEMPTY_COLUMNS[dataset_type], - context, - ) - elif dataset_type in ["coverage", "coverage_itu"]: - df = standard_checks(df, dataset_type, context) - df = column_relation_checks(df, dataset_type, context) - df = critical_error_checks( - df, - dataset_type, - CONFIG_NONEMPTY_COLUMNS[dataset_type], - context, - ) - elif dataset_type == "coverage_fb": - df = standard_checks(df, dataset_type, context, domain=False, range_=False) - df = fb_percent_sum_to_100_check(df, context) - df = column_relation_checks(df, dataset_type, context) - df = critical_error_checks( - df, - dataset_type, - CONFIG_NONEMPTY_COLUMNS[dataset_type], - context, - ) - elif dataset_type == "qos": - df = standard_checks(df, dataset_type, context, domain=False, range_=False) - df = critical_error_checks( - df, - dataset_type, - CONFIG_NONEMPTY_COLUMNS[dataset_type], - context, - ) + +def run_reference_checks( + df: sql.DataFrame, + dq_context: DQContext, + context: OpExecutionContext = None, +) -> sql.DataFrame: + df = standard_checks(df, dq_context.dataset_type, context) + df = critical_error_checks( + df, + dq_context.dataset_type, + CONFIG_NONEMPTY_COLUMNS[dq_context.dataset_type], + context, + ) return df +def run_coverage_checks( + df: sql.DataFrame, + dq_context: DQContext, + context: OpExecutionContext = None, +) -> sql.DataFrame: + df = standard_checks(df, dq_context.dataset_type, context) + df = column_relation_checks(df, dq_context.dataset_type, context) + df = critical_error_checks( + df, + dq_context.dataset_type, + CONFIG_NONEMPTY_COLUMNS[dq_context.dataset_type], + context, + ) + return df + + +def run_coverage_fb_checks( + df: sql.DataFrame, + dq_context: DQContext, + context: OpExecutionContext = None, +) -> sql.DataFrame: + df = standard_checks( + df, dq_context.dataset_type, context, domain=False, range_=False + ) + df = fb_percent_sum_to_100_check(df, context) + df = column_relation_checks(df, dq_context.dataset_type, context) + df = critical_error_checks( + df, + dq_context.dataset_type, + CONFIG_NONEMPTY_COLUMNS[dq_context.dataset_type], + context, + ) + return df + + +def run_qos_checks( + df: sql.DataFrame, + dq_context: DQContext, + context: OpExecutionContext = None, +) -> sql.DataFrame: + df = standard_checks( + df, dq_context.dataset_type, context, domain=False, range_=False + ) + df = critical_error_checks( + df, + dq_context.dataset_type, + CONFIG_NONEMPTY_COLUMNS[dq_context.dataset_type], + context, + ) + return df + + +def row_level_checks_internal( + df: sql.DataFrame, + dq_context: DQContext, + silver: sql.DataFrame = None, + context: OpExecutionContext = None, +) -> sql.DataFrame: + logger = get_context_with_fallback_logger(context) + logger.info( + "Starting row level checks", + extra={ + "dq_mode": dq_context.mode.value, + "dataset_type": dq_context.dataset_type, + "country": dq_context.country_code_iso3, + "upload_mode": dq_context.upload_mode, + }, + ) + + if dq_context.dataset_type == "master": + df = run_master_checks(df, dq_context, context) + elif dq_context.dataset_type == "geolocation": + df = run_geolocation_checks(df, dq_context, silver, context) + elif dq_context.dataset_type == "reference": + df = run_reference_checks(df, dq_context, context) + elif dq_context.dataset_type in ["coverage", "coverage_itu"]: + df = run_coverage_checks(df, dq_context, context) + elif dq_context.dataset_type == "coverage_fb": + df = run_coverage_fb_checks(df, dq_context, context) + elif dq_context.dataset_type == "qos": + df = run_qos_checks(df, dq_context, context) + + return df + + +def row_level_checks( + df: sql.DataFrame, + dq_context: Any = None, + _country_code_iso3: str = None, + silver: sql.DataFrame = None, + mode: str = None, + context: OpExecutionContext = None, + dataset_type: str = None, +) -> sql.DataFrame: + # Resolve which signature is being used + if isinstance(dq_context, DQContext): + # Modern signature: row_level_checks(df, dq_context=DQContext(...), ...) + return row_level_checks_internal(df, dq_context, silver, context) + else: + # Legacy signature: row_level_checks(df, dataset_type, country_code, ...) + if dq_context is not None and dataset_type is None: + dataset_type = dq_context # Positional dataset_type + + # Build a temporary DQContext for internal processing + + internal_context = DQContext( + dq_mode=DQMode.MASTER, # Legacy calls default to MASTER + dataset_type=dataset_type, + country_code_iso3=_country_code_iso3, + upload_mode=mode, + ) + return row_level_checks_internal(df, internal_context, silver, context) + + def extract_school_id_govt_duplicates(df: sql.DataFrame): window = w.Window.partitionBy("school_id_govt").orderBy(f.lit(1)) diff --git a/dagster/src/hooks/school_master.py b/dagster/src/hooks/school_master.py index fa1cb74c0..236fd3218 100644 --- a/dagster/src/hooks/school_master.py +++ b/dagster/src/hooks/school_master.py @@ -1,9 +1,16 @@ +import requests from models.file_upload import DQStatusEnum, FileUpload -from sqlalchemy import update +from sqlalchemy import select, update from sqlalchemy.orm import Session from dagster import HookContext, failure_hook, success_hook +from src.settings import settings +from src.utils.adls import ADLSFileClient from src.utils.db.primary import get_db_context +from src.utils.nocodb.get_nocodb_data import ( + create_nocodb_table_record, + get_nocodb_table_id_from_name, +) from src.utils.op_config import FileConfig @@ -29,6 +36,19 @@ def school_dq_checks_location_db_update_hook(context: HookContext): ) db.commit() + # Write to NoCoDB for GigaMeter registrations + file_upload = db.scalar( + select(FileUpload).where(FileUpload.id == config.filename_components.id) + ) + + if file_upload and file_upload.source == "gigameter": + school_id_giga = file_upload.column_to_schema_mapping.get("school_id_giga") + if school_id_giga: + context.log.info( + f"DQ checks passed for GigaMeter registration, writing to NoCoDB: {school_id_giga}" + ) + write_to_nocodb(context, file_upload) + context.log.info("Database update hook OK") @@ -73,3 +93,94 @@ def school_ingest_error_db_update_hook(context: HookContext): .where(FileUpload.id == config.filename_components.id) .values({FileUpload.dq_status: DQStatusEnum.ERROR}) ) + + # Call GigaMeter soft-delete for failed registrations + file_upload = db.scalar( + select(FileUpload).where(FileUpload.id == config.filename_components.id) + ) + + if file_upload and file_upload.source == "gigameter": + school_id_giga = file_upload.column_to_schema_mapping.get("school_id_giga") + if school_id_giga: + # Get failure reason from context + failure_reason = f"DQ check failed at step: {context.step_key}" + if hasattr(context, "op_exception") and context.op_exception: + failure_reason = ( + f"{failure_reason} - Error: {str(context.op_exception)}" + ) + + context.log.info( + f"Calling GigaMeter soft-delete for school_id_giga={school_id_giga}" + ) + call_gigameter_soft_delete(context, school_id_giga, failure_reason) + + +def write_to_nocodb(context: HookContext, file_upload: FileUpload) -> None: + """Write school registration to NoCoDB.""" + if not settings.NOCODB_BASE_URL or not settings.NOCODB_TOKEN: + context.log.warning( + "NOCODB_BASE_URL or NOCODB_TOKEN not configured. Skipping NoCoDB write." + ) + return + + try: + if not file_upload.metadata_json_path: + raise ValueError( + f"No metadata_json_path found for FileUpload {file_upload.id}" + ) + + adls_client = ADLSFileClient() + metadata_payload = adls_client.download_json(file_upload.metadata_json_path) + + giga_id_school = metadata_payload.get("giga_id_school") + # Get the NoCoDB table ID for school registrations + table_id = get_nocodb_table_id_from_name("SchoolRegistrations") + + record_data = { + "giga_id_school": giga_id_school, + "school_id": metadata_payload.get("school_id"), + "school_name": metadata_payload.get("school_name", ""), + "latitude": metadata_payload.get("latitude", ""), + "longitude": metadata_payload.get("longitude", ""), + "country_iso3_code": file_upload.country, + "education_level": metadata_payload.get("education_level", ""), + "contact_name": metadata_payload.get("contact_name", ""), + "contact_email": metadata_payload.get("contact_email", ""), + "verification_status": "unverified", + } + + create_nocodb_table_record(table_id, record_data) + context.log.info(f"NoCoDB write successful for giga_id_school={giga_id_school}") + except Exception as exc: + context.log.error(f"NoCoDB write failed: {exc}") + + +def call_gigameter_soft_delete( + context: HookContext, school_id_giga: str, failure_reason: str = None +) -> None: + """Call GigaMeter soft-delete API for a failed school registration.""" + if not settings.GIGAMETER_API_BASE_URL or not settings.GIGAMETER_API_TOKEN: + context.log.warning( + "GIGAMETER_API_BASE_URL or GIGAMETER_API_TOKEN not configured. " + f"Skipping soft-delete for school_id_giga={school_id_giga}" + ) + return + + url = f"{settings.GIGAMETER_API_BASE_URL}/api/v1/school-registrations/rejection" + headers = { + "Authorization": f"Bearer {settings.GIGAMETER_API_TOKEN}", + "Content-Type": "application/json", + } + payload = { + "giga_id_school": school_id_giga, + "is_deleted": True, + "rejection_reason": failure_reason or "DQ validation failed", + } + + try: + response = requests.put(url, headers=headers, json=payload, timeout=10) + return response.json() + except requests.RequestException as exc: + context.log.error( + f"GigaMeter soft-delete failed for school_id_giga={school_id_giga}: {exc}" + ) diff --git a/dagster/src/internal/common_assets/master_release_notes.py b/dagster/src/internal/common_assets/master_release_notes.py index fa63929e3..ce0a7ed1f 100644 --- a/dagster/src/internal/common_assets/master_release_notes.py +++ b/dagster/src/internal/common_assets/master_release_notes.py @@ -120,7 +120,7 @@ async def send_master_release_notes( await send_slack_master_release_notification(props=slack_props) return { - **props.dict(), + **props.model_dump(), "recipients": recipients, } diff --git a/dagster/src/internal/common_assets/staging.py b/dagster/src/internal/common_assets/staging.py index 49c9dc9fa..6588f6d2d 100644 --- a/dagster/src/internal/common_assets/staging.py +++ b/dagster/src/internal/common_assets/staging.py @@ -13,6 +13,7 @@ LongType, StringType, StructField, + StructType, TimestampType, ) from sqlalchemy import select, update @@ -28,6 +29,8 @@ check_table_exists, create_delta_table, create_schema, + persist_column_id_map, + sync_schema, ) from src.utils.op_config import FileConfig from src.utils.schema import ( @@ -290,6 +293,17 @@ def _write_pending_records(self, pending: sql.DataFrame) -> None: partition_by=["upload_id"], ) else: + # Synchronise staging schema (handles renames/deletions) + existing_schema = self.spark.table(self.staging_table_name).schema + sync_schema( + table_name=self.staging_table_name, + existing_schema=existing_schema, + updated_schema=StructType(pending_schema), + spark=self.spark, + context=self.context, + schema_name=self.schema_name, + ) + upload_id = self.config.filename_components.id DeltaTable.forName(self.spark, self.staging_table_name).delete( f.col("upload_id") == upload_id @@ -315,6 +329,10 @@ def _write_pending_records(self, pending: sql.DataFrame) -> None: .saveAsTable(self.staging_table_name) ) + # Persist column-ID mapping after staging data is written + + persist_column_id_map(self.spark, self.staging_table_name, self.schema_name) + def _update_approval_request_status(self) -> None: """Enable the ApprovalRequest if any actionable (non-UNCHANGED) rows exist.""" actionable = ( diff --git a/dagster/src/resources/io_managers/adls_delta.py b/dagster/src/resources/io_managers/adls_delta.py index fe7f0687a..4c8e77972 100644 --- a/dagster/src/resources/io_managers/adls_delta.py +++ b/dagster/src/resources/io_managers/adls_delta.py @@ -1,7 +1,6 @@ from dagster_pyspark import PySparkResource from delta import DeltaTable from icecream import ic -from pydantic import AnyUrl from pyspark import sql from pyspark.sql import SparkSession from pyspark.sql.types import StructType @@ -12,7 +11,11 @@ from src.settings import settings from src.spark.transform_functions import add_missing_columns from src.utils.adls import ADLSFileClient -from src.utils.delta import build_deduped_merge_query, execute_query_with_error_handler +from src.utils.delta import ( + build_deduped_merge_query, + execute_query_with_error_handler, + persist_column_id_map, +) from src.utils.op_config import FileConfig from src.utils.schema import ( construct_full_table_name, @@ -96,7 +99,7 @@ def load_input(self, context: InputContext) -> sql.DataFrame: @staticmethod def _get_table_path( context: InputContext | OutputContext, - ) -> tuple[str, str, AnyUrl]: + ) -> tuple[str, str, str]: config = FileConfig(**context.step_context.op_config) table_name = config.table_name if config.table_name else config.country_code table_root_path = f"{settings.SPARK_WAREHOUSE_DIR}/{config.metastore_schema}.db" @@ -191,35 +194,33 @@ def _upsert_data( columns = incoming_schema.fields primary_key = "gigasync_id" else: + from src.utils.delta import sync_schema + columns = get_schema_columns(spark, schema_name) primary_key = get_primary_key(spark, schema_name) - updated_schema = StructType(columns) - updated_columns = sorted(updated_schema.fieldNames()) - - existing_df = DeltaTable.forName(spark, full_table_name).toDF() - existing_columns = sorted(existing_df.schema.fieldNames()) - - context.log.info(f"incoming schema {data.schema}") - context.log.info(f"existing schema {existing_df.schema}") - - if updated_columns != existing_columns: - context.log.info("Updating schema...") - - empty_data = spark.sparkContext.emptyRDD() - updated_schema_df = spark.createDataFrame( - data=empty_data, schema=updated_schema - ) + # Break the lazy lineage to avoid DELTA_SCHEMA_CHANGE_SINCE_ANALYSIS + # if sync_schema renames columns or changes types. + data = spark.createDataFrame(data.rdd, data.schema).cache() - ( - updated_schema_df.write.option("mergeSchema", "true") - .format("delta") - .mode("append") - .saveAsTable(full_table_name) - ) + updated_schema = StructType(columns) + spark.catalog.refreshTable(full_table_name) + existing_schema = DeltaTable.forName(spark, full_table_name).toDF().schema + + sync_schema( + table_name=full_table_name, + existing_schema=existing_schema, + updated_schema=updated_schema, + spark=spark, + context=context, + schema_name=schema_name, + ) update_columns = [c.name for c in columns if c.name != primary_key] + + spark.catalog.refreshTable(full_table_name) master = DeltaTable.forName(spark, full_table_name) + query = build_deduped_merge_query( master, data, @@ -233,9 +234,14 @@ def _upsert_data( if query is not None: query.execute() + # Persist column-ID mapping after merge succeeds + # This ensures mapping is only updated when data is successfully merged + if not is_qos: + persist_column_id_map(spark, full_table_name, schema_name) + def _overwrite_data( self, - data: sql.dataframe, + data: sql.DataFrame, schema_name: str, full_table_name: str, context: OutputContext = None, diff --git a/dagster/src/schemas/approval_request.py b/dagster/src/schemas/approval_request.py index 9ba56767f..157a35cd1 100644 --- a/dagster/src/schemas/approval_request.py +++ b/dagster/src/schemas/approval_request.py @@ -1,24 +1,23 @@ from datetime import datetime +from typing import Annotated -from pydantic import UUID4, BaseModel, Field, constr +from pydantic import UUID4, BaseModel, ConfigDict, Field, StringConstraints class ApprovalRequestAuditLogSchema(BaseModel): + model_config = ConfigDict(from_attributes=True) + approval_request_id: str approved_by_id: UUID4 approved_by_email: str approved_date: datetime - class Config: - orm_mode = True - class ApprovalRequestSchema(BaseModel): - country: constr(min_length=3, max_length=3) + model_config = ConfigDict(from_attributes=True) + + country: Annotated[str, StringConstraints(min_length=3, max_length=3)] dataset: str enabled: bool is_merge_processing: bool audit_logs: list[ApprovalRequestAuditLogSchema] = Field(default_factory=list) - - class Config: - orm_mode = True diff --git a/dagster/src/schemas/connectivity_rt.py b/dagster/src/schemas/connectivity_rt.py index f1eb3ef80..10587e76f 100644 --- a/dagster/src/schemas/connectivity_rt.py +++ b/dagster/src/schemas/connectivity_rt.py @@ -1,34 +1,31 @@ from datetime import datetime -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict class MlabSchools(BaseModel): + model_config = ConfigDict(from_attributes=True) + created: datetime school_id_govt: int source: str country_code: str - class Config: - orm_mode = True - class GigaMeterSchools(BaseModel): + model_config = ConfigDict(from_attributes=True) + created: datetime school_id_giga: str school_id_govt: int source: str - class Config: - orm_mode = True - class RTSchools(BaseModel): + model_config = ConfigDict(from_attributes=True) + school_id_giga: str school_id_govt: str realtime_date: datetime country_code: str country: str - - class Config: - orm_mode = True diff --git a/dagster/src/schemas/file_upload.py b/dagster/src/schemas/file_upload.py index b83eb9df8..8fc0570a0 100644 --- a/dagster/src/schemas/file_upload.py +++ b/dagster/src/schemas/file_upload.py @@ -1,39 +1,41 @@ import json from datetime import datetime -from pydantic import Field, validator +from pydantic import ConfigDict, Field, field_validator from dagster import Config class FileUploadConfig(Config): + model_config = ConfigDict(from_attributes=True) + id: str created: str uploader_id: str uploader_email: str - dq_report_path: str = Field(None) + dq_report_path: str | None = Field(None) country: str dataset: str - source: str = Field(None) + source: str | None = Field(None) original_filename: str column_to_schema_mapping: dict[str, str] column_license: dict[str, str] upload_path: str - class Config: - orm_mode = True - - @validator("created", pre=True) + @field_validator("created", mode="before") + @classmethod def parse_created(cls, v: datetime): return v.isoformat() - @validator("column_to_schema_mapping", pre=True) + @field_validator("column_to_schema_mapping", mode="before") + @classmethod def parse_column_to_schema_mapping(cls, v: str | dict): if isinstance(v, str): return json.loads(v) return v - @validator("column_license", pre=True) + @field_validator("column_license", mode="before") + @classmethod def parse_column_license(cls, v: str | dict): if isinstance(v, str): return json.loads(v) diff --git a/dagster/src/schemas/filename_components.py b/dagster/src/schemas/filename_components.py index cb3e709b2..a69777a2e 100644 --- a/dagster/src/schemas/filename_components.py +++ b/dagster/src/schemas/filename_components.py @@ -1,12 +1,15 @@ from datetime import datetime +from typing import Annotated -from pydantic import BaseModel, Field, constr +from pydantic import BaseModel, Field, StringConstraints class FilenameComponents(BaseModel): - id: str = Field(None) - country_code: constr(min_length=3, max_length=3, to_upper=True) - dataset_type: str = Field(None) - source: str = Field(None) - timestamp: datetime = Field(None) - rest: str = Field(None) + id: str | None = Field(None) + country_code: Annotated[ + str, StringConstraints(min_length=3, max_length=3, to_upper=True) + ] + dataset_type: str | None = Field(None) + source: str | None = Field(None) + timestamp: datetime | None = Field(None) + rest: str | None = Field(None) diff --git a/dagster/src/schemas/qos.py b/dagster/src/schemas/qos.py index 695a194d8..6c39091a5 100644 --- a/dagster/src/schemas/qos.py +++ b/dagster/src/schemas/qos.py @@ -6,11 +6,14 @@ RequestMethodEnum, SendQueryInEnum, ) +from pydantic import ConfigDict from dagster import Config class ApiConfiguration(Config): + model_config = ConfigDict(from_attributes=True) + id: str api_auth_api_key: str | None api_auth_api_value: str | None @@ -38,9 +41,6 @@ class ApiConfiguration(Config): school_id_key: str | None size: int | None - class Config: - orm_mode = True - class SchoolListConfig(ApiConfiguration): column_to_schema_mapping: dict[str, str] diff --git a/dagster/src/schemas/user.py b/dagster/src/schemas/user.py index 6fa207239..a6dc6d0eb 100644 --- a/dagster/src/schemas/user.py +++ b/dagster/src/schemas/user.py @@ -1,27 +1,27 @@ from typing import Literal -from pydantic import UUID4, BaseModel, EmailStr +from pydantic import UUID4, BaseModel, ConfigDict, EmailStr class GraphGroup(BaseModel): + model_config = ConfigDict(from_attributes=True) + id: UUID4 description: str | None display_name: str - class Config: - orm_mode = True - class GraphIdentity(BaseModel): + model_config = ConfigDict(from_attributes=True) + issuer: str issuer_assigned_id: str | None sign_in_type: str - class Config: - orm_mode = True - class GraphUser(BaseModel): + model_config = ConfigDict(from_attributes=True) + id: UUID4 account_enabled: bool | None given_name: str | None @@ -34,9 +34,6 @@ class GraphUser(BaseModel): other_mails: list[EmailStr] | None identities: list[GraphIdentity] | None - class Config: - orm_mode = True - class DatabaseUser(BaseModel): id: str diff --git a/dagster/src/sensors/qos.py b/dagster/src/sensors/qos.py index f72bfe44e..60e5086ff 100644 --- a/dagster/src/sensors/qos.py +++ b/dagster/src/sensors/qos.py @@ -118,7 +118,7 @@ def qos_school_list__new_apis_sensor(): domain=DATAHUB_DOMAIN, dq_target_filepath=f"{constants.bronze_folder}/{DOMAIN}/{DATASET_TYPE}/{country_code}/{stem}.csv", country_code=country_code, - database_data=row_data.json(), + database_data=row_data.model_dump_json(), ) run_key = f"{sanitized_api_name}_{sanitized_date}" @@ -238,7 +238,7 @@ def qos_school_connectivity__new_apis_sensor(): domain=DATAHUB_DOMAIN, dq_target_filepath=f"{constants.bronze_folder}/{DOMAIN}/{DATASET_TYPE}/{country_code}/{stem}.csv", country_code=country_code, - database_data=row_data.json(), + database_data=row_data.model_dump_json(), ) run_key = f"{sanitized_api_name}_{sanitized_date}" diff --git a/dagster/src/sensors/school_geolocation.py b/dagster/src/sensors/school_geolocation.py index ff075622b..c4e5531b5 100644 --- a/dagster/src/sensors/school_geolocation.py +++ b/dagster/src/sensors/school_geolocation.py @@ -136,9 +136,12 @@ def school_master_geolocation__raw_file_uploads_sensor( country_code=country_code, ) + last_modified = properties.last_modified.strftime("%Y%m%d-%H%M%S") + dq_triggered_at = metadata.get("dq_triggered_at", "") + context.log.info(f"FILE: {path}") yield RunRequest( - run_key=str(path), + run_key=f"{path}:{last_modified}:{dq_triggered_at}", run_config=RunConfig(ops=run_ops), tags={"country": country_code}, ) diff --git a/dagster/src/settings.py b/dagster/src/settings.py index 0ea900177..3e2316c99 100644 --- a/dagster/src/settings.py +++ b/dagster/src/settings.py @@ -4,7 +4,7 @@ from pathlib import Path from datahub.metadata.schema_classes import FabricTypeClass -from pydantic import BaseSettings, PostgresDsn +from pydantic_settings import BaseSettings, SettingsConfigDict class Environment(StrEnum): @@ -22,9 +22,7 @@ class DeploymentEnvironment(StrEnum): class Settings(BaseSettings): - class Config: - env_file = ".env" - extra = "ignore" + model_config = SettingsConfigDict(env_file=".env", extra="ignore") # Settings required to be in .env AZURE_SAS_TOKEN: str @@ -69,6 +67,8 @@ class Config: NOCODB_BASE_URL: str = "" NOCODB_TOKEN: str = "" NOCODB_NAME_MAPPINGS_TABLE_ID: str = "" + GIGAMETER_API_BASE_URL: str = "" + GIGAMETER_API_TOKEN: str = "" TRINO_CONNECTION_STRING: str = "" SLACK_WEBHOOK: str = "" MONGOLIA_API_USER: str = "" @@ -77,6 +77,9 @@ class Config: API_AUTOMATION_USER_ID: str = "305f7203-c97e-46bb-b2da-352379fa1c4e" API_AUTOMATION_EMAIL: str = "apiautomated@gigasync.org" + # GeoSpatial data directory for storing (Google/MS buildings, GHSL, WorldPop) + GEOSPATIAL_DATA_DIR: str = "/app" + # Derived settings @property def IN_PRODUCTION(self) -> bool: @@ -183,21 +186,17 @@ def INGESTION_DB_HOST(self) -> str: @property def INGESTION_DATABASE_CONNECTION_DICT(self) -> dict: return { - "user": self.INGESTION_POSTGRESQL_USERNAME, + "username": self.INGESTION_POSTGRESQL_USERNAME, "password": self.INGESTION_POSTGRESQL_PASSWORD, "host": self.INGESTION_DB_HOST, - "port": str(self.INGESTION_DB_PORT), + "port": self.INGESTION_DB_PORT, "path": f"/{self.INGESTION_POSTGRESQL_DATABASE}", } @property def INGESTION_DATABASE_URL(self) -> str: - return str( - PostgresDsn.build( - scheme="postgresql+psycopg2", - **self.INGESTION_DATABASE_CONNECTION_DICT, - ), - ) + c = self.INGESTION_DATABASE_CONNECTION_DICT + return f"postgresql+psycopg2://{c['username']}:{c['password']}@{c['host']}:{c['port']}{c['path']}" @lru_cache diff --git a/dagster/src/spark/config_expectations.py b/dagster/src/spark/config_expectations.py index 829541924..a7e904e0b 100644 --- a/dagster/src/spark/config_expectations.py +++ b/dagster/src/spark/config_expectations.py @@ -1,6 +1,6 @@ from datetime import date -from pydantic import BaseSettings +from pydantic_settings import BaseSettings class Config(BaseSettings): @@ -114,6 +114,21 @@ class Config(BaseSettings): "description": "Checks if the school entered is not yet in the system. If it is not yet in the system, it cannot be updated.", "type": "is_not_update", }, + { + "assertion": "is_in_uninhabited_area", + "description": "Checks if the school is in an uninhabited area (no buildings within 150m AND no built surface).", + "type": "geospatial_checks", + }, + { + "assertion": "is_suspect_location", + "description": "Checks if the school location is suspect (any signal: no buildings OR no built surface nearby).", + "type": "geospatial_checks", + }, + { + "assertion": "duplicate_group_flag_50m", + "description": "Checks if the school has a potential duplicate within 50m proximity.", + "type": "geospatial_checks", + }, ] DATA_TYPES: set[tuple[str, str]] = { ## @RENZ are we not pulling this from schema? @@ -136,6 +151,7 @@ class Config(BaseSettings): ("school_id_giga", "STRING"), ("school_id_govt", "STRING"), ("school_name", "STRING"), + ("official_school_name", "STRING"), ("school_establishment_year", "INT"), ("latitude", "DOUBLE"), ("longitude", "DOUBLE"), @@ -169,10 +185,12 @@ class Config(BaseSettings): ("connectivity_RT", "STRING"), ("connectivity_RT_datasource", "STRING"), ("connectivity_RT_ingestion_timestamp", "TIMESTAMP"), - ("school_id_giga", "STRING"), ("pop_within_10km", "LONG"), + ("pop_within_5km", "LONG"), ("nearest_school_distance", "DOUBLE"), + ("schools_within_5km", "INT"), ("schools_within_10km", "INT"), + ("rurban_detected", "STRING"), ("nearest_NR_id", "STRING"), ("nearest_LTE_id", "STRING"), ("nearest_UMTS_id", "STRING"), @@ -222,6 +240,7 @@ class Config(BaseSettings): "school_id_giga", "school_id_govt", "school_name", + "official_school_name", "longitude", "latitude", "education_level", @@ -315,6 +334,7 @@ def NONEMPTY_COLUMNS_ALL(self) -> list[str]: "water_availability": ["yes", "no"], "school_data_collection_modality": ["online", "in-person", "phone", "other"], "school_funding_type": ["public", "private", "charitable", "others"], + "rurban_detected": ["Urban", "Rural"], } VALUES_DOMAIN_REFERENCE: dict[str, list[str]] = { @@ -358,6 +378,7 @@ def NONEMPTY_COLUMNS_ALL(self) -> list[str]: "water_availability": ["yes", "no"], "school_data_collection_modality": ["online", "in-person", "phone", "other"], "school_funding_type": ["public", "private", "charitable", "others"], + "rurban_detected": ["Urban", "Rural"], } VALUES_DOMAIN_COVERAGE: dict[str, list[str]] = { @@ -365,7 +386,7 @@ def NONEMPTY_COLUMNS_ALL(self) -> list[str]: "cellular_coverage_type": ["2G", "3G", "4G", "5G", "no coverage"], } - VALUES_DOMAIN_COVERAGE_ITU: dict[str, list[str]] = { + VALUES_DOMAIN_COVERAGE_ITU: dict[str, list[int]] = { "2G": [1, 0], "3G": [1, 0], "4G": [1, 0], @@ -389,6 +410,10 @@ def VALUES_RANGE_MASTER(self) -> dict[str, dict[str, int]]: "schools_within_1km": {"min": 0, "max": 20}, "schools_within_2km": {"min": 0, "max": 40}, "schools_within_3km": {"min": 0, "max": 60}, + "schools_within_5km": {"min": 0, "max": 100}, + "schools_within_10km": {"min": 0, "max": 200}, + "pop_within_5km": {"min": 0, "max": 5000000}, + "pop_within_10km": {"min": 0, "max": 20000000}, "school_establishment_year": {"min": 1000, "max": self.current_year}, "latitude": {"min": -90, "max": 90}, "longitude": {"min": -180, "max": 180}, @@ -427,6 +452,8 @@ def VALUES_RANGE_GEOLOCATION(self) -> dict[str, dict[str, int]]: "num_latrines": {"min": 0, "max": 200}, "school_data_collection_year": {"min": 1000, "max": self.current_year}, "download_speed_govt": {"min": 1, "max": 200}, + "pop_within_5km": {"min": 0, "max": 5000000}, + "pop_within_10km": {"min": 0, "max": 20000000}, } VALUES_RANGE_COVERAGE: dict[str, dict[str, int]] = { @@ -435,8 +462,9 @@ def VALUES_RANGE_GEOLOCATION(self) -> dict[str, dict[str, int]]: "schools_within_1km": {"min": 0, "max": 20}, "schools_within_2km": {"min": 0, "max": 40}, "schools_within_3km": {"min": 0, "max": 60}, + "schools_within_5km": {"min": 0, "max": 100}, "nearest_school_distance": {"min": 0, "max": 10000000}, - "schools_within_10km": {"min": 0, "max": 100}, + "schools_within_10km": {"min": 0, "max": 200}, } @property @@ -579,6 +607,7 @@ def VALUES_RANGE_ALL(self) -> dict[str, dict[str, int]]: "school_address", "is_school_open", "school_location_ingestion_timestamp", + "rurban_detected", ] COLUMNS_EXCEPT_SCHOOL_ID_MASTER: list[str] = [ @@ -596,6 +625,11 @@ def VALUES_RANGE_ALL(self) -> dict[str, dict[str, int]]: "pop_within_1km", "pop_within_2km", "pop_within_3km", + "pop_within_5km", + "pop_within_10km", + "schools_within_5km", + "schools_within_10km", + "rurban_detected", "connectivity_govt_collection_year", "connectivity_govt", # "school_id_giga", diff --git a/dagster/src/spark/transform_functions.py b/dagster/src/spark/transform_functions.py index 23dfbd401..02568ac40 100644 --- a/dagster/src/spark/transform_functions.py +++ b/dagster/src/spark/transform_functions.py @@ -55,22 +55,32 @@ def create_school_id_giga(df: sql.DataFrame) -> sql.DataFrame: # "school_id_giga", f.coalesce(f.col("school_id_giga"), f.lit(None)) # ) - school_id_giga_prereqs = [ - "school_id_govt", - "school_name", - "education_level", - "latitude", - "longitude", - ] - for column in school_id_giga_prereqs: - if column not in df.columns: - return df.withColumn("school_id_giga", f.lit(None)) + available_columns = set(df.columns) + if ( + "school_id_govt" not in available_columns + or ( + "school_name" not in available_columns + and "official_school_name" not in available_columns + ) + or "education_level" not in available_columns + or "latitude" not in available_columns + or "longitude" not in available_columns + ): + return df.withColumn("school_id_giga", f.lit(None)) + + # Use official_school_name as fallback for school_name + school_name_col = f.coalesce( + f.col("school_name") if "school_name" in available_columns else f.lit(None), + f.col("official_school_name") + if "official_school_name" in available_columns + else f.lit(None), + ) df = df.withColumn( "identifier_concat", f.concat( f.col("school_id_govt").cast(StringType()), - f.col("school_name").cast(StringType()), + school_name_col.cast(StringType()), f.col("education_level").cast(StringType()), f.col("latitude").cast(StringType()), f.col("longitude").cast(StringType()), @@ -385,6 +395,7 @@ def create_bronze_layer_columns( mode: str, uploaded_columns: list[str], is_qos: bool = False, + source: str = None, ) -> sql.DataFrame: """Create bronze layer columns with optional QoS-specific handling. @@ -393,6 +404,7 @@ def create_bronze_layer_columns( silver: Reference silver DataFrame country_code_iso3: Country code in ISO3 format is_qos: Whether to apply QoS-specific transformations + source: Source of the upload (e.g., "gigameter", "nocodb") Returns: DataFrame with bronze layer columns added @@ -485,6 +497,18 @@ def create_bronze_layer_columns( ).otherwise(f.col(column)), ) + if "verification_status" in uploaded_columns: + # Preserve the value from CSV, fallback to default if null + default_value = "unverified" if source == "gigameter" else "verified" + df = df.withColumn( + "verification_status", + f.coalesce(f.col("verification_status"), f.lit(default_value)), + ) + else: + # Column not in CSV, set default based on source + default_value = "unverified" if source == "gigameter" else "verified" + df = df.withColumn("verification_status", f.lit(default_value)) + return df @@ -493,6 +517,7 @@ def create_bronze_layer_columns_updated( mode: str, uploaded_columns: list[str], country_code_iso3: str, + source: str = None, spark: SparkSession = None, ): # standardize education level @@ -541,6 +566,18 @@ def create_bronze_layer_columns_updated( connectivity = get_country_rt_schools(spark, country_code_iso3) df = merge_connectivity_to_master(df, connectivity, uploaded_columns, mode) + if "verification_status" in uploaded_columns: + # Preserve the value from CSV, fallback to default if null + default_value = "unverified" if source == "gigameter" else "verified" + df = df.withColumn( + "verification_status", + f.coalesce(f.col("verification_status"), f.lit(default_value)), + ) + else: + # Column not in CSV, set default based on source + default_value = "unverified" if source == "gigameter" else "verified" + df = df.withColumn("verification_status", f.lit(default_value)) + return df diff --git a/dagster/src/spark/user_defined_functions.py b/dagster/src/spark/user_defined_functions.py index 699c88d95..a1eb911c5 100644 --- a/dagster/src/spark/user_defined_functions.py +++ b/dagster/src/spark/user_defined_functions.py @@ -4,7 +4,7 @@ import numpy as np import pandas as pd -from h3 import geo_to_h3 +from h3 import latlng_to_cell from pyspark.sql.functions import pandas_udf, udf from pyspark.sql.types import ArrayType, StringType @@ -60,7 +60,7 @@ def h3_geo_to_h3_udf(latitude: pd.Series, longitude: pd.Series) -> pd.Series: def convert_to_h3(lat, lon): if pd.isna(lat) or pd.isna(lon): return "0" - return geo_to_h3(lat, lon, resolution=8) + return latlng_to_cell(lat, lon, res=8) vectorized_h3 = np.vectorize(convert_to_h3) return pd.Series( diff --git a/dagster/src/utils/adls.py b/dagster/src/utils/adls.py index 1112dbd2f..f1a8e6117 100644 --- a/dagster/src/utils/adls.py +++ b/dagster/src/utils/adls.py @@ -250,7 +250,7 @@ def upload_pandas_dataframe_as_file( case ".json": bytes_data = data.to_json(index=False, indent=2).encode() case ".parquet": - bytes_data = data.to_parquet(index=False) + bytes_data = data.to_parquet(index=False, coerce_timestamps="us") case _: raise OSError(f"Unsupported format for file {filepath}") diff --git a/dagster/src/utils/data_quality_descriptions.py b/dagster/src/utils/data_quality_descriptions.py index a271c7016..2c0fe9b2a 100644 --- a/dagster/src/utils/data_quality_descriptions.py +++ b/dagster/src/utils/data_quality_descriptions.py @@ -123,6 +123,14 @@ def human_readable_geolocation_checks() -> dict[str, str]: "dq_is_not_within_country": "Are the coordinates within the country", } + geospatial_checks_desc = { + "dq_is_in_uninhabited_area": "Is the school in an uninhabited area (no buildings within 150m AND no built surface)", + "dq_is_suspect_location": "Is the school location suspect (any signal: no buildings OR no built surface nearby)", + "dq_duplicate_group_flag_50m": "Does the school have a potential duplicate within 50m proximity", + "dq_duplicate_group_id_50m": "Cluster ID for schools within 50m of each other", + "dq_duplicate_group_count_50m": "Number of other schools within 50m proximity", + } + geolocation_checks = { **create_update_desc, **is_not_within_country_desc, @@ -134,6 +142,7 @@ def human_readable_geolocation_checks() -> dict[str, str]: **duplicate_name_level_110_check_desc, **column_relation_checks_desc, **critical_error_checks_desc, + **geospatial_checks_desc, } return geolocation_checks diff --git a/dagster/src/utils/datahub/add_platform_metadata.py b/dagster/src/utils/datahub/add_platform_metadata.py index 939fceeb4..34df6e761 100644 --- a/dagster/src/utils/datahub/add_platform_metadata.py +++ b/dagster/src/utils/datahub/add_platform_metadata.py @@ -5,7 +5,6 @@ from datahub.metadata.schema_classes import ( PlatformTypeClass, ) -from pydantic import AnyUrl from src.settings import settings @@ -13,7 +12,7 @@ def add_platform_metadata( platform: str, display_name: str, - logo_url: AnyUrl | str = None, + logo_url: str | None = None, filepath_delimiter: str = "/", ) -> None: emitter = DatahubRestEmitter( diff --git a/dagster/src/utils/datahub/emit_dataset_metadata.py b/dagster/src/utils/datahub/emit_dataset_metadata.py index b0643e147..27b2d740b 100644 --- a/dagster/src/utils/datahub/emit_dataset_metadata.py +++ b/dagster/src/utils/datahub/emit_dataset_metadata.py @@ -129,7 +129,7 @@ def define_schema_properties( if isinstance(schema_reference, sql.DataFrame): for field in schema_reference.schema.fields: is_field_type_found = False - for v in constants.TYPE_MAPPINGS.dict().values(): + for v in constants.TYPE_MAPPINGS.model_dump().values(): if field.dataType == v["pyspark"](): type_class = v["datahub"]() native_type = str(v["native"]) diff --git a/dagster/src/utils/delta.py b/dagster/src/utils/delta.py index c01b207df..05d6d52d3 100644 --- a/dagster/src/utils/delta.py +++ b/dagster/src/utils/delta.py @@ -1,3 +1,5 @@ +import uuid + from delta.tables import DeltaMergeBuilder, DeltaTable, DeltaTableBuilder from icecream import ic from pyspark import sql @@ -294,13 +296,647 @@ def build_nullability_queries( return alter_stmts +def enable_column_mapping(spark: SparkSession, table_name: str) -> None: + """Enable column mapping mode on an existing Delta table if not already enabled.""" + spark.sql( + f"ALTER TABLE {table_name} SET TBLPROPERTIES (" + f" 'delta.columnMapping.mode' = 'name'," + f" 'delta.minReaderVersion' = '2'," + f" 'delta.minWriterVersion' = '5'" + f")" + ) + + +def get_stored_column_id_map(spark: SparkSession, table_name: str) -> dict[str, str]: + """Retrieve the column-name → schema-CSV-ID mapping stored in table properties. + + Returns ``{column_name: csv_id}`` or an empty dict if no mapping has been + stored yet (e.g. tables created before this feature was added). + """ + spark.catalog.refreshTable(table_name) + detail = spark.sql(f"DESCRIBE DETAIL {table_name}").collect()[0] + properties: dict = detail["properties"] if detail["properties"] else {} + result = {} + prefix = "giga.columnId." + for key, value in properties.items(): + if key.startswith(prefix): + col_name = key[len(prefix) :] + result[col_name] = value + return result + + +def store_column_id_map( + spark: SparkSession, + table_name: str, + column_id_map: dict[str, str], +) -> None: + """Persist the column-name → schema-CSV-ID mapping as Delta table properties. + + Also removes any stale ``giga.columnId.*`` properties for columns that are + not present in the new mapping. This prevents accumulation of old column + name props across renames, which would otherwise cause future rename + detection to misbehave (e.g. multiple props pointing to the same UUID). + """ + if not column_id_map: + return + + # Remove stale props for columns that no longer exist in the new mapping + current_props = get_stored_column_id_map(spark, table_name) + stale_columns = [ + col_name for col_name in current_props if col_name not in column_id_map + ] + if stale_columns: + remove_column_id_props(spark, table_name, stale_columns) + + props = ", ".join( + f"'giga.columnId.{col_name}' = '{csv_id}'" + for col_name, csv_id in column_id_map.items() + ) + spark.sql(f"ALTER TABLE {table_name} SET TBLPROPERTIES ({props})") + + +def remove_column_id_props( + spark: SparkSession, + table_name: str, + column_names: list[str], +) -> None: + """Remove column-ID table properties for dropped columns.""" + if not column_names: + return + props = ", ".join(f"'giga.columnId.{name}'" for name in column_names) + spark.sql(f"ALTER TABLE {table_name} UNSET TBLPROPERTIES IF EXISTS ({props})") + + +_PK_PROPERTY_KEY = "giga.pkColumnIds" + + +def get_stored_pk_uuids(spark: SparkSession, table_name: str) -> set[str]: + """Return the set of UUIDs marked as primary keys on this table. + + Returns an empty set if the property is absent (e.g. tables created + before PK persistence was added). + """ + spark.catalog.refreshTable(table_name) + detail = spark.sql(f"DESCRIBE DETAIL {table_name}").collect()[0] + properties: dict = detail["properties"] if detail["properties"] else {} + raw = properties.get(_PK_PROPERTY_KEY) + if not raw: + return set() + return {part.strip() for part in raw.split(",") if part.strip()} + + +def store_pk_uuids( + spark: SparkSession, + table_name: str, + pk_uuids: set[str], +) -> None: + """Persist (or update) the set of primary-key UUIDs for this table.""" + if not pk_uuids: + return + joined = ",".join(sorted(pk_uuids)) + spark.sql( + f"ALTER TABLE {table_name} SET TBLPROPERTIES " + f"('{_PK_PROPERTY_KEY}' = '{joined}')" + ) + + +def detect_renames_and_deletes( + existing_id_map: dict[str, str], + updated_id_map: dict[str, str], +) -> tuple[dict[str, str], list[str]]: + """Compare old and new column-ID mappings to detect renames and deletes. + + Parameters + ---------- + existing_id_map : dict[str, str] + ``{column_name: csv_id}`` from the current table properties. + updated_id_map : dict[str, str] + ``{column_name: csv_id}`` from the latest schema CSV. + + Returns + ------- + renames : dict[str, str] + ``{old_name: new_name}`` for columns whose ID stayed but name changed. + deletes : list[str] + Column names present in the table but whose ID is no longer in the + updated schema (i.e. the column should be dropped). + """ + # Invert maps: csv_id → column_name + existing_by_id = {v: k for k, v in existing_id_map.items()} + updated_by_id = {v: k for k, v in updated_id_map.items()} + + renames: dict[str, str] = {} + deletes: list[str] = [] + + for csv_id, old_name in existing_by_id.items(): + if csv_id in updated_by_id: + new_name = updated_by_id[csv_id] + if old_name != new_name: + renames[old_name] = new_name + else: + # ID no longer present in the reference schema → column deleted + deletes.append(old_name) + + return renames, deletes + + +def initialize_column_id_map( + spark: SparkSession, + table_name: str, + updated_id_map: dict[str, str], + context: OpExecutionContext, +) -> tuple[dict[str, str], dict[str, str], list[str]]: + """Initialize column ID mapping from table schema when no stored mapping exists. + + Returns tuple of (initialized_id_map, renames, deletes). + """ + context.log.info( + "No stored column-ID mapping found; initialising mapping from current table schema." + ) + existing_id_map: dict[str, str] = {} + # Initialize mapping from current table columns so deletions can be detected + # This handles the case where columns were dropped from CSV but table still has them + current_columns = DeltaTable.forName(spark, table_name).toDF().schema.fieldNames() + for col_name in current_columns: + if col_name not in updated_id_map: + # Column exists in table but not in reference schema - will be detected as delete + # Use a deterministic ID based on column name for tracking + existing_id_map[col_name] = f"table_{col_name}" + + renames: dict[str, str] = {} + deletes: list[str] = [] + if existing_id_map: + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + context.log.info(f"Detected renames after init: {renames}") + context.log.info(f"Detected deletes after init: {deletes}") + + return existing_id_map, renames, deletes + + +def execute_renames( + spark: SparkSession, + table_name: str, + renames: dict[str, str], + context: OpExecutionContext, +) -> None: + """Execute column rename SQL statements.""" + context.log.info(f"Renaming columns: {renames}") + for old_name, new_name in renames.items(): + stmt = f"ALTER TABLE {table_name} RENAME COLUMN `{old_name}` TO `{new_name}`" + context.log.info(f"Executing: {stmt}") + spark.sql(stmt) + remove_column_id_props(spark, table_name, list(renames.keys())) + + +def execute_deletes( + spark: SparkSession, + table_name: str, + deletes: list[str], + context: OpExecutionContext, +) -> None: + """Execute column drop SQL statements.""" + detail = spark.sql(f"DESCRIBE DETAIL {table_name}").collect()[0] + partition_columns: set[str] = set(detail["partitionColumns"] or []) + + skipped = [c for c in deletes if c in partition_columns] + to_drop = [c for c in deletes if c not in partition_columns] + + if skipped: + context.log.info( + f"Skipping delete for partition column(s) {skipped} on {table_name} " + f"— Delta Lake does not allow dropping partition columns." + ) + + context.log.info(f"Dropping columns: {to_drop}") + for col_name in to_drop: + stmt = f"ALTER TABLE {table_name} DROP COLUMN `{col_name}`" + context.log.info(f"Executing: {stmt}") + spark.sql(stmt) + remove_column_id_props(spark, table_name, to_drop) + + +def build_excluded_columns( + partition_columns: set[str], + updated_schema: StructType | None, + updated_id_map: dict[str, str], +) -> set[str]: + """Return columns that should be excluded from rename/delete detection.""" + caller_managed = ( + set(updated_schema.fieldNames()) if updated_schema is not None else set() + ) + excluded = set(partition_columns) + if caller_managed: + excluded |= {c for c in caller_managed if c not in updated_id_map} + return excluded + + +def bootstrap_orphan_columns( + spark: SparkSession, + table_name: str, + existing_id_map: dict[str, str], + updated_id_map: dict[str, str], + excluded: set[str], + context: OpExecutionContext, +) -> None: + """Supplement existing_id_map for columns present in the table but lacking stored UUIDs.""" + current_columns = DeltaTable.forName(spark, table_name).toDF().schema.fieldNames() + for col_name in current_columns: + if col_name in excluded: + continue + if col_name not in existing_id_map: + if col_name in updated_id_map: + existing_id_map[col_name] = updated_id_map[col_name] + context.log.info( + f"Column '{col_name}' exists in table but has no stored UUID; " + f"matched to schema UUID '{updated_id_map[col_name]}'." + ) + else: + existing_id_map[col_name] = f"table_{col_name}" + context.log.info( + f"Column '{col_name}' exists in table but has no stored UUID " + f"and is not in the updated schema; " + f"tagging with synthetic ID for delete detection." + ) + + +def filter_pk_changes( + existing_id_map: dict[str, str], + updated_id_map: dict[str, str], + renames: dict[str, str], + deletes: list[str], + primary_key_columns: set[str], + persisted_pk_uuids: set[str], + context: OpExecutionContext, +) -> tuple[dict[str, str], list[str], set[str], dict[str, str]]: + """Filter renames and deletes that touch primary-key columns. + + Returns (filtered_renames, filtered_deletes, blocked_renames, renames_original). + """ + pk_uuids = { + updated_id_map[name] for name in primary_key_columns if name in updated_id_map + } + pk_uuids |= persisted_pk_uuids + renames_original = dict(renames) + + blocked_renames: set[str] = set() + if pk_uuids: + blocked_renames = { + old_name + for old_name, new_name in renames.items() + if existing_id_map.get(old_name) in pk_uuids + } + if blocked_renames: + context.log.warning( + f"Blocked rename of primary key columns: {blocked_renames}" + ) + for old_name in blocked_renames: + del renames[old_name] + + blocked_deletes = [ + col_name + for col_name in deletes + if existing_id_map.get(col_name) in pk_uuids + ] + if blocked_deletes: + context.log.warning( + f"Blocked delete of primary key columns: {blocked_deletes}" + ) + for col_name in blocked_deletes: + deletes.remove(col_name) + + return renames, deletes, blocked_renames, renames_original + + +def detect_and_filter_changes( + spark: SparkSession, + table_name: str, + existing_id_map: dict[str, str], + updated_id_map: dict[str, str], + updated_schema: StructType | None, + partition_columns: set[str], + primary_key_columns: set[str], + persisted_pk_uuids: set[str], + context: OpExecutionContext, +) -> tuple[dict[str, str], list[str], set[str], dict[str, str]]: + """Detect renames/deletes, exclude partition/caller-managed cols, and filter PK changes.""" + excluded = build_excluded_columns(partition_columns, updated_schema, updated_id_map) + + if excluded: + for col_name in list(existing_id_map.keys()): + if col_name in excluded: + reason = ( + "partition column" + if col_name in partition_columns + else "caller-managed column" + ) + context.log.info( + f"Excluding '{col_name}' from rename/delete detection ({reason})." + ) + del existing_id_map[col_name] + for col_name in list(updated_id_map.keys()): + if col_name in excluded: + del updated_id_map[col_name] + + bootstrap_orphan_columns( + spark, table_name, existing_id_map, updated_id_map, excluded, context + ) + + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + + return filter_pk_changes( + existing_id_map, + updated_id_map, + renames, + deletes, + primary_key_columns, + persisted_pk_uuids, + context, + ) + + +def execute_renames_and_deletes( + spark: SparkSession, + table_name: str, + renames: dict[str, str], + deletes: list[str], + context: OpExecutionContext, +) -> None: + """Enable column mapping and execute any renames or deletes.""" + context.log.info(f"Detected renames: {renames}") + context.log.info(f"Detected deletes: {deletes}") + + if renames or deletes: + context.log.info( + "Enabling column mapping on table for rename/delete support..." + ) + enable_column_mapping(spark, table_name) + + if renames: + execute_renames(spark, table_name, renames, context) + + if deletes: + execute_deletes(spark, table_name, deletes, context) + + if renames or deletes: + spark.catalog.refreshTable(table_name) + + +def apply_renames_and_deletes( + spark: SparkSession, + table_name: str, + schema_name: str, + context: OpExecutionContext, + updated_schema: StructType | None = None, +) -> tuple[bool, set[str]]: + """Detect and apply column renames and deletes to a Delta table based on the reference schema.""" + + from src.utils.schema import get_schema_columns_with_id + + columns_with_id = get_schema_columns_with_id(spark, schema_name) + updated_id_map = {field.name: csv_id for csv_id, field in columns_with_id} + existing_id_map = get_stored_column_id_map(spark, table_name) + + if not existing_id_map: + context.log.info( + f"No stored column-ID mapping found for {table_name}. " + "Bootstrapping UUID props from current schema. " + "Rename/delete detection will be active from the next run onwards." + ) + persist_column_id_map(spark, table_name, schema_name) + return False, set() + + detail = spark.sql(f"DESCRIBE DETAIL {table_name}").collect()[0] + partition_columns: set[str] = set(detail["partitionColumns"] or []) + + # Discover primary key columns from the reference schema. + # The schemas Delta table has a ``primary_key`` boolean column. + primary_key_columns: set[str] = set() + try: + pk_rows = spark.sql( + f"SELECT name FROM schemas.{schema_name} WHERE primary_key = true" # nosec B608 + ).collect() + primary_key_columns = {row["name"] for row in pk_rows} + if primary_key_columns: + context.log.info( + f"Primary key columns detected: {sorted(primary_key_columns)}" + ) + except Exception: + # Schema table may not exist or lack the primary_key column + pass + + persisted_pk_uuids: set[str] = get_stored_pk_uuids(spark, table_name) + if persisted_pk_uuids: + context.log.info(f"Persisted PK UUIDs on table: {sorted(persisted_pk_uuids)}") + + renames, deletes, blocked_renames, renames_original = detect_and_filter_changes( + spark, + table_name, + existing_id_map, + updated_id_map, + updated_schema, + partition_columns, + primary_key_columns, + persisted_pk_uuids, + context, + ) + + execute_renames_and_deletes(spark, table_name, renames, deletes, context) + + # Collect the new names of blocked renames so that sync_schema can + # avoid adding them as new columns (since the rename was blocked). + blocked_new_names: set[str] = set() + if blocked_renames: + blocked_new_names = { + new_name + for old_name, new_name in renames_original.items() + if old_name in blocked_renames + } + + return bool(renames or deletes), blocked_new_names + + +def persist_column_id_map( + spark: SparkSession, table_name: str, schema_name: str +) -> None: + """Read the column ID mapping from the schema CSV and store it as table properties.""" + from src.utils.schema import get_schema_columns_with_id + + columns_with_id = get_schema_columns_with_id(spark, schema_name) + # uuid -> schema_column_name + schema_uuid_to_name = {csv_id: field.name for csv_id, field in columns_with_id} + # schema_column_name -> uuid + schema_name_to_uuid = {field.name: csv_id for csv_id, field in columns_with_id} + + # Previous stored map (may have old names for blocked renames) + previous_map = get_stored_column_id_map(spark, table_name) + + spark.catalog.refreshTable(table_name) + table_columns = spark.table(table_name).columns + + new_id_map: dict[str, str] = {} + for col_name in table_columns: + # 1. If the column name exactly matches a schema column → use schema UUID + if col_name in schema_name_to_uuid: + new_id_map[col_name] = schema_name_to_uuid[col_name] + continue + + # 2. If the column has a stored UUID that maps to a schema column + # (rename was blocked, old table name with valid UUID) + prev_uuid = previous_map.get(col_name) + if prev_uuid and prev_uuid in schema_uuid_to_name: + new_id_map[col_name] = prev_uuid + continue + + # 3. Otherwise keep previous UUID if any, or generate new one + if prev_uuid: + new_id_map[col_name] = prev_uuid + else: + new_id_map[col_name] = str(uuid.uuid4()) + + store_column_id_map(spark, table_name, new_id_map) + + # Persist PK UUIDs for protection across schema removals. + # We accumulate (union) so a PK once registered stays protected. + try: + pk_rows = spark.sql( + f"SELECT name FROM schemas.{schema_name} WHERE primary_key = true" # nosec B608 + ).collect() + current_pk_uuids = { + schema_name_to_uuid[row["name"]] + for row in pk_rows + if row["name"] in schema_name_to_uuid + } + except Exception: + current_pk_uuids = set() + + previous_pk_uuids = get_stored_pk_uuids(spark, table_name) + merged_pk_uuids = previous_pk_uuids | current_pk_uuids + if merged_pk_uuids and merged_pk_uuids != previous_pk_uuids: + store_pk_uuids(spark, table_name, merged_pk_uuids) + + +def apply_datatype_changes( + spark: SparkSession, + table_name: str, + changed_datatypes: dict, + context: OpExecutionContext, +) -> None: + """Apply datatype changes by casting columns and overwriting the table schema.""" + if not changed_datatypes: + return + + context.log.info("Updating datatype...") + context.log.info(f"Changed datatypes: {changed_datatypes}") + existing_dataframe = spark.table(table_name) + updated_df = existing_dataframe + + for column, datatype in changed_datatypes.items(): + updated_df = updated_df.withColumn( + column, existing_dataframe[column].cast(datatype.typeName()) + ) + + ( + updated_df.write.option("overwriteSchema", "true") + .format("delta") + .mode("overwrite") + .saveAsTable(table_name) + ) + spark.catalog.refreshTable(table_name) + + +def handle_removed_columns( + spark: SparkSession, + table_name: str, + removed_columns: set[str], + schema_name: str | None, + context: OpExecutionContext, +) -> None: + """Safely handle columns that exist in the table but not in the updated schema. + + When ``schema_name`` is provided, :func:`apply_renames_and_deletes` is the + authoritative path for both renames and deletes (UUID-based detection). + If columns end up here despite that, it likely means rename detection + failed for them. Log a clear warning instead of silently dropping to + prevent data loss. + + When ``schema_name`` is None (legacy callers, schema-tables migration), + fall back to dropping by name as before. + """ + if not removed_columns: + return + + if schema_name is not None: + context.log.warning( + f"Columns exist in table but not in updated schema: " + f"{removed_columns}. These were NOT handled by " + f"apply_renames_and_deletes - leaving them in place to avoid " + f"unintended data loss. If you intend to drop them, remove the " + f"column from the schema CSV (with its UUID) and re-run." + ) + return + + context.log.info(f"Dropping columns not in updated schema: {removed_columns}") + for col_name in removed_columns: + stmt = f"ALTER TABLE {table_name} DROP COLUMN `{col_name}`" + context.log.info(f"Executing: {stmt}") + spark.sql(stmt) + + def sync_schema( table_name: str, existing_schema: StructType, updated_schema: StructType, spark: SparkSession, context: OpExecutionContext, + schema_name: str | None = None, ): + """Synchronise a Delta table's schema with the reference schema. + + Supports: + * Adding columns (existing behaviour via ``mergeSchema``) + * Renaming columns (via ``ALTER TABLE RENAME COLUMN``) + * Dropping columns (via ``ALTER TABLE DROP COLUMN``) + * Changing data types (via overwrite with ``overwriteSchema``) + * Changing nullability constraints + + Column renames and deletes require ``schema_name`` so that the stable + UUID column IDs from the schema CSV can be compared against the IDs + stored in the table properties. + """ + # ------------------------------------------------------------------ + # 1. Detect and apply renames & deletes + # ------------------------------------------------------------------ + any_renames_deletes = False + blocked_new_names: set[str] = set() + if schema_name is not None: + any_renames_deletes, blocked_new_names = apply_renames_and_deletes( + spark, table_name, schema_name, context, updated_schema=updated_schema + ) + + # ------------------------------------------------------------------ + # 2. Refresh schemas after rename/delete to get accurate comparison + # ------------------------------------------------------------------ + if any_renames_deletes: + spark.catalog.refreshTable(table_name) + existing_schema = spark.table(table_name).schema + + # ------------------------------------------------------------------ + # 2a. Remove blocked-new names from updated_schema so they are not + # incorrectly added as new columns (e.g. a primary key rename + # that was blocked should not create a duplicate column). + # ------------------------------------------------------------------ + if blocked_new_names: + context.log.info( + f"Blocked rename targets excluded from add logic: {blocked_new_names}" + ) + filtered_fields = [ + f for f in updated_schema.fields if f.name not in blocked_new_names + ] + updated_schema = StructType(filtered_fields) + + # ------------------------------------------------------------------ + # 3. Detect added columns & datatype changes (existing logic) + # ------------------------------------------------------------------ alter_stmts = build_nullability_queries( context=context, existing_schema=existing_schema, @@ -310,38 +946,20 @@ def sync_schema( context.log.info(f"alter_stmts {alter_stmts}") has_nullability_changed = len(alter_stmts) > 0 - existing_columns = {field.name: field.name for field in existing_schema} - updated_columns = {field.name: field.name for field in updated_schema} - - added_columns = set(updated_columns.keys()) - set(existing_columns.keys()) - removed_columns = set(existing_columns.keys()) - set(updated_columns.keys()) + existing_columns = {field.name for field in existing_schema} + updated_columns_set = {field.name for field in updated_schema} - has_schema_changed = len(added_columns) + len(removed_columns) > 0 + added_columns = updated_columns_set - existing_columns + # Recalculate removed_columns after renames/deletes were applied + # This ensures we correctly identify columns that should be dropped + removed_columns = existing_columns - updated_columns_set changed_datatypes = get_changed_datatypes( context=context, existing_schema=existing_schema, updated_schema=updated_schema ) - has_datatype_changed = len(changed_datatypes) > 0 + apply_datatype_changes(spark, table_name, changed_datatypes, context) - if has_datatype_changed: - context.log.info("Updating datatype...") - context.log.info(f"Changed datatypes: {changed_datatypes}") - existing_dataframe = spark.table(table_name) - updated_df = existing_dataframe - - for column, datatype in changed_datatypes.items(): - updated_df = updated_df.withColumn( - column, existing_dataframe[column].cast(datatype.typeName()) - ) - - ( - updated_df.write.option("overwriteSchema", "true") - .format("delta") - .mode("overwrite") - .saveAsTable(table_name) - ) - - if has_schema_changed: + if added_columns: context.log.info(f"Adding schema columns {added_columns}") empty_dataframe_with_updated_schema = spark.createDataFrame( @@ -353,6 +971,9 @@ def sync_schema( .mode("append") .saveAsTable(table_name) ) + + handle_removed_columns(spark, table_name, removed_columns, schema_name, context) + context.log.info(f"has_nullability_changed {has_nullability_changed}") if has_nullability_changed: @@ -367,5 +988,10 @@ def sync_schema( except AnalysisException as exc: if "DELTA_CONSTRAINT_ALREADY_EXISTS" in str(exc): continue + elif "DELTA_NEW_CHECK_CONSTRAINT_VIOLATION" in str(exc): + context.log.warning( + f"Skipping NOT NULL constraint because existing data has nulls: {exc}" + ) + continue else: raise diff --git a/dagster/src/utils/email/send_email_base.py b/dagster/src/utils/email/send_email_base.py index 1cc83745a..445c39900 100644 --- a/dagster/src/utils/email/send_email_base.py +++ b/dagster/src/utils/email/send_email_base.py @@ -50,7 +50,7 @@ async def send_email_base( subject=subject, html_part=html, text_part=text, - ).dict(), + ).model_dump(), ) if res.is_error: logger.error(res.json()) diff --git a/dagster/src/utils/nocodb/get_nocodb_data.py b/dagster/src/utils/nocodb/get_nocodb_data.py index 8fb3bd9b5..0a718edb7 100644 --- a/dagster/src/utils/nocodb/get_nocodb_data.py +++ b/dagster/src/utils/nocodb/get_nocodb_data.py @@ -140,3 +140,11 @@ def get_nocodb_table_id_from_name(table_name): return nocodb_response[0]["table_id"] else: raise ValueError(f"Unable to retrieve the table_id for table {table_name}") + + +def create_nocodb_table_record(table_id, data): + """Create a new record in a NoCoDB table.""" + table_url = f"{settings.NOCODB_BASE_URL}/api/v2/tables/{table_id}/records" + headers = {"xc-token": settings.NOCODB_TOKEN, "Content-Type": "application/json"} + response = requests.post(table_url, json=data, headers=headers) + return response.json() diff --git a/dagster/src/utils/op_config.py b/dagster/src/utils/op_config.py index dc287d4a4..fa6b093e8 100644 --- a/dagster/src/utils/op_config.py +++ b/dagster/src/utils/op_config.py @@ -1,6 +1,6 @@ import json from pathlib import Path -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field @@ -36,7 +36,7 @@ class FileConfig(Config): The file metadata including entries from the Ingestion Portal, as well as other system-generated metadata. """, ) - database_data: str = Field( + database_data: str | None = Field( default=None, description=""" The user- and system-generated data from the Ingestion Portal, for API-based ingestion. @@ -60,7 +60,7 @@ class FileConfig(Config): instead of destination_filepath. """, ) - dq_target_filepath: str = Field( + dq_target_filepath: str | None = Field( description=""" The path of the file inside the ADLS container where we run data quality checks on. """, @@ -85,10 +85,10 @@ class FileConfig(Config): The tier of the dataset, e.g. raw, bronze, staging, silver, gold """, ) - domain: str = Field( + domain: str | None = Field( default=None, ) - table_name: str = Field( + table_name: str | None = Field( description=""" The name of the table which refers to this dataset. Used if the output format is a Delta Table """, @@ -145,7 +145,7 @@ class OpDestinationMapping(BaseModel): destination_filepath: str metastore_schema: str tier: DataTier - table_name: Optional[str] = None + table_name: str | None = None output_filepaths: dict[str, str] = Field(default_factory=dict) @@ -156,7 +156,7 @@ def generate_run_ops( file_size_bytes: int, domain: str, country_code: str, - dq_target_filepath: str = None, + dq_target_filepath: str | None = None, database_data: str = None, ) -> dict[str, FileConfig]: run_ops = {} diff --git a/dagster/src/utils/schema.py b/dagster/src/utils/schema.py index 37185bfda..04e787625 100644 --- a/dagster/src/utils/schema.py +++ b/dagster/src/utils/schema.py @@ -14,6 +14,19 @@ from src.constants import DataTier, constants +def get_type_mapping(data_type: str): + """Map a data type string to its corresponding TypeMapping from constants. + + Handles case-insensitivity and common aliases (e.g., 'INT' -> 'integer'). + """ + normalized_type = data_type.lower() + # Handle common aliases from config_expectations + if normalized_type == "int": + normalized_type = "integer" + + return getattr(constants.TYPE_MAPPINGS, normalized_type) + + def get_schema_name( context: InputContext | OutputContext | OpExecutionContext | AssetExecutionContext, ) -> str: @@ -40,7 +53,7 @@ def get_schema_columns(spark: SparkSession, schema_name: str) -> list[StructFiel existing_columns = [ StructField( row.name, - getattr(constants.TYPE_MAPPINGS, row.data_type).pyspark(), + get_type_mapping(row.data_type).pyspark(), row.is_nullable, ) for row in df.collect() @@ -68,6 +81,34 @@ def get_schema_columns(spark: SparkSession, schema_name: str) -> list[StructFiel return existing_columns +def get_schema_columns_with_id( + spark: SparkSession, schema_name: str +) -> list[tuple[str, StructField]]: + """Return schema columns paired with their stable UUID id. + + Each tuple is ``(id, StructField)``. The ``id`` is the fixed UUID + assigned to the column in the schema CSV stored in ADLS. By comparing + IDs between the reference schema and an existing Delta table we can + detect: + + * **Renames** – same ID, different ``StructField.name`` + * **Deletes** – ID present in the table but absent from the reference + * **Adds** – ID present in the reference but absent from the table + """ + df = get_schema_table(spark, schema_name) + return [ + ( + row.id, + StructField( + row.name, + get_type_mapping(row.data_type).pyspark(), + row.is_nullable, + ), + ) + for row in df.collect() + ] + + def get_schema_column_descriptions( spark: SparkSession, schema_name: str ) -> dict[str:str]: @@ -78,8 +119,7 @@ def get_schema_column_descriptions( def get_schema_columns_datahub(spark: SparkSession, schema_name: str) -> list[tuple]: df = get_schema_table(spark, schema_name) return [ - (row.name, getattr(constants.TYPE_MAPPINGS, row.data_type).datahub()) - for row in df.collect() + (row.name, get_type_mapping(row.data_type).datahub()) for row in df.collect() ] diff --git a/dagster/src/utils/send_email_master_release_notification.py b/dagster/src/utils/send_email_master_release_notification.py index 129d61834..b61bd7ce1 100644 --- a/dagster/src/utils/send_email_master_release_notification.py +++ b/dagster/src/utils/send_email_master_release_notification.py @@ -27,7 +27,7 @@ async def send_email_master_release_notification( await send_email_base( endpoint="email/master-data-release-notification", - props=props.dict(), + props=props.model_dump(), recipients=recipients, subject="Master Data Update Notification", context=context, diff --git a/dagster/src/utils/spark.py b/dagster/src/utils/spark.py index 2acabc5f4..4cd389f11 100644 --- a/dagster/src/utils/spark.py +++ b/dagster/src/utils/spark.py @@ -1,7 +1,6 @@ import subprocess from uuid import uuid4 -import pyarrow_hotfix # noqa: F401, pylint: disable=unused-import from dagster_pyspark import PySparkResource from delta import configure_spark_with_delta_pip from pyspark import SparkConf, sql @@ -56,6 +55,9 @@ def _get_host_ip() -> str: "spark.databricks.delta.properties.defaults.appendOnly": "false", "spark.databricks.delta.schema.autoMerge.enabled": "false", "spark.databricks.delta.catalog.update.enabled": "true", + "spark.databricks.delta.properties.defaults.columnMapping.mode": "name", + "spark.databricks.delta.properties.defaults.minReaderVersion": "2", + "spark.databricks.delta.properties.defaults.minWriterVersion": "5", "spark.sql.legacy.parquet.nanosAsLong": "true", } diff --git a/dagster/tests/utils/test_delta_sync_schema.py b/dagster/tests/utils/test_delta_sync_schema.py new file mode 100644 index 000000000..a314b83a7 --- /dev/null +++ b/dagster/tests/utils/test_delta_sync_schema.py @@ -0,0 +1,1179 @@ +"""Tests for the Delta Lake column rename/delete detection helpers in src.utils.delta.""" + +from src.utils.delta import detect_renames_and_deletes + + +class TestDetectRenamesAndDeletes: + """Unit tests for detect_renames_and_deletes.""" + + def test_no_changes(self): + existing = {"col_a": "id-1", "col_b": "id-2", "col_c": "id-3"} + updated = {"col_a": "id-1", "col_b": "id-2", "col_c": "id-3"} + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {} + assert deletes == [] + + def test_column_renamed(self): + existing = {"old_name": "id-1", "col_b": "id-2"} + updated = {"new_name": "id-1", "col_b": "id-2"} + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {"old_name": "new_name"} + assert deletes == [] + + def test_column_deleted(self): + existing = {"col_a": "id-1", "col_b": "id-2", "col_c": "id-3"} + updated = {"col_a": "id-1", "col_b": "id-2"} + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {} + assert deletes == ["col_c"] + + def test_column_added_only(self): + """Adding a column (ID in updated but not existing) should not trigger renames or deletes.""" + existing = {"col_a": "id-1"} + updated = {"col_a": "id-1", "col_new": "id-new"} + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {} + assert deletes == [] + + def test_rename_and_delete_combined(self): + existing = { + "old_name": "id-1", + "col_b": "id-2", + "col_to_drop": "id-3", + } + updated = { + "new_name": "id-1", + "col_b": "id-2", + } + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {"old_name": "new_name"} + assert deletes == ["col_to_drop"] + + def test_rename_delete_and_add(self): + existing = { + "old_name": "id-1", + "col_b": "id-2", + "col_drop": "id-3", + } + updated = { + "new_name": "id-1", + "col_b": "id-2", + "col_new": "id-4", + } + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {"old_name": "new_name"} + assert deletes == ["col_drop"] + + def test_multiple_renames(self): + existing = {"a": "id-1", "b": "id-2", "c": "id-3"} + updated = {"x": "id-1", "y": "id-2", "c": "id-3"} + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {"a": "x", "b": "y"} + assert deletes == [] + + def test_multiple_deletes(self): + existing = {"a": "id-1", "b": "id-2", "c": "id-3"} + updated = {"a": "id-1"} + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {} + assert sorted(deletes) == ["b", "c"] + + def test_empty_existing(self): + """If existing is empty, there should be no changes.""" + renames, deletes = detect_renames_and_deletes({}, {"a": "id-1"}) + assert renames == {} + assert deletes == [] + + def test_empty_updated_deletes_all(self): + """If updated is empty, all existing columns should be deleted.""" + existing = {"a": "id-1", "b": "id-2"} + renames, deletes = detect_renames_and_deletes(existing, {}) + assert renames == {} + assert sorted(deletes) == ["a", "b"] + + def test_both_empty(self): + renames, deletes = detect_renames_and_deletes({}, {}) + assert renames == {} + assert deletes == [] + + +class TestSyncSchemaRemovedColumns: + """Unit tests for sync_schema removed_columns calculation logic.""" + + def test_removed_columns_detection(self): + """Test that removed_columns is correctly calculated after renames.""" + existing_columns = {"col_a", "col_b", "col_c"} + updated_columns_set = {"col_a", "col_x"} + removed_columns = existing_columns - updated_columns_set + assert removed_columns == {"col_b", "col_c"} + + def test_removed_columns_after_rename_applied(self): + """Test that after rename is applied, only orphaned columns are removed.""" + existing_after_rename = {"col_a", "col_x", "col_c"} + updated_columns_set = {"col_a", "col_x"} + removed_columns = existing_after_rename - updated_columns_set + assert removed_columns == {"col_c"} + + def test_removed_columns_empty_when_no_deletions(self): + """Test that removed_columns is empty when no columns are deleted.""" + existing_columns = {"col_a", "col_b", "col_c"} + updated_columns_set = {"col_a", "col_b", "col_c"} + removed_columns = existing_columns - updated_columns_set + assert removed_columns == set() + + +class TestApplyRenamesAndDeletesInitialization: + """Unit tests for apply_renames_and_deletes mapping initialization.""" + + def test_empty_mapping_skips_detection(self): + """When existing_id_map is completely empty (pre-existing table with no stored + UUIDs), rename/delete detection must be skipped entirely. + + Previously the code tagged all columns with synthetic IDs and treated them as + deletes, which caused data loss on pre-existing tables. The fix: when + existing_id_map is empty, return early after bootstrapping — do NOT drop anything. + """ + # Simulate the guard added to apply_renames_and_deletes: + # if not existing_id_map: bootstrap and return False (no changes) + existing_id_map = {} + assert not existing_id_map # guard condition: skip when completely empty + + def test_partial_mapping_still_detects_deletes(self): + """When existing_id_map is PARTIALLY populated (some columns have stored UUIDs), + columns that lack a UUID are given synthetic IDs and treated as deletes if they + are absent from the updated schema. + + Columns whose name matches a key in updated_id_map get the REAL UUID instead, + preventing false deletes for unchanged business columns. + """ + existing_id_map = {"col_a": "id-1", "col_b": "id-2"} + updated_id_map = {"col_a": "id-1", "col_b": "id-2"} + current_table_columns = ["col_a", "col_b", "orphan_col"] + + # Supplement: use real UUID when name matches, synthetic for orphans + for col_name in current_table_columns: + if col_name not in existing_id_map: + if col_name in updated_id_map: + existing_id_map[col_name] = updated_id_map[col_name] + else: + existing_id_map[col_name] = f"table_{col_name}" + + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + assert deletes == ["orphan_col"] + assert renames == {} + + +class TestFalseDeletePrevention: + """Regression tests for the drop-and-re-add bug. + + Bug: When existing_id_map was partially populated, columns that existed + in BOTH the table AND the schema CSV (unchanged columns) were tagged with + synthetic IDs. The synthetic IDs never matched the real schema UUIDs, + causing them to be falsely detected as deletes, dropped, and then + immediately re-added by the sync_schema add-columns logic — losing all + data in those columns. + + Fix: When supplementing existing_id_map, if a column name matches a key + in updated_id_map, use the real schema UUID instead of a synthetic one. + """ + + @staticmethod + def _supplement_logic( + stored_id_map: dict, + updated_id_map: dict, + current_table_columns: list, + excluded: set | None = None, + ): + """Mirror the FIXED production supplementing logic.""" + existing = dict(stored_id_map) + excluded = excluded or set() + for col_name in current_table_columns: + if col_name in excluded: + continue + if col_name not in existing: + if col_name in updated_id_map: + existing[col_name] = updated_id_map[col_name] + else: + existing[col_name] = f"table_{col_name}" + return existing + + def test_unchanged_columns_not_falsely_deleted(self): + """Reproduces the exact user-reported bug. + + Table has: school_id_giga, longitude, school_name, num_students, latitude + Schema CSV has the same columns (with UUIDs). + Only school_id_giga has a stored UUID; the rest don't. + Expected: no renames, no deletes. + """ + stored_id_map = {"school_id_giga": "uuid-sig"} # partial: only one stored UUID + updated_id_map = { + "school_id_giga": "uuid-sig", + "longitude": "uuid-lon", + "school_name": "uuid-sn", + "num_students": "uuid-ns", + "latitude": "uuid-lat", + } + current_table_columns = [ + "school_id_giga", + "longitude", + "school_name", + "num_students", + "latitude", + ] + + existing = self._supplement_logic( + stored_id_map, updated_id_map, current_table_columns + ) + + renames, deletes = detect_renames_and_deletes(existing, updated_id_map) + # All columns should be recognized as unchanged (real UUIDs match) + assert renames == {} + assert deletes == [] + + def test_mixed_unchanged_and_orphan(self): + """Columns in both table and CSV are preserved; orphans are deleted.""" + stored_id_map = {"col_a": "uuid-a"} + updated_id_map = { + "col_a": "uuid-a", + "col_b": "uuid-b", # in table but no stored UUID + "col_c": "uuid-c", # in table but no stored UUID + } + current_table_columns = ["col_a", "col_b", "col_c", "orphan_col"] + + existing = self._supplement_logic( + stored_id_map, updated_id_map, current_table_columns + ) + + renames, deletes = detect_renames_and_deletes(existing, updated_id_map) + assert renames == {} + # Only orphan_col should be deleted (not col_b or col_c) + assert deletes == ["orphan_col"] + + def test_rename_still_works_with_fix(self): + """Renames are still detected when one column has a stored UUID + and the schema CSV has a new name for that UUID.""" + stored_id_map = {"old_name": "uuid-1", "col_b": "uuid-2"} + updated_id_map = { + "new_name": "uuid-1", # rename via UUID + "col_b": "uuid-2", + "col_c": "uuid-c", # in table but no stored UUID + } + current_table_columns = ["old_name", "col_b", "col_c"] + + existing = self._supplement_logic( + stored_id_map, updated_id_map, current_table_columns + ) + + renames, deletes = detect_renames_and_deletes(existing, updated_id_map) + assert renames == {"old_name": "new_name"} + assert deletes == [] + + def test_old_synthetic_logic_would_cause_false_deletes(self): + """Demonstrates that the OLD logic (always synthetic) causes false deletes.""" + stored_id_map = {"school_id_giga": "uuid-sig"} + updated_id_map = { + "school_id_giga": "uuid-sig", + "longitude": "uuid-lon", + "school_name": "uuid-sn", + } + current_table_columns = ["school_id_giga", "longitude", "school_name"] + + # OLD logic: always use synthetic ID + existing_buggy = dict(stored_id_map) + for col_name in current_table_columns: + if col_name not in existing_buggy: + existing_buggy[col_name] = f"table_{col_name}" # BUG + + _, deletes_buggy = detect_renames_and_deletes(existing_buggy, updated_id_map) + # OLD: longitude and school_name are falsely detected as deletes + assert "longitude" in deletes_buggy + assert "school_name" in deletes_buggy + + # NEW logic: use real UUID when name matches + existing_fixed = self._supplement_logic( + stored_id_map, updated_id_map, current_table_columns + ) + + _, deletes_fixed = detect_renames_and_deletes(existing_fixed, updated_id_map) + # NEW: no false deletes + assert deletes_fixed == [] + + +class TestMultipleOperations: + """Test handling of multiple simultaneous add, rename, and delete operations.""" + + def test_multiple_renames_simultaneous(self): + """Test that multiple columns can be renamed at once.""" + existing = { + "old_col_a": "id-1", + "old_col_b": "id-2", + "old_col_c": "id-3", + "unchanged": "id-4", + } + updated = { + "new_col_a": "id-1", + "new_col_b": "id-2", + "new_col_c": "id-3", + "unchanged": "id-4", + } + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == { + "old_col_a": "new_col_a", + "old_col_b": "new_col_b", + "old_col_c": "new_col_c", + } + assert deletes == [] + + def test_multiple_deletes_simultaneous(self): + """Test that multiple columns can be deleted at once.""" + existing = { + "col_a": "id-1", + "col_to_drop_1": "id-2", + "col_b": "id-3", + "col_to_drop_2": "id-4", + "col_to_drop_3": "id-5", + } + updated = { + "col_a": "id-1", + "col_b": "id-3", + } + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {} + assert sorted(deletes) == ["col_to_drop_1", "col_to_drop_2", "col_to_drop_3"] + + def test_multiple_renames_and_deletes_simultaneous(self): + """Test multiple renames and deletes happening together.""" + existing = { + "old_a": "id-1", + "to_drop_1": "id-2", + "old_b": "id-3", + "to_drop_2": "id-4", + "unchanged": "id-5", + } + updated = { + "new_a": "id-1", + "new_b": "id-3", + "unchanged": "id-5", + } + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == {"old_a": "new_a", "old_b": "new_b"} + assert sorted(deletes) == ["to_drop_1", "to_drop_2"] + + def test_full_schema_evolution_add_rename_delete(self): + """Test complete schema evolution: adds, renames, and deletes simultaneously.""" + existing = { + "school_id": "id-1", + "old_funding_type": "id-2", + "num_teachers_female": "id-3", + "num_teachers_male": "id-4", + "old_tablet_count": "id-5", + } + updated = { + "school_id": "id-1", + "school_funding_source": "id-2", + "num_tablets_used": "id-5", + } + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == { + "old_funding_type": "school_funding_source", + "old_tablet_count": "num_tablets_used", + } + assert sorted(deletes) == ["num_teachers_female", "num_teachers_male"] + + def test_complex_multi_country_scenario(self): + """Test scenario matching the user's Gambia case with multiple changes.""" + existing = { + "school_id_giga": "csv-id-001", + "school_name": "csv-id-002", + "school_funding_type": "csv-id-010", + "num_tablets": "csv-id-015", + "num_teachers_female": "csv-id-020", + "num_teachers_male": "csv-id-021", + "latitude": "csv-id-030", + "longitude": "csv-id-031", + } + updated = { + "school_id_giga": "csv-id-001", + "school_name": "csv-id-002", + "school_funding_source": "csv-id-010", + "num_tablets_used": "csv-id-015", + "latitude": "csv-id-030", + "longitude": "csv-id-031", + } + renames, deletes = detect_renames_and_deletes(existing, updated) + assert renames == { + "school_funding_type": "school_funding_source", + "num_tablets": "num_tablets_used", + } + assert sorted(deletes) == ["num_teachers_female", "num_teachers_male"] + + def test_multiple_adds_simultaneous(self): + """Test that multiple columns can be added at once.""" + existing_columns = {"col_a", "col_b", "col_c"} + updated_columns_set = { + "col_a", + "col_b", + "col_c", + "new_col_x", + "new_col_y", + "new_col_z", + } + added_columns = updated_columns_set - existing_columns + assert added_columns == {"new_col_x", "new_col_y", "new_col_z"} + + def test_complete_workflow_add_rename_delete_together(self): + """Test the complete workflow: adds, renames, and deletes all together.""" + existing_id_map = { + "school_id": "uuid-001", + "old_name_a": "uuid-002", + "old_name_b": "uuid-003", + "to_delete_1": "uuid-100", + "to_delete_2": "uuid-101", + } + updated_id_map = { + "school_id": "uuid-001", + "new_name_a": "uuid-002", + "new_name_b": "uuid-003", + "new_col_x": "uuid-200", + "new_col_y": "uuid-201", + "new_col_z": "uuid-202", + } + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + assert renames == {"old_name_a": "new_name_a", "old_name_b": "new_name_b"} + assert sorted(deletes) == ["to_delete_1", "to_delete_2"] + existing_after_renames = { + "school_id", + "new_name_a", + "new_name_b", + "to_delete_1", + "to_delete_2", + } + updated_columns_set = set(updated_id_map.keys()) + added_columns = updated_columns_set - existing_after_renames + removed_columns = existing_after_renames - updated_columns_set + assert added_columns == {"new_col_x", "new_col_y", "new_col_z"} + assert removed_columns == {"to_delete_1", "to_delete_2"} + + +class TestPartialColumnIdMap: + """Regression tests for the partial column_id_map bug. + + The bug: when ``existing_id_map`` was partially populated (some columns + had stored UUIDs, others did not), columns without UUIDs were silently + ignored by detect_renames_and_deletes. The secondary path in sync_schema + then dropped them by name, causing data loss when the user intended a + rename. + + The fix: ALWAYS supplement existing_id_map with synthetic ``table_*`` IDs + for any table column that lacks a stored UUID. This ensures the column + is at least handled by the explicit delete path (with a clear log + message) instead of being silently dropped. + """ + + def test_simulates_managers_bug_report(self): + """Reproduces the exact bug from the manager's logs. + + Setup: + - silver table has columns: school_funding_source, num_tablets_used + - column_id_map has only num_tablets_used UUID stored + (school_funding_source UUID is missing for some reason) + - User updates schema CSV: school_funding_source -> school_funding_type, + num_tablets_used -> num_tablets + + Before the fix: only num_tablets_used was detected as rename; + school_funding_source was silently dropped. + + After the fix: num_tablets_used is renamed (UUID match), + school_funding_source is detected as DELETE (synthetic ID, no match) + and dropped via the explicit path (with clear log). No silent data + loss. + """ + # Simulate stored column_id_map (partial - missing school_funding_source) + stored_id_map = { + "num_tablets_used": "uuid-tablets", + } + # Schema CSV has new names + updated_id_map = { + "school_funding_type": "uuid-funding", + "num_tablets": "uuid-tablets", + } + + # Simulate the new logic: supplement existing_id_map with table columns + current_table_columns = ["school_funding_source", "num_tablets_used"] + existing_id_map = dict(stored_id_map) + for col_name in current_table_columns: + if col_name not in existing_id_map: + existing_id_map[col_name] = f"table_{col_name}" + + # Now detect renames and deletes + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + + # num_tablets_used -> num_tablets is detected as rename via UUID + assert renames == {"num_tablets_used": "num_tablets"} + # school_funding_source is detected as DELETE (synthetic ID, no UUID match) + # This is now CONSISTENT - no silent drop in sync_schema secondary path + assert deletes == ["school_funding_source"] + + def test_partial_map_with_all_renames_intent(self): + """If user wants to rename a column without stored UUID, it becomes a delete. + + This is expected behavior - we cannot detect renames without UUID + matching. The user must ensure UUIDs are preserved across renames. + Better than silent data loss. + """ + stored_id_map = {"col_a": "uuid-a"} + updated_id_map = {"col_a_renamed": "uuid-a", "col_b_new": "uuid-b"} + current_table_columns = ["col_a", "col_b_old"] + + existing_id_map = dict(stored_id_map) + for col_name in current_table_columns: + if col_name not in existing_id_map: + existing_id_map[col_name] = f"table_{col_name}" + + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + + # col_a -> col_a_renamed: detected via UUID match + assert renames == {"col_a": "col_a_renamed"} + # col_b_old has no UUID -> detected as delete (synthetic ID never matches) + assert deletes == ["col_b_old"] + + def test_full_map_rename_works_correctly(self): + """When all columns have UUIDs stored, rename detection is perfect. + + This is the happy path - column_id_map is complete and accurate. + """ + stored_id_map = { + "school_funding_source": "uuid-funding", + "num_tablets_used": "uuid-tablets", + } + updated_id_map = { + "school_funding_type": "uuid-funding", + "num_tablets": "uuid-tablets", + } + current_table_columns = ["school_funding_source", "num_tablets_used"] + + # With full map, supplementing adds nothing extra + existing_id_map = dict(stored_id_map) + for col_name in current_table_columns: + if col_name not in existing_id_map: + existing_id_map[col_name] = f"table_{col_name}" + + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + + # Both renames detected correctly + assert renames == { + "school_funding_source": "school_funding_type", + "num_tablets_used": "num_tablets", + } + assert deletes == [] + + def test_orphan_column_not_silently_dropped(self): + """Orphan columns (in table but not in CSV) are detected as explicit deletes. + + Previously they would be silently dropped by sync_schema secondary path. + Now they show up in the deletes list with clear logging. + """ + stored_id_map = {"col_a": "uuid-a"} + updated_id_map = {"col_a": "uuid-a"} + # orphan_col is in table but neither in stored map nor in CSV + current_table_columns = ["col_a", "orphan_col"] + + existing_id_map = dict(stored_id_map) + for col_name in current_table_columns: + if col_name not in existing_id_map: + existing_id_map[col_name] = f"table_{col_name}" + + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + + assert renames == {} + assert deletes == ["orphan_col"] + + +class TestStoreColumnIdMapStaleCleanup: + """Tests for the store_column_id_map stale entry cleanup logic. + + Bug: store_column_id_map only ADDed/UPDATEd props but never REMOVEd + stale entries. After multiple renames, old column name props would + accumulate in table properties, eventually causing rename detection + to misbehave (e.g. multiple props pointing to the same UUID). + + Fix: store_column_id_map now removes any giga.columnId.* props for + columns not in the new mapping. + """ + + def test_stale_columns_identified(self): + """Test the logic for identifying stale columns to remove.""" + current_props = { + "old_name_a": "uuid-a", + "old_name_b": "uuid-b", + "unchanged": "uuid-c", + } + new_map = { + "new_name_a": "uuid-a", # renamed from old_name_a + "new_name_b": "uuid-b", # renamed from old_name_b + "unchanged": "uuid-c", + } + stale = [name for name in current_props if name not in new_map] + assert sorted(stale) == ["old_name_a", "old_name_b"] + + def test_no_stale_columns(self): + """If new map matches current props, no cleanup needed.""" + current_props = {"col_a": "uuid-a", "col_b": "uuid-b"} + new_map = {"col_a": "uuid-a", "col_b": "uuid-b"} + stale = [name for name in current_props if name not in new_map] + assert stale == [] + + def test_removed_columns_in_stale(self): + """Deleted columns appear in stale list.""" + current_props = {"col_a": "uuid-a", "col_to_delete": "uuid-b"} + new_map = {"col_a": "uuid-a"} + stale = [name for name in current_props if name not in new_map] + assert stale == ["col_to_delete"] + + +class TestPartitionColumnExclusion: + """Regression tests for DELTA_UNSUPPORTED_DROP_PARTITION_COLUMN bug. + + Staging tables have technical partition columns (upload_id, etc.) that are + never present in the business schema CSV. Before the fix these were tagged + with synthetic IDs and detected as deletes, causing: + ALTER TABLE ... DROP COLUMN `upload_id` + which Delta Lake rejects with DELTA_UNSUPPORTED_DROP_PARTITION_COLUMN. + + The fix: skip partition columns when supplementing existing_id_map. + """ + + def test_partition_columns_excluded_from_synthetic_tagging(self): + """Partition columns must not appear in the deletes list.""" + stored_id_map = {"electricity_type": "uuid-elec", "school_name": "uuid-name"} + updated_id_map = { + "electricity_type_test": "uuid-elec", + "school_name": "uuid-name", + } + partition_columns = {"upload_id"} + + # Simulate staging table columns including partition column + current_table_columns = [ + "electricity_type", + "school_name", + "upload_id", # partition column — must be skipped + "change_type", # technical column without UUID + ] + + existing_id_map = dict(stored_id_map) + for col_name in current_table_columns: + if col_name in partition_columns: + continue # THE FIX: skip partition columns + if col_name not in existing_id_map: + existing_id_map[col_name] = f"table_{col_name}" + + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + + assert "upload_id" not in deletes + assert renames == {"electricity_type": "electricity_type_test"} + assert deletes == ["change_type"] + + def test_partition_columns_not_in_deletes_without_fix(self): + """Demonstrates the bug: without the fix, upload_id would be in deletes.""" + stored_id_map = {"electricity_type": "uuid-elec"} + updated_id_map = {"electricity_type_test": "uuid-elec"} + current_table_columns = ["electricity_type", "upload_id"] + + # WITHOUT the fix (no partition exclusion) + existing_id_map_buggy = dict(stored_id_map) + for col_name in current_table_columns: + if col_name not in existing_id_map_buggy: + existing_id_map_buggy[col_name] = f"table_{col_name}" + + _, deletes_buggy = detect_renames_and_deletes( + existing_id_map_buggy, updated_id_map + ) + assert "upload_id" in deletes_buggy # proves the bug existed + + # WITH the fix (partition columns skipped) + partition_columns = {"upload_id"} + existing_id_map_fixed = dict(stored_id_map) + for col_name in current_table_columns: + if col_name in partition_columns: + continue + if col_name not in existing_id_map_fixed: + existing_id_map_fixed[col_name] = f"table_{col_name}" + + _, deletes_fixed = detect_renames_and_deletes( + existing_id_map_fixed, updated_id_map + ) + assert "upload_id" not in deletes_fixed # fix works + + def test_rollback_rename_with_partition_columns(self): + """The exact rollback scenario: electricity_type_test -> electricity_type. + + Staging table has partition column upload_id plus technical columns. + The rollback rename must succeed without attempting to drop upload_id. + """ + stored_id_map = { + "electricity_type_test": "uuid-elec", + "school_name": "uuid-name", + "change_type": "uuid-change", + } + updated_id_map = { + "electricity_type": "uuid-elec", # rollback rename + "school_name": "uuid-name", + "change_type": "uuid-change", + } + partition_columns = {"upload_id"} + current_table_columns = [ + "electricity_type_test", + "school_name", + "change_type", + "upload_id", # partition — must be excluded + "uploaded_columns", + "status", + ] + + existing_id_map = dict(stored_id_map) + for col_name in current_table_columns: + if col_name in partition_columns: + continue + if col_name not in existing_id_map: + existing_id_map[col_name] = f"table_{col_name}" + + renames, deletes = detect_renames_and_deletes(existing_id_map, updated_id_map) + + assert renames == {"electricity_type_test": "electricity_type"} + assert "upload_id" not in deletes + # uploaded_columns and status are technical orphans — correctly detected as deletes + # but NOT partition columns so Delta won't reject them (they can be dropped or ignored + # by execute_deletes' safety guard) + assert "upload_id" not in renames.keys() + assert "upload_id" not in renames.values() + + +class TestPartitionAndCallerManagedExclusion: + """Comprehensive coverage for the exclusion logic in apply_renames_and_deletes. + + These tests model the in-memory logic without touching Spark. Each test + simulates the EXACT logic in apply_renames_and_deletes after my fixes: + excluded = partition_columns | (caller_managed - business_csv) + # Strip excluded from existing_id_map and updated_id_map + # Skip excluded when supplementing synthetic IDs + """ + + @staticmethod + def _apply_logic( + stored_id_map: dict, + business_csv_map: dict, + current_table_columns: list, + partition_columns: set, + caller_managed_columns: set | None = None, + ): + """Mirror the production logic in apply_renames_and_deletes.""" + existing = dict(stored_id_map) + updated = dict(business_csv_map) + excluded = set(partition_columns) + if caller_managed_columns: + excluded |= {c for c in caller_managed_columns if c not in updated} + + # Strip excluded from both maps + for c in list(existing.keys()): + if c in excluded: + del existing[c] + for c in list(updated.keys()): + if c in excluded: + del updated[c] + + # Supplement with synthetic IDs (skip excluded) + for c in current_table_columns: + if c in excluded: + continue + if c not in existing: + existing[c] = f"table_{c}" + + return detect_renames_and_deletes(existing, updated) + + def test_multi_partition_table_all_protected(self): + """All partition columns (not just upload_id) must be protected.""" + # caller_managed_columns reflects the FUTURE (updated) schema + renames, deletes = self._apply_logic( + stored_id_map={"electricity_type": "u-elec"}, + business_csv_map={"electricity_type_test": "u-elec"}, + current_table_columns=[ + "electricity_type", + "year", + "month", + "country_code", + ], + partition_columns={"year", "month", "country_code"}, + caller_managed_columns={ + "electricity_type_test", # new name (from updated_schema) + "year", + "month", + "country_code", + }, + ) + assert renames == {"electricity_type": "electricity_type_test"} + assert "year" not in deletes + assert "month" not in deletes + assert "country_code" not in deletes + assert deletes == [] + + def test_partition_col_with_stored_uuid_not_dropped(self): + """Even if a partition column has a stored UUID (loophole A), it is excluded.""" + renames, deletes = self._apply_logic( + stored_id_map={ + "electricity_type": "u-elec", + "upload_id": "u-bogus-stored-uuid", # should never be acted on + }, + business_csv_map={"electricity_type": "u-elec"}, + current_table_columns=["electricity_type", "upload_id"], + partition_columns={"upload_id"}, + caller_managed_columns={"electricity_type", "upload_id"}, + ) + assert renames == {} + assert "upload_id" not in deletes + assert deletes == [] + + def test_partition_col_in_business_csv_is_ignored(self): + """If a partition column is mistakenly in the business CSV, exclusion still wins.""" + renames, deletes = self._apply_logic( + stored_id_map={"electricity_type": "u-elec"}, + business_csv_map={ + "electricity_type": "u-elec", + "upload_id": "u-bogus-csv", # mistakenly added to business CSV + }, + current_table_columns=["electricity_type", "upload_id"], + partition_columns={"upload_id"}, + caller_managed_columns={"electricity_type", "upload_id"}, + ) + assert renames == {} + assert deletes == [] + + def test_caller_managed_with_stored_uuid_not_dropped(self): + """Loophole A for technical columns: stored UUID for tech col must be ignored.""" + renames, deletes = self._apply_logic( + stored_id_map={ + "school_name": "u-sn", + "change_type": "u-bogus-tech", # tech col should never have UUID + }, + business_csv_map={"school_name": "u-sn"}, + current_table_columns=["school_name", "change_type", "status"], + partition_columns=set(), + caller_managed_columns={"school_name", "change_type", "status"}, + ) + assert renames == {} + assert "change_type" not in deletes + assert "status" not in deletes + assert deletes == [] + + def test_master_table_no_partitions_no_change(self): + """Master tables have no partitions and no tech cols — must work as before.""" + renames, deletes = self._apply_logic( + stored_id_map={ + "school_name": "u-sn", + "old_funding": "u-fund", + "to_drop": "u-drop", + }, + business_csv_map={ + "school_name": "u-sn", + "new_funding": "u-fund", + }, + current_table_columns=["school_name", "old_funding", "to_drop"], + partition_columns=set(), # no partitions + caller_managed_columns=None, # no updated_schema passed + ) + assert renames == {"old_funding": "new_funding"} + assert deletes == ["to_drop"] + + def test_orphan_business_col_still_detected(self): + """Business columns NOT in updated_schema NOR partitions are still subject to delete.""" + renames, deletes = self._apply_logic( + stored_id_map={"keep_me": "u-keep"}, + business_csv_map={"keep_me": "u-keep"}, + # orphan_biz is in the table but NOT in updated_schema (was supposed to be deleted) + current_table_columns=["keep_me", "orphan_biz", "upload_id"], + partition_columns={"upload_id"}, + caller_managed_columns={"keep_me", "upload_id"}, # orphan_biz NOT here + ) + # orphan_biz is not partition, not caller-managed → tagged synthetic → delete + assert renames == {} + assert deletes == ["orphan_biz"] + + def test_rollback_rename_full_scenario(self): + """End-to-end model of the manager's rollback scenario.""" + partition_cols = {"upload_id"} + tech_cols = { + "change_type", + "uploaded_columns", + "status", + "change_id", + "created_at", + "processed_at", + "approval_request_log_id", + "master_version", + } + # All 28 staging columns + current = ["school_id_giga", "school_name", "electricity_type_test"] + current += list(tech_cols) + list(partition_cols) + + # Stored UUIDs (only business) + stored = { + "school_id_giga": "u1", + "school_name": "u2", + "electricity_type_test": "u-elec", # current name in table + } + # New CSV: rollback rename + csv = { + "school_id_giga": "u1", + "school_name": "u2", + "electricity_type": "u-elec", # rollback to old name + } + # Updated schema (full pending) = business + tech + partition + updated_schema_names = set(csv.keys()) | tech_cols | partition_cols + + renames, deletes = self._apply_logic( + stored_id_map=stored, + business_csv_map=csv, + current_table_columns=current, + partition_columns=partition_cols, + caller_managed_columns=updated_schema_names, + ) + + assert renames == {"electricity_type_test": "electricity_type"} + assert deletes == [] + + def test_combined_multi_operations_with_partitions(self): + """Multi rename + multi delete + multi add, all with partition cols.""" + partition_cols = {"upload_id"} + tech_cols = {"change_type", "status"} + current = [ + "keep_a", + "old_b", + "old_c", # business + "to_drop_x", + "to_drop_y", # business deletes + "upload_id", # partition + "change_type", + "status", # tech + ] + stored = { + "keep_a": "u1", + "old_b": "u2", + "old_c": "u3", + "to_drop_x": "u4", + "to_drop_y": "u5", + } + csv = { + "keep_a": "u1", + "new_b": "u2", + "new_c": "u3", # 2 renames + "added_p": "u6", + "added_q": "u7", # 2 adds (handled elsewhere) + } + updated_schema_names = set(csv.keys()) | tech_cols | partition_cols + + renames, deletes = self._apply_logic( + stored_id_map=stored, + business_csv_map=csv, + current_table_columns=current, + partition_columns=partition_cols, + caller_managed_columns=updated_schema_names, + ) + + assert renames == {"old_b": "new_b", "old_c": "new_c"} + assert sorted(deletes) == ["to_drop_x", "to_drop_y"] + + +class TestSyncSchemaSafeDropPath: + """Tests for the sync_schema secondary drop path safety fix. + + Bug: When schema_name was provided and apply_renames_and_deletes + missed a column (e.g. due to incomplete column_id_map), the secondary + path in sync_schema would silently drop the column by name comparison, + causing data loss. + + Fix: When schema_name is provided, the secondary path now logs a + WARNING and leaves the column in place. apply_renames_and_deletes + is the authoritative path for both renames and deletes. + + Note: These tests verify the LOGIC of the new safe drop path; they + don't run sync_schema directly (which requires Spark). + """ + + def test_safe_drop_path_with_schema_name(self): + """When schema_name is provided, leftover columns should NOT be dropped.""" + schema_name = "school_geolocation" + removed_columns = {"school_funding_source"} + + # Simulate the new safe-drop logic + should_drop = [] + if removed_columns: + if schema_name is not None: + # New behavior: warn but don't drop + pass + else: + # Legacy behavior: drop by name + should_drop = list(removed_columns) + + assert should_drop == [] + + def test_safe_drop_path_without_schema_name(self): + """Legacy callers (no schema_name) keep old drop-by-name behavior.""" + schema_name = None + removed_columns = {"col_to_drop"} + + should_drop = [] + if removed_columns: + if schema_name is not None: + pass + else: + should_drop = list(removed_columns) + + assert should_drop == ["col_to_drop"] + + +class TestPrimaryKeyProtection: + """Unit tests for primary-key column protection in rename/delete detection. + + A primary key column must NEVER be renamed or deleted, even if the + schema CSV is updated with a different name for the same UUID. + """ + + def _apply_with_pk( + self, + stored_id_map: dict[str, str], + business_csv_map: dict[str, str], + pk_names: set[str], + persisted_pk_uuids: set[str] | None = None, + ) -> tuple[dict[str, str], list[str], set[str]]: + """Mimic the detection + PK-filtering logic from apply_renames_and_deletes. + + ``persisted_pk_uuids`` mimics the ``giga.pkColumnIds`` table property + that persists PK UUIDs even when the CSV removes the column. + """ + existing_id_map = dict(stored_id_map) + updated_id_map = dict(business_csv_map) + persisted_pk_uuids = set(persisted_pk_uuids or ()) + + # detect + id_to_name = {v: k for k, v in updated_id_map.items()} + renames: dict[str, str] = {} + deletes: list[str] = [] + for name, uid in existing_id_map.items(): + if uid in id_to_name and id_to_name[uid] != name: + renames[name] = id_to_name[uid] + elif uid not in id_to_name: + deletes.append(name) + + # PK filtering (same logic as production code). + # PK UUIDs come from BOTH the CSV-declared PK names and any persisted + # PK UUIDs (the latter mimics ``giga.pkColumnIds`` on the data table). + pk_uuids = {updated_id_map[n] for n in pk_names if n in updated_id_map} + pk_uuids |= persisted_pk_uuids + renames_original = dict(renames) + if pk_uuids: + blocked_renames = { + old_name + for old_name, new_name in renames.items() + if existing_id_map.get(old_name) in pk_uuids + } + for old_name in blocked_renames: + del renames[old_name] + blocked_deletes = [ + col_name + for col_name in deletes + if existing_id_map.get(col_name) in pk_uuids + ] + for col_name in blocked_deletes: + deletes.remove(col_name) + + # blocked new names to exclude from add logic + blocked_new_names = set() + if pk_uuids: + blocked_new_names = { + new_name + for old_name, new_name in renames_original.items() + if old_name + in { + o + for o, _ in renames_original.items() + if existing_id_map.get(o) in pk_uuids + } + } + + return renames, deletes, blocked_new_names + + def test_pk_rename_is_blocked(self): + """A primary key column rename must be blocked.""" + stored = {"school_id_giga": "u1", "latitude": "u2"} + csv = {"school_id_giga_renamed": "u1", "latitude": "u2"} + pk_names = {"school_id_giga_renamed"} + + renames, deletes, blocked = self._apply_with_pk(stored, csv, pk_names) + assert renames == {} + assert deletes == [] + assert blocked == {"school_id_giga_renamed"} + + def test_pk_delete_is_blocked(self): + """A primary key column delete must be blocked. + + Scenario: the schema CSV no longer contains the PK column at all, + so ``primary_key_columns`` (derived from the CSV) is empty. The + PK UUID is still recorded on the data table via + ``giga.pkColumnIds``; that persisted set must keep the column + protected from being dropped. + """ + stored = {"school_id_giga": "u1", "latitude": "u2"} + csv = {"latitude": "u2"} # school_id_giga entirely removed from CSV + pk_names: set[str] = set() # CSV has no PK markers + persisted_pks = {"u1"} # but UUID u1 was historically the PK + + renames, deletes, blocked = self._apply_with_pk( + stored, csv, pk_names, persisted_pks + ) + assert renames == {} + # PK delete must be blocked — school_id_giga stays + assert deletes == [] + assert blocked == set() + + def test_pk_delete_without_persisted_uuid_is_allowed(self): + """Without persisted PK UUIDs, the legacy behaviour is preserved. + + This documents the prior (pre-fix) behaviour for tables that have + not yet had ``giga.pkColumnIds`` written — the delete proceeds. + """ + stored = {"school_id_giga": "u1", "latitude": "u2"} + csv = {"latitude": "u2"} + pk_names: set[str] = set() + + renames, deletes, blocked = self._apply_with_pk( + stored, csv, pk_names, persisted_pk_uuids=set() + ) + assert renames == {} + # No PK protection available → delete proceeds + assert deletes == ["school_id_giga"] + assert blocked == set() + + def test_non_pk_rename_is_allowed(self): + """Non-PK column renames should still proceed normally.""" + stored = {"school_id_giga": "u1", "latitude": "u2"} + csv = {"school_id_giga": "u1", "lat_renamed": "u2"} + pk_names = {"school_id_giga"} + + renames, deletes, blocked = self._apply_with_pk(stored, csv, pk_names) + assert renames == {"latitude": "lat_renamed"} + assert deletes == [] + assert blocked == set() + + def test_pk_and_regular_rename_together(self): + """Mixed scenario: PK rename blocked, regular rename allowed.""" + stored = {"school_id_giga": "u1", "latitude": "u2", "old_col": "u3"} + csv = { + "school_id_giga_renamed": "u1", + "lat_renamed": "u2", + "new_col": "u3", + } + pk_names = {"school_id_giga_renamed"} + + renames, deletes, blocked = self._apply_with_pk(stored, csv, pk_names) + assert renames == {"latitude": "lat_renamed", "old_col": "new_col"} + assert deletes == [] + assert blocked == {"school_id_giga_renamed"}