From edba1a75d93942289593c9625f723508c17c1de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Thu, 14 May 2026 14:28:49 -0600 Subject: [PATCH 1/2] chore: Lock file maintenance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Edgar Ramírez Mondragón --- .github/workflows/release_workflow.yml | 2 +- .pre-commit-config.yaml | 6 +- pyproject.toml | 164 +++++++++++++------------ uv.lock | 64 +++++----- 4 files changed, 120 insertions(+), 116 deletions(-) diff --git a/.github/workflows/release_workflow.yml b/.github/workflows/release_workflow.yml index 05847691..93433d00 100644 --- a/.github/workflows/release_workflow.yml +++ b/.github/workflows/release_workflow.yml @@ -15,7 +15,7 @@ jobs: with: fetch-depth: 0 ref: ${{ github.ref }} - - uses: hynek/build-and-inspect-python-package@fe0a0fb1925ca263d076ca4f2c13e93a6e92a33e # v2.17.0 + - uses: hynek/build-and-inspect-python-package@d44ca7d91762de7a7d5436ddae667c6da6d1c3df # v2.18.0 id: baipp publish: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c8031f70..4320d262 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,14 +15,14 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.15.12 + rev: v0.15.13 hooks: - id: ruff-check - args: [--fix] + args: [--fix, --show-fixes] - id: ruff-format - repo: https://github.com/astral-sh/uv-pre-commit - rev: 0.11.8 + rev: 0.11.14 hooks: - id: uv-lock - id: uv-sync diff --git a/pyproject.toml b/pyproject.toml index 5fd8c725..04035fe3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,110 +1,101 @@ +[build-system] +build-backend = "hatchling.build" +requires = [ + "hatch-vcs==0.5", + "hatchling==1.29", +] + [project] name = "meltanolabs-target-postgres" -dynamic = ["version"] description = "Singer target for Postgres, built with the Meltano SDK for Singer Targets." -authors = [{ name = "Meltano Team and Contributors", email = "hello@meltano.com" }] -requires-python = ">=3.10" readme = "README.md" +keywords = [ + "ELT", + "Meltano", + "Meltano SDK", + "Postgres", + "Singer", +] license = "MIT" license-files = [ - "LICENSE", -] -maintainers = [{ name = "Meltano Team and Contributors", email = "hello@meltano.com" }] -keywords = [ - "Postgres", - "Singer", - "ELT", - "Meltano", - "Meltano SDK", + "LICENSE", ] +requires-python = ">=3.10" classifiers = [ - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: Implementation :: CPython", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: Implementation :: CPython", ] +dynamic = [ "version" ] dependencies = [ - "paramiko>=4", - "psycopg[binary]==3.3.3", - "psycopg2-binary==2.9.12", - "sqlalchemy~=2.0", - "singer-sdk[sql]~=0.54.0", + "paramiko>=4", + "psycopg[binary]==3.3.3", + "psycopg2-binary==2.9.12", + "singer-sdk[sql]~=0.54.0", + "sqlalchemy~=2.0", ] - +[[project.authors]] +name = "Meltano Team and Contributors" +email = "hello@meltano.com" +[[project.maintainers]] +name = "Meltano Team and Contributors" +email = "hello@meltano.com" [project.optional-dependencies] -faker = ["faker>=37.1,<41.0"] - +faker = [ "faker>=37.1,<41" ] +[project.scripts] +target-postgres = "target_postgres.target:TargetPostgres.cli" [project.urls] Homepage = "https://meltano.com" Repository = "https://github.com/MeltanoLabs/target-postgres" Documentation = "https://github.com/MeltanoLabs/target-postgres/blob/main/README.md" -[project.scripts] -target-postgres = "target_postgres.target:TargetPostgres.cli" - [dependency-groups] dev = [ - { include-group = "testing" }, - { include-group = "typing" }, - "remote-pdb>=2.1.0", + "remote-pdb>=2.1", + { include-group = "testing" }, + { include-group = "typing" }, ] lint = [ - "ruff>=0.1.14", + "ruff>=0.1.14", ] testing = [ - "pytest>=9", - "meltano-tap-countries", - "meltano-tap-fundamentals", - "sqlalchemy>=2.0.0.dev0", + "meltano-tap-countries", + "meltano-tap-fundamentals", + "pytest>=9", + "sqlalchemy>=2.0.0.dev0", ] typing = [ - "mypy>=1.6.1", - "types-paramiko>=4", - "types-simplejson>=3.19.0.2", - "types-sqlalchemy>=1.4.53.38", - "types-jsonschema>=4.19.0.3", + "mypy>=1.6.1", + "types-jsonschema>=4.19.0.3", + "types-paramiko>=4", + "types-simplejson>=3.19.0.2", + "types-sqlalchemy>=1.4.53.38", ] +[tool.hatch.build.targets.sdist] +include = [ "target_postgres" ] +[tool.hatch.build.targets.wheel] +include = [ "target_postgres" ] [tool.hatch.version] fallback-version = "0.0.0" source = "vcs" -[tool.hatch.build.targets.sdist] -include = ["target_postgres"] - -[tool.hatch.build.targets.wheel] -include = ["target_postgres"] - -[tool.mypy] -exclude = "tests" -warn_redundant_casts = true -warn_unused_configs = true -warn_unused_ignores = true - -[build-system] -requires = [ - "hatchling==1.29.0", - "hatch-vcs==0.5.0", -] -build-backend = "hatchling.build" - -[tool.pytest] -minversion = "9.0" -filterwarnings = [ - "error", - "once:Exception ignored:pytest.PytestUnraisableExceptionWarning", - "once:Python .* will reach its end of life:singer_sdk.helpers._compat.SingerSDKPythonEOLWarning", -] -pythonpath = [ - "." -] +[tool.uv] +required-version = ">=0.9.17" +prerelease = "if-necessary-or-explicit" +[tool.uv.sources] +meltano-tap-countries = { git = "https://github.com/meltano/sdk.git", subdirectory = "packages/meltano-tap-countries", rev = "main" } +meltano-tap-fundamentals = { git = "https://github.com/meltano/sdk.git", subdirectory = "packages/meltano-tap-fundamentals", rev = "main" } [tool.ruff.lint] select = [ + "B", # flake8-bugbear "F", # Pyflakes "W", # pycodestyle warnings "E", # pycodestyle errors @@ -121,14 +112,27 @@ select = [ "PERF", # Perflint "RUF", # ruff ] - [tool.ruff.lint.pydocstyle] convention = "google" -[tool.uv] -prerelease = "if-necessary-or-explicit" -required-version = ">=0.9.17" +[tool.mypy] +enable_error_code = [ "ignore-without-code", "redundant-expr", "truthy-bool" ] +exclude = "tests" +strict = true +warn_redundant_casts = true +warn_unreachable = true +warn_unused_configs = true +warn_unused_ignores = true -[tool.uv.sources] -meltano-tap-countries = { git = "https://github.com/meltano/sdk.git", subdirectory = "packages/meltano-tap-countries", rev = "main" } -meltano-tap-fundamentals = { git = "https://github.com/meltano/sdk.git", subdirectory = "packages/meltano-tap-fundamentals", rev = "main" } +[tool.pytest] +addopts = ["-ra"] +log_level = "INFO" +minversion = "9" +filterwarnings = [ + "error", + "once:Exception ignored:pytest.PytestUnraisableExceptionWarning", + "once:Python .* will reach its end of life:singer_sdk.helpers._compat.SingerSDKPythonEOLWarning", +] +pythonpath = [ "." ] +strict = true +testpaths = ["target_postgres/tests"] diff --git a/uv.lock b/uv.lock index 2718be9a..e80584f9 100644 --- a/uv.lock +++ b/uv.lock @@ -462,14 +462,14 @@ wheels = [ [[package]] name = "faker" -version = "40.15.0" +version = "40.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/13/6741787bd91c4109c7bed047d68273965cd52ce8a5f773c471b949334b6d/faker-40.15.0.tar.gz", hash = "sha256:20f3a6ec8c266b74d4c554e34118b21c3c2056c0b4a519d15c8decb3a4e6e795", size = 1967447, upload-time = "2026-04-17T20:05:27.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/06/70886e82d8f1d2b73454f3a7c1b7405300128df22e70d85a828951366932/faker-40.18.0.tar.gz", hash = "sha256:2207575c0e8f90e6ccd6dbef764de875c614d16d3db4eee9712d9a00087f2e70", size = 1968243, upload-time = "2026-05-14T16:43:04.834Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/a7/a600f8f30d4505e89166de51dd121bd540ab8e560e8cf0901de00a81de8c/faker-40.15.0-py3-none-any.whl", hash = "sha256:71ab3c3370da9d2205ab74ffb0fd51273063ad562b3a3bb69d0026a20923e318", size = 2004447, upload-time = "2026-04-17T20:05:25.437Z" }, + { url = "https://files.pythonhosted.org/packages/84/0b/5c0b2d3a4b7a715f1835dd3f963bfbe841a02ae5cad1df8ee0325dfad235/faker-40.18.0-py3-none-any.whl", hash = "sha256:61a6b94b74605ddb090a065deb197a1c585ae7a874c094cf6693671d271e6083", size = 2006355, upload-time = "2026-05-14T16:43:02.489Z" }, ] [[package]] @@ -483,11 +483,11 @@ wheels = [ [[package]] name = "idna" -version = "3.14" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/b1/efac073e0c297ecf2fb33c346989a529d4e19164f1759102dee5953ee17e/idna-3.14.tar.gz", hash = "sha256:466d810d7a2cc1022bea9b037c39728d51ae7dad40d480fc9b7d7ecf98ba8ee3", size = 198272, upload-time = "2026-05-10T20:32:15.935Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl", hash = "sha256:e677eaf072e290f7b725f9acf0b3a2bd55f9fd6f7c70abe5f0e34823d0accf69", size = 72184, upload-time = "2026-05-10T20:32:14.295Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -662,7 +662,7 @@ wheels = [ [[package]] name = "meltano-tap-countries" version = "0.0.0" -source = { git = "https://github.com/meltano/sdk.git?subdirectory=packages%2Fmeltano-tap-countries&rev=main#8373aecb55c64970f73b4e887b927a2cfedf275a" } +source = { git = "https://github.com/meltano/sdk.git?subdirectory=packages%2Fmeltano-tap-countries&rev=main#179e5f2288858ed886f135847fb918352f41cb1a" } dependencies = [ { name = "msgspec" }, { name = "requests-cache" }, @@ -673,7 +673,7 @@ dependencies = [ [[package]] name = "meltano-tap-fundamentals" version = "0.0.0" -source = { git = "https://github.com/meltano/sdk.git?subdirectory=packages%2Fmeltano-tap-fundamentals&rev=main#8373aecb55c64970f73b4e887b927a2cfedf275a" } +source = { git = "https://github.com/meltano/sdk.git?subdirectory=packages%2Fmeltano-tap-fundamentals&rev=main#179e5f2288858ed886f135847fb918352f41cb1a" } dependencies = [ { name = "singer-sdk" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, @@ -1269,7 +1269,7 @@ wheels = [ [[package]] name = "requests" -version = "2.34.0" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1277,9 +1277,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/b8/7a707d60fea4c49094e40262cc0e2ca6c768cca21587e34d3f705afec47e/requests-2.34.0.tar.gz", hash = "sha256:7d62fe92f50eb82c529b0916bb445afa1531a566fc8f35ffdc64446e771b856a", size = 142436, upload-time = "2026-05-11T19:29:51.717Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e6/e300fce5fe83c30520607a015dabd985df3251e188d234bfe9492e17a389/requests-2.34.0-py3-none-any.whl", hash = "sha256:917520a21b767485ce7c588f4ebb917c436b24a31231b44228715eaeb5a52c60", size = 73021, upload-time = "2026-05-11T19:29:49.923Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]] @@ -1423,27 +1423,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.12" +version = "0.15.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, + { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" }, + { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" }, + { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" }, + { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" }, + { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" }, + { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" }, + { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" }, + { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" }, + { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" }, + { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" }, ] [[package]] @@ -1532,8 +1532,8 @@ wheels = [ [[package]] name = "singer-sdk" -version = "0.54.1.dev1+g8373aecb5" -source = { git = "https://github.com/meltano/sdk.git?rev=main#8373aecb55c64970f73b4e887b927a2cfedf275a" } +version = "0.54.1.dev2+g179e5f228" +source = { git = "https://github.com/meltano/sdk.git?rev=main#179e5f2288858ed886f135847fb918352f41cb1a" } dependencies = [ { name = "backports-datetime-fromisoformat", marker = "python_full_version < '3.11'" }, { name = "click" }, From 270edf1019022c04903027ae0a5256c54f87d60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Thu, 14 May 2026 14:57:11 -0600 Subject: [PATCH 2/2] chore: Make mypy happy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Edgar Ramírez Mondragón --- pyproject.toml | 13 +++++--- target_postgres/connector.py | 53 ++++++++++++++++------------- target_postgres/sinks.py | 64 +++++++++++++++++++++++------------- target_postgres/target.py | 2 +- uv.lock | 19 ++--------- 5 files changed, 83 insertions(+), 68 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 04035fe3..ed4c8520 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,7 +75,6 @@ typing = [ "types-jsonschema>=4.19.0.3", "types-paramiko>=4", "types-simplejson>=3.19.0.2", - "types-sqlalchemy>=1.4.53.38", ] [tool.hatch.build.targets.sdist] @@ -116,16 +115,20 @@ select = [ convention = "google" [tool.mypy] -enable_error_code = [ "ignore-without-code", "redundant-expr", "truthy-bool" ] +enable_error_code = [ + "ignore-without-code", + "redundant-expr", + "truthy-bool", +] exclude = "tests" -strict = true +strict = false warn_redundant_casts = true warn_unreachable = true warn_unused_configs = true warn_unused_ignores = true [tool.pytest] -addopts = ["-ra"] +addopts = [ "-ra" ] log_level = "INFO" minversion = "9" filterwarnings = [ @@ -135,4 +138,4 @@ filterwarnings = [ ] pythonpath = [ "." ] strict = true -testpaths = ["target_postgres/tests"] +testpaths = [ "target_postgres/tests" ] diff --git a/target_postgres/connector.py b/target_postgres/connector.py index 53009e95..aa60d636 100644 --- a/target_postgres/connector.py +++ b/target_postgres/connector.py @@ -160,7 +160,7 @@ def _forward_data( """ try: - def forward_local_to_remote(): + def forward_local_to_remote() -> None: while True: data = local_socket.recv(4096) if len(data) == 0: @@ -168,7 +168,7 @@ def forward_local_to_remote(): channel.send(data) channel.close() - def forward_remote_to_local(): + def forward_remote_to_local() -> None: while True: data = channel.recv(4096) if len(data) == 0: @@ -219,7 +219,7 @@ def __init__( super().__init__(*args, **kwargs) self.content_encoding = content_encoding - def handle_raw_string(self, schema): + def handle_raw_string(self, schema: dict[str, t.Any]) -> types.TypeEngine: """Handle a raw string type.""" if self.content_encoding and schema.get("contentEncoding") == "base16": return HexByteString() @@ -227,7 +227,7 @@ def handle_raw_string(self, schema): return TEXT() @staticmethod - def pick_best_sql_type(sql_type_array: list) -> types.TypeEngine: + def pick_best_sql_type(sql_type_array: list[types.TypeEngine]) -> types.TypeEngine: """Select the best SQL type from an array of SQL type instances. Args: @@ -288,7 +288,7 @@ class PostgresConnector(SQLConnector): #: https://www.postgresql.org/docs/current/datatype-character.html max_varchar_length: int | None = 10_485_760 - def __init__(self, config: dict) -> None: + def __init__(self, config: dict[str, t.Any]) -> None: """Initialize a connector to a Postgres database. Args: @@ -338,7 +338,7 @@ def interpret_content_encoding(self) -> bool: Returns: True if the feature is enabled, False otherwise. """ - return self.config.get("interpret_content_encoding", False) + return bool(self.config.get("interpret_content_encoding", False)) @cached_property def sanitize_null_text_characters(self) -> bool: @@ -347,12 +347,12 @@ def sanitize_null_text_characters(self) -> bool: Returns: True if the feature is enabled, False otherwise. """ - return self.config.get("sanitize_null_text_characters", False) + return bool(self.config.get("sanitize_null_text_characters", False)) def prepare_table( # type: ignore[override] # noqa: PLR0913 self, full_table_name: str | FullyQualifiedName, - schema: dict, + schema: dict[str, t.Any], primary_keys: t.Sequence[str], connection: sqlalchemy.engine.Connection, partition_keys: list[str] | None = None, @@ -454,12 +454,17 @@ def _connect(self) -> t.Iterator[sqlalchemy.engine.Connection]: def drop_table( self, table: sqlalchemy.Table, connection: sqlalchemy.engine.Connection - ): + ) -> None: """Drop table data.""" table.drop(bind=connection) def clone_table( - self, new_table_name, table, metadata, connection, temp_table + self, + new_table_name: str, + table: sqlalchemy.Table, + metadata: sqlalchemy.MetaData, + connection: sqlalchemy.engine.Connection, + temp_table: bool, ) -> sqlalchemy.Table: """Clone a table.""" new_columns = [ @@ -477,7 +482,7 @@ def clone_table( new_table.create(bind=connection) return new_table - def _handle_array_type(self, jsonschema: dict) -> ARRAY | JSONB: + def _handle_array_type(self, jsonschema: dict[str, t.Any]) -> ARRAY | JSONB: """Handle array type.""" items = jsonschema.get("items") # Case 1: items is a string @@ -503,7 +508,9 @@ def _handle_array_type(self, jsonschema: dict) -> ARRAY | JSONB: # Case 3: tuples return ARRAY(JSONB()) if isinstance(items, list) else JSONB() - def _handle_integer_type(self, jsonschema: dict) -> SMALLINT | INTEGER | BIGINT: + def _handle_integer_type( + self, jsonschema: dict[str, t.Any] + ) -> SMALLINT | INTEGER | BIGINT: """Handle integer type.""" minimum = jsonschema.get("minimum", -math.inf) maximum = jsonschema.get("maximum", math.inf) @@ -541,7 +548,7 @@ def create_empty_table( # type: ignore[override] # noqa: PLR0913 self, table_name: str, meta: sqlalchemy.MetaData, - schema: dict, + schema: dict[str, t.Any], connection: sqlalchemy.engine.Connection, primary_keys: t.Sequence[str] | None = None, partition_keys: list[str] | None = None, @@ -568,7 +575,7 @@ def create_empty_table( # type: ignore[override] # noqa: PLR0913 columns: list[sqlalchemy.Column] = [] primary_keys = primary_keys or [] try: - properties: dict = schema["properties"] + properties: dict[str, t.Any] = schema["properties"] except KeyError: raise RuntimeError( f"Schema for table_name: '{table_name}'" @@ -733,7 +740,7 @@ def _adapt_column_type( # type: ignore[override] # noqa: PLR0913 """ current_type: types.TypeEngine if column_object is not None: - current_type = t.cast("types.TypeEngine", column_object.type) + current_type = column_object.type else: current_type = self._get_column_type( schema_name=schema_name, @@ -813,7 +820,7 @@ def get_column_alter_ddl( # type: ignore[override] }, ) - def get_sqlalchemy_url(self, config: dict) -> str: + def get_sqlalchemy_url(self, config: dict[str, t.Any]) -> str: """Generate a SQLAlchemy URL. Args: @@ -833,7 +840,7 @@ def get_sqlalchemy_url(self, config: dict) -> str: ) return cast("str", sqlalchemy_url) - def get_sqlalchemy_query(self, config: dict) -> dict: + def get_sqlalchemy_query(self, config: dict[str, t.Any]) -> dict[str, t.Any]: """Get query values to be used for sqlalchemy URL creation. Args: @@ -938,7 +945,7 @@ def clean_up(self) -> None: if self.ssh_tunnel is not None: self.ssh_tunnel.stop() - def catch_signal(self, signum, frame) -> None: + def catch_signal(self, signum: int, _frame: t.Any) -> None: """Catch signals and exit cleanly. Args: @@ -981,7 +988,7 @@ def _get_column_type( # type: ignore[override] ) raise KeyError(msg) from ex - return t.cast("types.TypeEngine", column.type) + return column.type def get_table_columns( # type: ignore[override] self, @@ -1047,7 +1054,7 @@ class NOTYPE(TypeDecorator): impl = TEXT cache_ok = True - def process_bind_param(self, value, dialect): + def process_bind_param(self, value: t.Any, dialect: t.Any) -> t.Any: """Return value as is unless it is dict or list. Used internally by SQL Alchemy. Should not be used directly. @@ -1057,11 +1064,11 @@ def process_bind_param(self, value, dialect): return value @property - def python_type(self): + def python_type(self) -> type: """Return the Python type for this column.""" return object - def as_generic(self, *args: t.Any, **kwargs: t.Any): + def as_generic(self, *args: t.Any, **kwargs: t.Any) -> TEXT: """Return the generic type for this column.""" return TEXT() @@ -1078,7 +1085,7 @@ class HexByteString(TypeDecorator): impl = BYTEA - def process_bind_param(self, value, dialect): + def process_bind_param(self, value: t.Any, dialect: t.Any) -> t.Any: """Convert hex string to bytes.""" if value is None: return None diff --git a/target_postgres/sinks.py b/target_postgres/sinks.py index e8d419e5..3ce84331 100644 --- a/target_postgres/sinks.py +++ b/target_postgres/sinks.py @@ -17,12 +17,12 @@ from sqlalchemy.sql import Executable -class PostgresSink(SQLSink): +class PostgresSink(SQLSink[PostgresConnector]): """Postgres target sink class.""" connector_class = PostgresConnector - def __init__(self, *args, **kwargs): + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: """Initialize SQL Sink. See super class for more details.""" super().__init__(*args, **kwargs) self.temp_table_name = self.generate_temp_table_name() @@ -44,7 +44,7 @@ def connector(self) -> PostgresConnector: Returns: The connector object. """ - return t.cast("PostgresConnector", self._connector) + return self._connector def setup(self) -> None: """Set up Sink. @@ -52,7 +52,7 @@ def setup(self) -> None: This method is called on Sink creation, and creates the required Schema and Table entities in the target database. """ - self.append_only = self.key_properties is None or self.key_properties == [] + self.append_only = not self.key_properties if self.schema_name: self.connector.prepare_schema(self.schema_name) @@ -65,7 +65,7 @@ def setup(self) -> None: as_temp_table=False, ) - def process_batch(self, context: dict) -> None: + def process_batch(self, context: dict[str, t.Any]) -> None: """Process a batch with the given batch context. Writes a batch to the SQL target. Developers may override this method @@ -110,7 +110,7 @@ def process_batch(self, context: dict) -> None: # Drop temp table self.connector.drop_table(table=temp_table, connection=connection) - def generate_temp_table_name(self): + def generate_temp_table_name(self) -> str: """Uuid temp table name.""" # sqlalchemy.exc.IdentifierError: Identifier # 'temp_test_optional_attributes_388470e9_fbd0_47b7_a52f_d32a2ee3f5f6' @@ -119,10 +119,25 @@ def generate_temp_table_name(self): # in postgres, used a guid just in case we are using the same session return f"{str(uuid.uuid4()).replace('-', '_')}" - def sanitize_null_text_characters(self, data): + @t.overload + def sanitize_null_text_characters(self, data: str) -> str: ... + + @t.overload + def sanitize_null_text_characters( + self, + data: dict[str, t.Any], + ) -> dict[str, t.Any]: ... + + @t.overload + def sanitize_null_text_characters(self, data: list[t.Any]) -> list[t.Any]: ... + + def sanitize_null_text_characters( + self, + data: str | dict[str, t.Any] | list[t.Any], + ) -> str | dict[str, t.Any] | list[t.Any]: """Sanitizes null characters by replacing \u0000 with \ufffd.""" - def replace_null_character(d): + def replace_null_character(d: str) -> str: return d.replace("\u0000", "\ufffd") if isinstance(data, str): @@ -176,13 +191,13 @@ def _do_copy( # Use copy to run the copy statement. # https://www.psycopg.org/psycopg3/docs/basic/copy.html - with connection.connection.cursor().copy(copy_statement) as copy: # type: ignore[attr-defined] + with connection.connection.cursor().copy(copy_statement) as copy: for row in data_to_copy: processed_row = [] for row_column_name in row: if column_bind_processors[row_column_name] is not None: processed_row.append( - column_bind_processors[row_column_name]( + column_bind_processors[row_column_name]( # type: ignore[misc] row[row_column_name] ) ) @@ -194,7 +209,7 @@ def _do_copy( def bulk_insert_records( # type: ignore[override] self, table: sqlalchemy.Table, - schema: dict, + schema: dict[str, t.Any], records: t.Iterable[dict[str, t.Any]], primary_keys: t.Sequence[str], connection: sqlalchemy.engine.Connection, @@ -222,11 +237,12 @@ def bulk_insert_records( # type: ignore[override] # If append only is False, we only take the latest record one per primary key if self.append_only is False: - unique_records: dict[tuple, dict] = {} # pk tuple: values + # pk tuple: values + unique_records: dict[tuple[t.Any, ...], dict[str, t.Any]] = {} for record in records: insert_record = { column.name: ( - self.sanitize_null_text_characters(record.get(column.name)) + self.sanitize_null_text_characters(record.get(column.name)) # type: ignore[arg-type] if self.connector.sanitize_null_text_characters else record.get(column.name) ) @@ -241,7 +257,7 @@ def bulk_insert_records( # type: ignore[override] for record in records: insert_record = { column.name: ( - self.sanitize_null_text_characters(record.get(column.name)) + self.sanitize_null_text_characters(record.get(column.name)) # type: ignore[arg-type] if self.connector.sanitize_null_text_characters else record.get(column.name) ) @@ -262,7 +278,7 @@ def bulk_insert_records( # type: ignore[override] ), ) self.logger.info("Inserting with SQL: %s", insert) - connection.execute(insert, data) + connection.execute(insert, data) # type: ignore[call-overload] return True @@ -270,7 +286,7 @@ def upsert( self, from_table: sqlalchemy.Table, to_table: sqlalchemy.Table, - schema: dict, + schema: dict[str, t.Any], join_keys: t.Sequence[str], connection: sqlalchemy.engine.Connection, ) -> int | None: @@ -290,14 +306,15 @@ def upsert( """ if self.append_only is True: # Insert - select_stmt = sqlalchemy.select(from_table.columns).select_from(from_table) + select_stmt = sqlalchemy.select(from_table.columns).select_from(from_table) # type: ignore[call-overload] insert_stmt = to_table.insert().from_select( - names=from_table.columns, select=select_stmt + names=from_table.columns, # type: ignore[arg-type] + select=select_stmt, ) connection.execute(insert_stmt) else: join_predicates = [] - to_table_key: sqlalchemy.Column + to_table_key: sqlalchemy.Column[t.Any] for key in join_keys: from_table_key: sqlalchemy.Column = from_table.columns[key] to_table_key = to_table.columns[key] @@ -312,12 +329,13 @@ def upsert( where_condition = sqlalchemy.and_(*where_predicates) select_stmt = ( - sqlalchemy.select(from_table.columns) + sqlalchemy.select(from_table.columns) # type: ignore[call-overload] .select_from(from_table.outerjoin(to_table, join_condition)) .where(where_condition) ) insert_stmt = sqlalchemy.insert(to_table).from_select( - names=from_table.columns, select=select_stmt + names=from_table.columns, # type: ignore[arg-type] + select=select_stmt, ) connection.execute(insert_stmt) @@ -341,7 +359,7 @@ def upsert( def column_representation( self, - schema: dict, + schema: dict[str, t.Any], ) -> list[sqlalchemy.Column]: """Return a sqlalchemy table representation for the current schema.""" columns: list[sqlalchemy.Column] = [ @@ -368,7 +386,7 @@ def generate_insert_statement( An insert statement. """ metadata = sqlalchemy.MetaData() - table = sqlalchemy.Table(full_table_name, metadata, *columns) + table = sqlalchemy.Table(full_table_name, metadata, *columns) # type: ignore[arg-type] return sqlalchemy.insert(table) def conform_name(self, name: str, object_type: str | None = None) -> str: diff --git a/target_postgres/target.py b/target_postgres/target.py index 4ff3054f..e34b0434 100644 --- a/target_postgres/target.py +++ b/target_postgres/target.py @@ -21,7 +21,7 @@ class TargetPostgres(SQLTarget): def __init__( self, - config: dict | PurePath | str | list[PurePath | str] | None = None, + config: dict[str, t.Any] | PurePath | str | list[PurePath | str] | None = None, parse_env_config: bool = False, validate_config: bool = True, ) -> None: diff --git a/uv.lock b/uv.lock index e80584f9..be5a4fdd 100644 --- a/uv.lock +++ b/uv.lock @@ -495,7 +495,7 @@ name = "importlib-metadata" version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp" }, + { name = "zipp", marker = "python_full_version < '3.15'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } wheels = [ @@ -706,7 +706,6 @@ dev = [ { name = "types-jsonschema" }, { name = "types-paramiko" }, { name = "types-simplejson" }, - { name = "types-sqlalchemy" }, ] lint = [ { name = "ruff" }, @@ -722,12 +721,11 @@ typing = [ { name = "types-jsonschema" }, { name = "types-paramiko" }, { name = "types-simplejson" }, - { name = "types-sqlalchemy" }, ] [package.metadata] requires-dist = [ - { name = "faker", marker = "extra == 'faker'", specifier = ">=37.1,<41.0" }, + { name = "faker", marker = "extra == 'faker'", specifier = ">=37.1,<41" }, { name = "paramiko", specifier = ">=4" }, { name = "psycopg", extras = ["binary"], specifier = "==3.3.3" }, { name = "psycopg2-binary", specifier = "==2.9.12" }, @@ -742,12 +740,11 @@ dev = [ { name = "meltano-tap-fundamentals", git = "https://github.com/meltano/sdk.git?subdirectory=packages%2Fmeltano-tap-fundamentals&rev=main" }, { name = "mypy", specifier = ">=1.6.1" }, { name = "pytest", specifier = ">=9" }, - { name = "remote-pdb", specifier = ">=2.1.0" }, + { name = "remote-pdb", specifier = ">=2.1" }, { name = "sqlalchemy", specifier = ">=2.0.0.dev0" }, { name = "types-jsonschema", specifier = ">=4.19.0.3" }, { name = "types-paramiko", specifier = ">=4" }, { name = "types-simplejson", specifier = ">=3.19.0.2" }, - { name = "types-sqlalchemy", specifier = ">=1.4.53.38" }, ] lint = [{ name = "ruff", specifier = ">=0.1.14" }] testing = [ @@ -761,7 +758,6 @@ typing = [ { name = "types-jsonschema", specifier = ">=4.19.0.3" }, { name = "types-paramiko", specifier = ">=4" }, { name = "types-simplejson", specifier = ">=3.19.0.2" }, - { name = "types-sqlalchemy", specifier = ">=1.4.53.38" }, ] [[package]] @@ -1729,15 +1725,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/42/2c384dd111ad6beb34addf29e4932d1498f2c5d748b765449e2d6e23c90a/types_simplejson-3.20.0.20260508-py3-none-any.whl", hash = "sha256:f1ed32af465bda1755feffd2e36c8156acdea8644781f8616bd43b344ac9c121", size = 10406, upload-time = "2026-05-08T04:47:03.977Z" }, ] -[[package]] -name = "types-sqlalchemy" -version = "1.4.53.38" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/ce/0b7fa93dbc49b328807dedef8006223129e5a9543c74727dd7658eca5a9d/types-SQLAlchemy-1.4.53.38.tar.gz", hash = "sha256:5bb7463537e04e1aa5a3557eb725930df99226dcfd3c9bf93008025bfe5c169e", size = 118888, upload-time = "2023-05-01T15:15:28.572Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/4f/033a839a35ecbc5f71c0d74655d1237e909651aaebe7ceb825ac45cfdb4b/types_SQLAlchemy-1.4.53.38-py3-none-any.whl", hash = "sha256:7e60e74f823931cc9a9e8adb0a4c05e5533e6708b8a266807893a739faf4eaaa", size = 187916, upload-time = "2023-05-01T15:15:26.02Z" }, -] - [[package]] name = "typing-extensions" version = "4.15.0"