From aa85ea1f6d30acbec4c9923657234b2aff0a1e0e Mon Sep 17 00:00:00 2001 From: subhankarb Date: Mon, 7 Oct 2024 16:33:19 +0530 Subject: [PATCH 1/2] add: oracle integration --- dcs_core/core/common/models/configuration.py | 2 + .../configuration/configuration_parser.py | 1 + dcs_core/core/datasource/manager.py | 1 + dcs_core/integrations/databases/oracle.py | 49 +++++++++++++++++++ docker-compose-test.yaml | 13 +++++ pyproject.toml | 5 +- 6 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 dcs_core/integrations/databases/oracle.py diff --git a/dcs_core/core/common/models/configuration.py b/dcs_core/core/common/models/configuration.py index 8516c935..8b3e4260 100644 --- a/dcs_core/core/common/models/configuration.py +++ b/dcs_core/core/common/models/configuration.py @@ -74,6 +74,8 @@ class DataSourceConnectionConfiguration: spark_session: Optional[Any] = None # Spark specific configuration + service_name: Optional[str] = None # Oracle specific configuration + @dataclass class DataSourceConfiguration: diff --git a/dcs_core/core/configuration/configuration_parser.py b/dcs_core/core/configuration/configuration_parser.py index 01c2df8d..a705fdc0 100644 --- a/dcs_core/core/configuration/configuration_parser.py +++ b/dcs_core/core/configuration/configuration_parser.py @@ -75,6 +75,7 @@ def _data_source_connection_config_parser( account=config["connection"].get("account"), warehouse=config["connection"].get("warehouse"), role=config["connection"].get("role"), + service_name=config["connection"].get("service_name"), ) return connection_config diff --git a/dcs_core/core/datasource/manager.py b/dcs_core/core/datasource/manager.py index 44d580c7..3bcde07e 100644 --- a/dcs_core/core/datasource/manager.py +++ b/dcs_core/core/datasource/manager.py @@ -40,6 +40,7 @@ class DataSourceManager: "redshift": "RedShiftDataSource", "snowflake": "SnowFlakeDataSource", "mssql": "MssqlDataSource", + "oracle": "OracleDataSource", } def __init__(self, config: Configuration): diff --git a/dcs_core/integrations/databases/oracle.py b/dcs_core/integrations/databases/oracle.py new file mode 100644 index 00000000..f194be6f --- /dev/null +++ b/dcs_core/integrations/databases/oracle.py @@ -0,0 +1,49 @@ +# Copyright 2022-present, the Waterdip Labs Pvt. Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any, Dict + +from sqlalchemy import create_engine +from sqlalchemy.engine import URL + +from dcs_core.core.common.errors import DataChecksDataSourcesConnectionError +from dcs_core.core.datasource.sql_datasource import SQLDataSource + + +class OracleDataSource(SQLDataSource): + def __init__(self, data_source_name: str, data_connection: Dict): + super().__init__(data_source_name, data_connection) + + def connect(self) -> Any: + """ + Connect to the data source + """ + try: + engine = create_engine( + f"oracle+oracledb://:@", + thick_mode=False, + connect_args={ + "user": self.data_connection.get("username"), + "password": self.data_connection.get("password"), + "host": self.data_connection.get("host"), + "port": self.data_connection.get("port"), + "service_name": self.data_connection.get("service_name"), + }, + ) + self.connection = engine.connect() + return self.connection + except Exception as e: + raise DataChecksDataSourcesConnectionError( + message=f"Failed to connect to PostgresSQL data source: [{str(e)}]" + ) diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml index 660c4b67..57fd2a60 100644 --- a/docker-compose-test.yaml +++ b/docker-compose-test.yaml @@ -41,6 +41,19 @@ services: - test-postgres restart: unless-stopped + test-dc-oracle: + image: oracle/database:21.3.0-xe + ports: + - 1521:1521 + - 5500:5500 + volumes: + - ./.oracle/oradata:/opt/oracle/oradata + - ./.oracle/scripts/setup:/opt/oracle/scripts/setup + - ./.oracle/scripts/startup:/opt/oracle/scripts/startup + environment: + - ORACLE_PWD=password + - ORACLE_CHARACTERSET=AL32UTF8 + networks: test-opensearch-net: test-postgres: diff --git a/pyproject.toml b/pyproject.toml index c1b6cdb4..af143a35 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ snowflake-sqlalchemy = { version="^1.5.3", optional=true } pyodbc = { version="^5.0.1", optional=true } psycopg2-binary = {version = "^2.9.9", optional = true} pyspark = { version="^3.2.1", optional=true } +oracledb = { version=">=1.1.1,<3.0.0", optional=true } [tool.poetry.group.dev.dependencies] pytest = "^7.1.3" @@ -75,6 +76,7 @@ databricks = ["databricks-sql-connector"] elasticsearch = ["elasticsearch"] snowflake = ["snowflake-sqlalchemy"] spark = ["pyspark"] +oracle = ["oracledb"] all = [ "psycopg2-binary", "pymysql", @@ -84,7 +86,8 @@ all = [ "elasticsearch", "snowflake-sqlalchemy", "pyodbc", - "pyspark" + "pyspark", + "oracledb" ] [tool.poetry.scripts] From e305ca27ec729d86b58f026a314aeffb6ffb5ff1 Mon Sep 17 00:00:00 2001 From: Neeraj Kumar Date: Mon, 7 Oct 2024 17:46:26 +0530 Subject: [PATCH 2/2] fix: docker compose and datasource type --- dcs_core/core/common/models/configuration.py | 1 + dcs_core/integrations/databases/oracle.py | 2 +- docker-compose-test.yaml | 25 +- poetry.lock | 272 +++++-------------- 4 files changed, 84 insertions(+), 216 deletions(-) diff --git a/dcs_core/core/common/models/configuration.py b/dcs_core/core/common/models/configuration.py index 8b3e4260..020990b6 100644 --- a/dcs_core/core/common/models/configuration.py +++ b/dcs_core/core/common/models/configuration.py @@ -38,6 +38,7 @@ class DataSourceType(str, Enum): SNOWFLAKE = "snowflake" DATABRICKS = "databricks" SPARK_DF = "spark_df" + ORACLE = "oracle" class DataSourceLanguageSupport(str, Enum): diff --git a/dcs_core/integrations/databases/oracle.py b/dcs_core/integrations/databases/oracle.py index f194be6f..076d69b2 100644 --- a/dcs_core/integrations/databases/oracle.py +++ b/dcs_core/integrations/databases/oracle.py @@ -45,5 +45,5 @@ def connect(self) -> Any: return self.connection except Exception as e: raise DataChecksDataSourcesConnectionError( - message=f"Failed to connect to PostgresSQL data source: [{str(e)}]" + message=f"Failed to connect to Oracle data source: [{str(e)}]" ) diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml index 57fd2a60..79c63863 100644 --- a/docker-compose-test.yaml +++ b/docker-compose-test.yaml @@ -42,17 +42,22 @@ services: restart: unless-stopped test-dc-oracle: - image: oracle/database:21.3.0-xe + image: gvenzl/oracle-xe + container_name: test-oracle-db + environment: + - ORACLE_PASSWORD=password + - ORACLE_DISABLE_ASYNCH_IO=true ports: - - 1521:1521 - - 5500:5500 + - "1521:1521" + - "5500:5500" volumes: - - ./.oracle/oradata:/opt/oracle/oradata - - ./.oracle/scripts/setup:/opt/oracle/scripts/setup - - ./.oracle/scripts/startup:/opt/oracle/scripts/startup - environment: - - ORACLE_PWD=password - - ORACLE_CHARACTERSET=AL32UTF8 + - test-oracle-data:/opt/oracle/oradata + restart: always + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5500/em"] + interval: 1m30s + timeout: 30s + retries: 5 networks: test-opensearch-net: @@ -64,4 +69,6 @@ volumes: test-opensearch-data: test-dc-mysql: test-postgres: + driver: local + test-oracle-data: driver: local \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 50e7de06..3eaf34c1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "anyio" version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -27,7 +26,6 @@ trio = ["trio (>=0.23)"] name = "appnope" version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -39,7 +37,6 @@ files = [ name = "argon2-cffi" version = "23.1.0" description = "Argon2 for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -60,7 +57,6 @@ typing = ["mypy"] name = "argon2-cffi-bindings" version = "21.2.0" description = "Low-level CFFI bindings for Argon2" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -98,7 +94,6 @@ tests = ["pytest"] name = "arrow" version = "1.3.0" description = "Better dates & times for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -112,13 +107,12 @@ types-python-dateutil = ">=2.8.10" [package.extras] doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] -test = ["dateparser (>=1.0.0,<2.0.0)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (>=3.0.0,<4.0.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] [[package]] name = "asn1crypto" version = "1.5.1" description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" -category = "main" optional = true python-versions = "*" files = [ @@ -130,7 +124,6 @@ files = [ name = "asttokens" version = "2.4.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -149,7 +142,6 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] name = "async-lru" version = "2.0.4" description = "Simple LRU cache for asyncio" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -164,7 +156,6 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} name = "attrs" version = "24.2.0" description = "Classes Without Boilerplate" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -184,7 +175,6 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] name = "babel" version = "2.16.0" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -199,7 +189,6 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] name = "beautifulsoup4" version = "4.12.3" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -221,7 +210,6 @@ lxml = ["lxml"] name = "bleach" version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -240,7 +228,6 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] name = "cachetools" version = "5.5.0" description = "Extensible memoizing collections and decorators" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -252,7 +239,6 @@ files = [ name = "certifi" version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -264,7 +250,6 @@ files = [ name = "cffi" version = "1.17.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -344,7 +329,6 @@ pycparser = "*" name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -356,7 +340,6 @@ files = [ name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -456,7 +439,6 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -471,7 +453,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -483,7 +464,6 @@ files = [ name = "comm" version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -501,7 +481,6 @@ test = ["pytest"] name = "coverage" version = "7.6.1" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -589,7 +568,6 @@ toml = ["tomli"] name = "cryptography" version = "43.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -639,7 +617,6 @@ test-randomorder = ["pytest-randomly"] name = "databricks-sql-connector" version = "3.4.0" description = "Databricks SQL Connector for Python" -category = "main" optional = true python-versions = "<4.0.0,>=3.8.0" files = [ @@ -669,7 +646,6 @@ sqlalchemy = ["sqlalchemy (>=2.0.21)"] name = "debugpy" version = "1.8.5" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -701,7 +677,6 @@ files = [ name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -713,7 +688,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -725,7 +699,6 @@ files = [ name = "distlib" version = "0.3.8" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -737,7 +710,6 @@ files = [ name = "elasticsearch" version = "7.17.9" description = "Python client for Elasticsearch" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" files = [ @@ -759,7 +731,6 @@ requests = ["requests (>=2.4.0,<3.0.0)"] name = "et-xmlfile" version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -771,7 +742,6 @@ files = [ name = "events" version = "0.5" description = "Bringing the elegance of C# EventHandler to Python" -category = "main" optional = true python-versions = "*" files = [ @@ -782,7 +752,6 @@ files = [ name = "exceptiongroup" version = "1.2.2" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -797,7 +766,6 @@ test = ["pytest (>=6)"] name = "executing" version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -812,7 +780,6 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth name = "fastjsonschema" version = "2.20.0" description = "Fastest Python implementation of JSON schema" -category = "dev" optional = false python-versions = "*" files = [ @@ -827,7 +794,6 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc name = "filelock" version = "3.16.0" description = "A platform independent file lock." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -844,7 +810,6 @@ typing = ["typing-extensions (>=4.12.2)"] name = "findspark" version = "1.4.2" description = "Find pyspark to make it importable." -category = "dev" optional = false python-versions = "*" files = [ @@ -856,7 +821,6 @@ files = [ name = "fqdn" version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -category = "dev" optional = false python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" files = [ @@ -868,7 +832,6 @@ files = [ name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "dev" optional = false python-versions = "*" files = [ @@ -886,7 +849,6 @@ dev = ["flake8", "markdown", "twine", "wheel"] name = "google-api-core" version = "2.19.2" description = "Google API client core library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -898,11 +860,11 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" @@ -918,7 +880,6 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] name = "google-auth" version = "2.34.0" description = "Google Authentication Library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -942,7 +903,6 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-cloud-bigquery" version = "3.25.0" description = "Google BigQuery API client library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -951,7 +911,7 @@ files = [ ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} google-auth = ">=2.14.1,<3.0.0dev" google-cloud-core = ">=1.6.0,<3.0.0dev" google-resumable-media = ">=0.6.0,<3.0dev" @@ -974,7 +934,6 @@ tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] name = "google-cloud-core" version = "2.4.1" description = "Google Cloud API client core library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -983,7 +942,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" [package.extras] @@ -993,7 +952,6 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] name = "google-crc32c" version = "1.6.0" description = "A python wrapper of the C library 'Google CRC32C'" -category = "main" optional = true python-versions = ">=3.9" files = [ @@ -1033,7 +991,6 @@ testing = ["pytest"] name = "google-resumable-media" version = "2.7.2" description = "Utilities for Google Media Downloads and Resumable Uploads" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1052,7 +1009,6 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] name = "googleapis-common-protos" version = "1.65.0" description = "Common protobufs used in Google APIs" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1070,7 +1026,6 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "greenlet" version = "3.1.0" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1150,7 +1105,6 @@ test = ["objgraph", "psutil"] name = "grpcio" version = "1.66.1" description = "HTTP/2-based RPC framework" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1209,7 +1163,6 @@ protobuf = ["grpcio-tools (>=1.66.1)"] name = "grpcio-status" version = "1.66.1" description = "Status proto mapping for gRPC" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1226,7 +1179,6 @@ protobuf = ">=5.26.1,<6.0dev" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1238,7 +1190,6 @@ files = [ name = "httpcore" version = "1.0.5" description = "A minimal low-level HTTP client." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1253,14 +1204,13 @@ h11 = ">=0.13,<0.15" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" version = "0.27.2" description = "The next generation HTTP client." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1271,22 +1221,21 @@ files = [ [package.dependencies] anyio = "*" certifi = "*" -httpcore = ">=1.0.0,<2.0.0" +httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" version = "2.6.1" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1301,7 +1250,6 @@ license = ["ukkonen"] name = "idna" version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1316,7 +1264,6 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 name = "importlib-metadata" version = "8.5.0" description = "Read metadata from Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1340,7 +1287,6 @@ type = ["pytest-mypy"] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1352,7 +1298,6 @@ files = [ name = "ipykernel" version = "6.29.5" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1366,7 +1311,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -1386,7 +1331,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio name = "ipython" version = "8.18.1" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1424,7 +1368,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa name = "ipywidgets" version = "8.1.5" description = "Jupyter interactive widgets" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1446,7 +1389,6 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] name = "isoduration" version = "20.11.0" description = "Operations with ISO 8601 durations" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1461,7 +1403,6 @@ arrow = ">=0.15.0" name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1481,7 +1422,6 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1499,7 +1439,6 @@ i18n = ["Babel (>=2.7)"] name = "json5" version = "0.9.25" description = "A Python implementation of the JSON5 data format." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1511,7 +1450,6 @@ files = [ name = "jsonpointer" version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1523,7 +1461,6 @@ files = [ name = "jsonschema" version = "4.23.0" description = "An implementation of JSON Schema validation for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1553,7 +1490,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1568,7 +1504,6 @@ referencing = ">=0.31.0" name = "jupyter" version = "1.1.1" description = "Jupyter metapackage. Install all the Jupyter components in one go." -category = "dev" optional = false python-versions = "*" files = [ @@ -1588,7 +1523,6 @@ notebook = "*" name = "jupyter-client" version = "8.6.2" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1598,7 +1532,7 @@ files = [ [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -1612,7 +1546,6 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt name = "jupyter-console" version = "6.6.3" description = "Jupyter terminal console" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1624,7 +1557,7 @@ files = [ ipykernel = ">=6.14" ipython = "*" jupyter-client = ">=7.0.0" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" prompt-toolkit = ">=3.0.30" pygments = "*" pyzmq = ">=17" @@ -1637,7 +1570,6 @@ test = ["flaky", "pexpect", "pytest"] name = "jupyter-core" version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1658,7 +1590,6 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" name = "jupyter-events" version = "0.10.0" description = "Jupyter Event System library" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1684,7 +1615,6 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p name = "jupyter-lsp" version = "2.2.5" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1700,7 +1630,6 @@ jupyter-server = ">=1.1.2" name = "jupyter-server" version = "2.14.2" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1713,7 +1642,7 @@ anyio = ">=3.1.0" argon2-cffi = ">=21.1" jinja2 = ">=3.0.3" jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" jupyter-events = ">=0.9.0" jupyter-server-terminals = ">=0.4.4" nbconvert = ">=6.4.4" @@ -1737,7 +1666,6 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console name = "jupyter-server-terminals" version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1757,7 +1685,6 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> name = "jupyterlab" version = "4.2.5" description = "JupyterLab computational environment" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1793,7 +1720,6 @@ upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)" name = "jupyterlab-pygments" version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1805,7 +1731,6 @@ files = [ name = "jupyterlab-server" version = "2.27.3" description = "A set of server components for JupyterLab and JupyterLab like applications." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1832,7 +1757,6 @@ test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-v name = "jupyterlab-widgets" version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1844,7 +1768,6 @@ files = [ name = "loguru" version = "0.7.2" description = "Python logging made (stupidly) simple" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1863,7 +1786,6 @@ dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptio name = "lz4" version = "4.3.3" description = "LZ4 Bindings for Python" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1914,7 +1836,6 @@ tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] name = "markdown" version = "3.7" description = "Python implementation of John Gruber's Markdown." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1933,7 +1854,6 @@ testing = ["coverage", "pyyaml"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1958,7 +1878,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2028,7 +1947,6 @@ files = [ name = "matplotlib-inline" version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2043,7 +1961,6 @@ traitlets = "*" name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2055,7 +1972,6 @@ files = [ name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2067,7 +1983,6 @@ files = [ name = "mistune" version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2079,7 +1994,6 @@ files = [ name = "mkdocs" version = "1.6.1" description = "Project documentation with Markdown." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2111,7 +2025,6 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp name = "mkdocs-get-deps" version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2129,7 +2042,6 @@ pyyaml = ">=5.1" name = "mkdocs-material" version = "8.5.11" description = "Documentation that simply works" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2150,7 +2062,6 @@ requests = ">=2.26" name = "mkdocs-material-extensions" version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2162,7 +2073,6 @@ files = [ name = "mongomock" version = "4.2.0.post1" description = "Fake pymongo stub for testing simple MongoDB-dependent code" -category = "dev" optional = false python-versions = "*" files = [ @@ -2183,7 +2093,6 @@ pymongo = ["pymongo"] name = "nbclient" version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -2193,7 +2102,7 @@ files = [ [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" nbformat = ">=5.1" traitlets = ">=5.4" @@ -2206,7 +2115,6 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= name = "nbconvert" version = "7.16.4" 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 ...`)." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2245,7 +2153,6 @@ webpdf = ["playwright"] name = "nbformat" version = "5.10.4" description = "The Jupyter Notebook format" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2256,7 +2163,7 @@ files = [ [package.dependencies] fastjsonschema = ">=2.15" jsonschema = ">=2.6" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" traitlets = ">=5.1" [package.extras] @@ -2267,7 +2174,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nest-asyncio" version = "1.6.0" description = "Patch asyncio to allow nested event loops" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2279,7 +2185,6 @@ files = [ name = "nodeenv" version = "1.9.1" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -2291,7 +2196,6 @@ files = [ name = "notebook" version = "7.2.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2315,7 +2219,6 @@ test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4 name = "notebook-shim" version = "0.2.4" description = "A shim layer for notebook traits and config" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2333,7 +2236,6 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" name = "numpy" version = "1.26.4" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ @@ -2379,7 +2281,6 @@ files = [ name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -2396,7 +2297,6 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "openpyxl" version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2411,7 +2311,6 @@ et-xmlfile = "*" name = "opensearch-py" version = "2.7.1" description = "Python client for OpenSearch" -category = "main" optional = true python-versions = "<4,>=3.8" files = [ @@ -2435,11 +2334,53 @@ develop = ["black (>=24.3.0)", "botocore", "coverage (<8.0.0)", "jinja2", "myst- docs = ["aiohttp (>=3.9.4,<4)", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] kerberos = ["requests-kerberos"] +[[package]] +name = "oracledb" +version = "2.4.1" +description = "Python interface to Oracle Database" +optional = true +python-versions = ">=3.8" +files = [ + {file = "oracledb-2.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b8064f272515f841f5f48159eb209ed8f798901af73f64ef9ec87ae124d16c33"}, + {file = "oracledb-2.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b3940be302b15e86f54f7072ee596cfcacf656df904f662efcb8ebbb713fbf8"}, + {file = "oracledb-2.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc56f1880c754e84e182dcd8428d192601976fad72c96cd92629468755159b70"}, + {file = "oracledb-2.4.1-cp310-cp310-win32.whl", hash = "sha256:65dd659f0187c3915d61714ef4510f64a52f6fb84a67c5a0672afa8365a9d1c1"}, + {file = "oracledb-2.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:b751da022c0c85fc3da898c2fcafb1c5cf3c16c80a84a5c0f5a618a445f9d275"}, + {file = "oracledb-2.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4fc4b426f3d44ee3da81fe1bb328447fbaab005bf028ca2b2179bdd223a2bec4"}, + {file = "oracledb-2.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecac3c13e02c84ac09c1491a43423de3075726638919bae45dd5bfa42b241a89"}, + {file = "oracledb-2.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0e25f60f8faf008f4480eaec88b8e0a13ca552ac46fd018af6d3bf3955eeb4"}, + {file = "oracledb-2.4.1-cp311-cp311-win32.whl", hash = "sha256:b5cb64c0e58b806ada721f50c5eaca9d335f9b1758d3de8990cebbcb2cc63981"}, + {file = "oracledb-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5a25f6da4ff0b99ae6a893b6fce5caf3bc036a1d5e912eaf76c6c794a2c3972c"}, + {file = "oracledb-2.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:70efa2f6caf958fb0234fee9514f6de219f71b1b16e69176f09290a33024e553"}, + {file = "oracledb-2.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cfaab99b2b84318c34a74af18452f59279c520a08a9307f0ec041ab2bf4d9d8"}, + {file = "oracledb-2.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047fa173868fae989150bd8e8fa7d4d28d9228ae0f3367a3c2f662c9202599b1"}, + {file = "oracledb-2.4.1-cp312-cp312-win32.whl", hash = "sha256:24c68c030cada6db5611a2d915576741cf34e369d324756fbefcd295ba6a551c"}, + {file = "oracledb-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:7e9612ec44dfae89bd2ca08b6d655de2f83b274d9732766797fdb4759cfb9952"}, + {file = "oracledb-2.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:898a60d5841a5cfa251aa38b789f25caa11dcef91802b60e912bf59b78d142f3"}, + {file = "oracledb-2.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bc848aaa6c8dbefd9c725d320005ba3f2488afb67f1334865e3d133367be591"}, + {file = "oracledb-2.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62ef605f1e5a62ad99424966dcac94a60e63d7f8a71b613e4253f36c9d021a84"}, + {file = "oracledb-2.4.1-cp313-cp313-win32.whl", hash = "sha256:eb9cc6afe041992fd6fa6a4727b412033cfd6d4a9b372c0e0d54e65c4a6b632f"}, + {file = "oracledb-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:e00b44811b96e0209941939461aa1e119d62fa154f81b487a3c76c85a38eefc7"}, + {file = "oracledb-2.4.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:98c9b42a1996a70ff9aec8ce3c1761fd4c635c046f36444c8c17a729c3516e52"}, + {file = "oracledb-2.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7df5a8c94f47e6a7805e9626a1d42564733678fd0f1dc9ff6e21ede2b782717"}, + {file = "oracledb-2.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06457518cbbba739308cb745142421c413023b553684f16628a8c7fc04ca4d7e"}, + {file = "oracledb-2.4.1-cp38-cp38-win32.whl", hash = "sha256:78b02640b16931d1557b9b7fa9f6cb81bc061ede8dc3c4d38805be1074f0f7e0"}, + {file = "oracledb-2.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:38e10bef4f4b797647696706ecb1472cf7c1e31e0ab475fc2192cf6237a215b6"}, + {file = "oracledb-2.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cc0730317184a1fef7046ee5a87c9b2c1e18693018058994b3f0c0a8d4d1c28a"}, + {file = "oracledb-2.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d12161243e888b54baaed607d9c14a679412cca8ee1a7f2548c9c0944f357df"}, + {file = "oracledb-2.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bbdd76da2506b5a533c684e120ed943dcb168d4b6312211ba0218e376d3683b"}, + {file = "oracledb-2.4.1-cp39-cp39-win32.whl", hash = "sha256:673b0018f8044447802f4327e19f43aa971edf9fc94221988629a0e9495c9969"}, + {file = "oracledb-2.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c119c285b0f2274c6fe9eafee89207d1672a1288f6105f5aa3f9a0c771e85ec3"}, + {file = "oracledb-2.4.1.tar.gz", hash = "sha256:bd5976bef0e466e0f9d1b9f6531fb5b8171dc8534717ccb04b26e680b6c7571d"}, +] + +[package.dependencies] +cryptography = ">=3.2.1" + [[package]] name = "overrides" version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2451,7 +2392,6 @@ files = [ name = "packaging" version = "24.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2463,7 +2403,6 @@ files = [ name = "pandas" version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2499,8 +2438,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, ] python-dateutil = ">=2.8.1" pytz = ">=2020.1" @@ -2512,7 +2451,6 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] name = "pandocfilters" version = "1.5.1" description = "Utilities for writing pandoc filters in python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2524,7 +2462,6 @@ files = [ name = "parso" version = "0.8.4" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2540,7 +2477,6 @@ testing = ["docopt", "pytest"] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2552,7 +2488,6 @@ files = [ name = "pexpect" version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -2567,7 +2502,6 @@ ptyprocess = ">=0.5" name = "platformdirs" version = "4.3.3" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2584,7 +2518,6 @@ type = ["mypy (>=1.11.2)"] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2600,7 +2533,6 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2619,7 +2551,6 @@ virtualenv = ">=20.10.0" name = "prometheus-client" version = "0.20.0" description = "Python client for the Prometheus monitoring system." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2634,7 +2565,6 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.47" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -2649,7 +2579,6 @@ wcwidth = "*" name = "proto-plus" version = "1.24.0" description = "Beautiful, Pythonic protocol buffers." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2667,7 +2596,6 @@ testing = ["google-api-core (>=1.31.5)"] name = "protobuf" version = "5.28.1" description = "" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2688,7 +2616,6 @@ files = [ name = "psutil" version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -2718,7 +2645,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "psycopg2-binary" version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2800,7 +2726,6 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -2812,7 +2737,6 @@ files = [ name = "pure-eval" version = "0.2.3" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -2827,7 +2751,6 @@ tests = ["pytest"] name = "py4j" version = "0.10.9.7" description = "Enables Python programs to dynamically access arbitrary Java objects" -category = "main" optional = false python-versions = "*" files = [ @@ -2839,7 +2762,6 @@ files = [ name = "pyarrow" version = "16.1.0" description = "Python library for Apache Arrow" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2888,7 +2810,6 @@ numpy = ">=1.16.6" name = "pyasn1" version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2900,7 +2821,6 @@ files = [ name = "pyasn1-modules" version = "0.4.1" description = "A collection of ASN.1-based protocols modules" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2915,7 +2835,6 @@ pyasn1 = ">=0.4.6,<0.7.0" name = "pycparser" version = "2.22" description = "C parser in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2927,7 +2846,6 @@ files = [ name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2942,7 +2860,6 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pyjwt" version = "2.9.0" description = "JSON Web Token implementation in Python" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2960,7 +2877,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pymdown-extensions" version = "10.9" description = "Extension pack for Python Markdown." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2979,7 +2895,6 @@ extra = ["pygments (>=2.12)"] name = "pymysql" version = "1.1.1" description = "Pure Python MySQL Driver" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2998,7 +2913,6 @@ rsa = ["cryptography"] name = "pyodbc" version = "5.1.0" description = "DB API module for ODBC" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -3039,7 +2953,6 @@ files = [ name = "pyopenssl" version = "24.2.1" description = "Python wrapper module around the OpenSSL library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3058,7 +2971,6 @@ test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] name = "pyparsing" version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" files = [ @@ -3073,7 +2985,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyspark" version = "3.5.2" description = "Apache Spark Python API" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3094,7 +3005,6 @@ sql = ["numpy (>=1.15,<2)", "pandas (>=1.0.5)", "pyarrow (>=4.0.0)"] name = "pytest" version = "7.4.4" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3117,7 +3027,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3136,7 +3045,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-docker" version = "3.1.1" description = "Simple pytest fixtures for Docker and Docker Compose based tests" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3156,7 +3064,6 @@ tests = ["mypy (>=0.500,<2.000)", "pytest-mypy (>=0.10,<1.0)", "pytest-pycodesty name = "pytest-mock" version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3174,7 +3081,6 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3189,7 +3095,6 @@ six = ">=1.5" name = "python-dotenv" version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3204,7 +3109,6 @@ cli = ["click (>=5.0)"] name = "python-json-logger" version = "2.0.7" description = "A python library adding a json log formatter" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3216,7 +3120,6 @@ files = [ name = "pytz" version = "2023.4" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -3228,7 +3131,6 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "dev" optional = false python-versions = "*" files = [ @@ -3252,7 +3154,6 @@ files = [ name = "pywinpty" version = "2.0.13" description = "Pseudo terminal support for Windows from Python." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3268,7 +3169,6 @@ files = [ name = "pyyaml" version = "6.0.2" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3331,7 +3231,6 @@ files = [ name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3346,7 +3245,6 @@ pyyaml = "*" name = "pyzmq" version = "26.2.0" description = "Python bindings for 0MQ" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3468,7 +3366,6 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "referencing" version = "0.35.1" description = "JSON Referencing + Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3484,7 +3381,6 @@ rpds-py = ">=0.7.0" name = "requests" version = "2.32.3" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3506,7 +3402,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "rfc3339-validator" version = "0.1.4" description = "A pure python RFC3339 validator" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -3521,7 +3416,6 @@ six = "*" name = "rfc3986-validator" version = "0.1.1" description = "Pure python rfc3986 validator" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -3533,7 +3427,6 @@ files = [ name = "rich" version = "13.8.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -3552,7 +3445,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.20.0" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3665,7 +3557,6 @@ files = [ name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = true python-versions = ">=3.6,<4" files = [ @@ -3680,7 +3571,6 @@ pyasn1 = ">=0.1.3" name = "send2trash" version = "1.8.3" description = "Send file to trash natively under Mac OS X, Windows and Linux" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3697,7 +3587,6 @@ win32 = ["pywin32"] name = "sentinels" version = "1.0.0" description = "Various objects to denote special meanings in python" -category = "dev" optional = false python-versions = "*" files = [ @@ -3708,7 +3597,6 @@ files = [ name = "setuptools" version = "75.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3723,13 +3611,12 @@ cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.11.0,<1.12.0)", "pytest-mypy"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -3741,7 +3628,6 @@ files = [ name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3753,7 +3639,6 @@ files = [ name = "snowflake-connector-python" version = "3.12.2" description = "Snowflake Connector for Python" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -3813,7 +3698,6 @@ secure-local-storage = ["keyring (>=23.1.0,<26.0.0)"] name = "snowflake-sqlalchemy" version = "1.6.1" description = "Snowflake SQLAlchemy Dialect" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -3833,7 +3717,6 @@ pandas = ["snowflake-connector-python[pandas]"] name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" optional = true python-versions = "*" files = [ @@ -3845,7 +3728,6 @@ files = [ name = "soupsieve" version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3857,7 +3739,6 @@ files = [ name = "sqlalchemy" version = "2.0.35" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3913,7 +3794,7 @@ files = [ ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and platform_machine == \"aarch64\" or python_version < \"3.13\" and platform_machine == \"ppc64le\" or python_version < \"3.13\" and platform_machine == \"x86_64\" or python_version < \"3.13\" and platform_machine == \"amd64\" or python_version < \"3.13\" and platform_machine == \"AMD64\" or python_version < \"3.13\" and platform_machine == \"win32\" or python_version < \"3.13\" and platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] @@ -3945,7 +3826,6 @@ sqlcipher = ["sqlcipher3_binary"] name = "sqlalchemy-bigquery" version = "1.11.0" description = "SQLAlchemy dialect for BigQuery" -category = "main" optional = true python-versions = "<3.13,>=3.8" files = [ @@ -3954,7 +3834,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0.0dev" google-cloud-bigquery = ">=3.3.6,<4.0.0dev" packaging = "*" @@ -3971,7 +3851,6 @@ tests = ["packaging", "pytz"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -3991,7 +3870,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "terminado" version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4013,7 +3891,6 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] name = "thrift" version = "0.20.0" description = "Python bindings for the Apache Thrift RPC system" -category = "main" optional = true python-versions = "*" files = [ @@ -4032,7 +3909,6 @@ twisted = ["twisted"] name = "tinycss2" version = "1.3.0" description = "A tiny CSS parser" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4051,7 +3927,6 @@ test = ["pytest", "ruff"] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4063,7 +3938,6 @@ files = [ name = "tomlkit" version = "0.13.2" description = "Style preserving TOML library" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -4075,7 +3949,6 @@ files = [ name = "tornado" version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4096,7 +3969,6 @@ files = [ name = "traitlets" version = "5.14.3" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4112,7 +3984,6 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, name = "types-python-dateutil" version = "2.9.0.20240906" description = "Typing stubs for python-dateutil" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4124,7 +3995,6 @@ files = [ name = "typing-extensions" version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4136,7 +4006,6 @@ files = [ name = "uri-template" version = "1.3.0" description = "RFC 6570 URI Template Processor" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4151,7 +4020,6 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake name = "urllib3" version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -4168,7 +4036,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "virtualenv" version = "20.26.4" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4189,7 +4056,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "watchdog" version = "5.0.2" description = "Filesystem events monitoring" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4232,7 +4098,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -4244,7 +4109,6 @@ files = [ name = "webcolors" version = "24.8.0" description = "A library for working with the color formats defined by HTML and CSS." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4260,7 +4124,6 @@ tests = ["coverage[toml]"] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "dev" optional = false python-versions = "*" files = [ @@ -4272,7 +4135,6 @@ files = [ name = "websocket-client" version = "1.8.0" description = "WebSocket client for Python with low level API options" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4289,7 +4151,6 @@ test = ["websockets"] name = "widgetsnbextension" version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4301,7 +4162,6 @@ files = [ name = "win32-setctime" version = "1.1.0" description = "A small Python utility to set file creation time on Windows" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4316,7 +4176,6 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] name = "zipp" version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4333,13 +4192,14 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", type = ["pytest-mypy"] [extras] -all = ["databricks-sql-connector", "elasticsearch", "opensearch-py", "psycopg2-binary", "pymysql", "pyodbc", "pyspark", "snowflake-sqlalchemy", "sqlalchemy-bigquery"] +all = ["databricks-sql-connector", "elasticsearch", "opensearch-py", "oracledb", "psycopg2-binary", "pymysql", "pyodbc", "pyspark", "snowflake-sqlalchemy", "sqlalchemy-bigquery"] bigquery = ["sqlalchemy-bigquery"] databricks = ["databricks-sql-connector"] elasticsearch = ["elasticsearch"] ms-sql = ["pyodbc"] mysql = ["pymysql"] opensearch = ["opensearch-py"] +oracle = ["oracledb"] postgres = ["psycopg2-binary"] snowflake = ["snowflake-sqlalchemy"] spark = ["pyspark"] @@ -4347,4 +4207,4 @@ spark = ["pyspark"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "25a5b37ed8af11ad73ab70135375000eeb1d0fdb69de0605913b9a5234cc211b" +content-hash = "1d5b47115245cf422260a12c97d446000c72ef5343094e2c8e05a25ed3d89df0"