Skip to content

Commit

Permalink
refactor: Override superclass to_jsonschema in `PostgresSQLToJSONSc…
Browse files Browse the repository at this point in the history
…hema`
  • Loading branch information
edgarrmondragon committed Nov 28, 2024
1 parent 7e7d194 commit 5f8b227
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions tap_postgres/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import json
import select
import typing as t
from functools import cached_property
from types import MappingProxyType
from typing import TYPE_CHECKING, Any

Expand All @@ -30,7 +29,6 @@
from collections.abc import Iterable, Mapping

from singer_sdk.helpers.types import Context
from sqlalchemy.dialects import postgresql
from sqlalchemy.engine import Engine
from sqlalchemy.engine.reflection import Inspector

Expand All @@ -44,7 +42,12 @@ def __init__(self, dates_as_string: bool, json_as_object: bool, *args, **kwargs)
self.dates_as_string = dates_as_string
self.json_as_object = json_as_object

@SQLToJSONSchema.to_jsonschema.register # type: ignore[attr-defined]
@functools.singledispatchmethod
def to_jsonschema(self, column_type: Any) -> dict:
"""Customize the JSON Schema for Postgres types."""
return super().to_jsonschema(column_type)

@to_jsonschema.register
def array_to_jsonschema(self, column_type: postgresql.ARRAY) -> dict:
"""Override the default mapping for NUMERIC columns.
Expand All @@ -55,21 +58,21 @@ def array_to_jsonschema(self, column_type: postgresql.ARRAY) -> dict:
"items": self.to_jsonschema(column_type.item_type),
}

@SQLToJSONSchema.to_jsonschema.register # type: ignore[attr-defined]
@to_jsonschema.register
def json_to_jsonschema(self, column_type: postgresql.JSON) -> dict:
"""Override the default mapping for JSON and JSONB columns."""
if self.json_as_object:
return {"type": ["object", "null"]}
return {"type": ["string", "number", "integer", "array", "object", "boolean"]}

@SQLToJSONSchema.to_jsonschema.register # type: ignore[attr-defined]
@to_jsonschema.register
def datetime_to_jsonschema(self, column_type: sqlalchemy.types.DateTime) -> dict:
"""Override the default mapping for DATETIME columns."""
if self.dates_as_string:
return {"type": ["string", "null"]}
return super().datetime_to_jsonschema(column_type)

@SQLToJSONSchema.to_jsonschema.register # type: ignore[attr-defined]
@to_jsonschema.register
def date_to_jsonschema(self, column_type: sqlalchemy.types.Date) -> dict:
"""Override the default mapping for DATE columns."""
if self.dates_as_string:
Expand Down Expand Up @@ -276,7 +279,7 @@ def config(self) -> Mapping[str, Any]:
"""Return a read-only config dictionary."""
return MappingProxyType(self._config)

@cached_property
@functools.cached_property
def schema(self) -> dict:
"""Override schema for log-based replication adding _sdc columns."""
schema_dict = t.cast(dict, self._singer_catalog_entry.schema.to_dict())
Expand Down

0 comments on commit 5f8b227

Please sign in to comment.