All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- #2756 Safely compare UUID replication keys with state bookmarks -- Thanks @nikzavada!
- #2742 Update dependencies in templates
- #2732 SQL target developers can now more easily override the mapping from JSON schema to SQL column type
- #2730 Added
SQLConnector.prepare_primary_key
for target to implement for custom table primary key adaptation - #2488 Nested schema properties can now be defined as nullable
- #2518 Python 3.13 is officially supported
- #2637 Environment variables are now parsed for boolean, integer, array and object setting values
- #2699 Stream name can now be accessed in stream maps -- Thanks @holly-evans!
- #2712 JSON schema
title
is now supported in configuration and stream properties - #2707 Bumped simpleeval to 1.0
- #2701 Stream name can now be accessed in
__alias__
context of stream maps -- Thanks @holly-evans!
- #2741
datetime.datetime
instances in stream maps are now correctly mapped todate-time
JSON schema strings - #2727 Object and array JSON types are now handled before primitive types when converting them to SQL types
- #2723 JSON schema union types are no longer conformed into boolean values
- #2743 Deprecate passing file paths to plugin and stream initialization
- #2736 Skip
simpleeval
1.0.1 - #2716 Stopped testing with SQLAlchemy 1.4
- #2714 Remove constraint on
urllib3
- #2667 Support stream aliasing of
BATCH
messages via stream maps -- Thanks @ReubenFrankel! - #2651 SQL taps now emit schemas with
maxLength
when applicable - #2618 Developers can now more easily override the mapping from SQL column type to JSON schema
- #2697 All HTTP timeout exceptions are now retried in REST and GraphQL streams
- #2683 A clear error message is now emitted when flattening is enabled but
flattening_max_depth
is not set - #2665 Mapped datetime values are now typed as
date-time
strings in the schema message -- Thanks @gregkoutsimp! - #2663 Properties dropped using
None
or__NULL__
in stream maps are now also removed from the schemarequired
array
- #2696 Use tox without installing Poetry explicitly in workflows
- #2654 Added a generic
FileStream
(still in active development!) - #2695 Update dependencies in templates
- #2661 Drop support for Python 3.8 in templates
- #2670 Deprecated
Faker
class in stream maps - #2666 Remove non-functional
record-flattening
capability -- Thanks @ReubenFrankel! - #2652 Renamed
SQLConnector.type_mapping
toSQLConnector.sql_to_jsonschema
- #2647 Use future
warnings.deprecated
decorator
- #2658 Added more versions when stuff changed or was added
- #2694 Removed unused backport
importlib_resources
dependency in tap template - #2664 Added a constraint on setuptools <= 70.3.0 to fix incompatibility with some dependencies
- #2486 Emit target metrics
- #2567 A new
schema_is_valid
built-in tap test validates stream schemas against the JSON Schema specification - #2598 Stream map expressions now have access to the
Faker
class, rather than just a faker instance - #2549 Added a default user agent for REST and GraphQL taps
- #2613 Mismatch between timezone-aware and naive datetimes in start date and bookmarks is now correctly handled
- #2628 Use context manager to read gzip batch files
- #2619 Default to UTC when parsing dates without a known timezone
- #2603 Backwards-compatible identifier quoting in fully qualified names
- #2601 Improved SQL identifier (de)normalization
- #2599 Remove
pytest-durations
dependency fromtesting
and use native pytest option--durations
- #2597 Mark pagination classes with
@override
decorator - #2596 Made
auth_headers
andauth_params
ofAPIAuthenticatorBase
simple instance attributes instead of decorated properties
- #2639 Documented versions where
fake
andFaker
objects were added to the stream maps context - #2629 Reference
get_starting_timestamp
in incremental replication guide - #2604 Update project sample links
- #2595 Documented examples of stream glob expressions and property aliasing
- #2640 Remove upper constraint on
faker
extra
- #2589 Make sink assertion compatible with stream maps -- Thanks @JCotton1123!
- #2592 Fixed typos in
--about
plain text output - #2580 Date fields are now properly serialized as ISO dates, i.e. "YYYY-MM-DD"
- #2583 Quote add-column-ddl with column starting with
_
(underscore) based on engine -- Thanks @haleemur! - #2582 DDL for adding a column now uses a SQLAlchemy-compiled clause to apply proper quoting -- Thanks @haleemur!
- #2418 Check replication method instead of key to determine if a SQL stream is sorted
- #2520 Remove unused dependencies
pendulum
andpython-dateutil
- #2579 Documented support for
packaging
semantic type in contributing guide
- #2432 Developers can now customize the default logging configuration for their taps/targets by adding
default_logging.yml
to their package - #2531 The
json
module is now avaiable to stream maps -- Thanks @grigi! - #2529 Stream sync context is now available to all instances methods as a
Stream.context
attribute
- #2554 Use mapped stream aliases when handling
ACTIVATE_VERSION
messages in the base target class - #2526 Moved up the supported Python versions in the Markdown output of
--about
- #2564 Make
SQLSink
a generic with aSQLConnector
type parameter - #2540 Implement abstract
serialize_message
for Singer writers - #2259 Centralize JSON SerDe into helper functions -- Thanks @BuzzCutNorman!
- #2525 Make
PyJWT
andcryptography
dependencies optional - #2528 Moved class-level attributes to the top in REST tap template
- #2132 Limit internal usage of pendulum
- #2557 Document that
get_starting_timestamp
requires setting a non-null replication_key - #2556 Reference state partitioning in stream partitioning page
- #2536 Prepare for RTD addons migration
- #2535 Added more intersphinx links to Python and Faker docs
- #2530 Explained how the request URL is generated from
url_base
,path
and the sync context - #2527 Updated the footer
- #2506 Fixed a typo in the stream maps docs
- #2433 Tap developers can now disable HTTP redirects
- #2426 Added an optional GitHub workflow to publish to PyPI with trusted publishers
- #2438 Null replication values are now handled when incrementing bookmarks
- #2431 Updated cookiecutter VSCode
launch.json
to usedebugpy
- #2421 An error message is now logged every time schema validation fails for any record
- #2455 Use parent
datetime.datetime
class in type conforming checks - #2453 Change to return type of
utc_now
frompendulum.DateTime
todatetime.datetime
- #2449 Add a short guide on defining a configuration schema
- #2436 Documented how context fields are passed to a child stream
- #2435 Using an empty list for
__key_properties__
to disable a stream primary keys is now recommended as an alternative tonull
- #2389 JSON schema keyword
allOf
is now supported - #1888 Added support for glob patterns in source stream names -- Thanks @DouweM!
- #2345
PropertiesList
can now behave as an iterable -- Thanks @ReubenFrankel!
- #2352 Removed unnecessary and problematic column caching -- Thanks @raulbonet!
- #2375 Added
sensitive: true
to password settings in templates - #2301 Unmapped sub-fields in object-type fields are now no longer dropped when the field declares
additionalProperties
- #2348 Added a condition to the
No schema for record field
warning -- Thanks @tobiascadee! - #2342 Avoid failing if VSCode IDE config is not requested for target and mapper cookiecutter templates -- Thanks @ReubenFrankel!
- #2331 Allow
importlib-resources
>=6.3.2
- #2205 Added a
jwt
package extra, but thecryptography
andjwt
dependencies are still installed by default for now
- #2326 Documented
BATCH
as a default plugin capability -- Thanks @ReubenFrankel!
- #2310 Limited
importlib-resources
to < 6.2 due to breaking changes - #2288 Bumped min joblib dependency to
>=1.3.0
and replaced deprecatedparallel_backend
withparallel_config
-- Thanks @BuzzCutNorman! - #2281 The
state_partition_context
dictionary is now correctly interpolated in the error message when duplicate partitions/contexts are detected in the input state - #2274 Test workflow now fails for any Python matrix job failure in cookiecutter template -- Thanks @ReubenFrankel!
- #2241 JSON schema keywords such as
maxLength
are now supported inStringType
,IntegerType
andNumberType
JSON schema helpers - #2263 Nested settings are now documented in the output of
--about --format=markdown
- #2248 Targets now accept a
batch_size_rows
setting to configure how many rows are loaded in each record batch -- Thanks @BuzzCutNorman!
- #2258 Database disconnects are now handled via SQLAlchemy
pool_pre_ping
parameter
- #2220 Deprecated
singer_sdk.authenticators.BasicAuthenticator
in favor ofrequests.auth.HTTPBasicAuth
- #2252 Null type is now correctly appended as
{"type": "null"}
tooneOf
types
- #2243 Flattening level of record is now forced to match the provided flattened schema -- Thanks @joaopamaral!
- #2245 Instances of
oneOf
are now handled by null-appending logic - #2242 Hard and soft deletes for handling
ACTIVATE_VERSION
messages now use the sameWHERE
clause -- Thanks @vitoravancini! - #2232 Test workflow job now fails for unsupported Python versions in cookiecutter templates -- Thanks @ReubenFrankel!
- #2225 SQL columns that are non-nullable but not required (i.e. not part of a primary key) are now not included in the
"required": [...]
array of the discovered JSON schema
- #2239 Linked reference docs to source code
- #2231 Added an example implemetation of JSON schema validation that uses
fastjsonschema
- #2219 Added reference docs for tap & target testing helpers
- #2208 Allow users to disable schema validation in targets
- #2170 Generate fake data with stream maps -- Thanks @ReubenFrankel!
- #937 Support validating configuration for any tap with a dynamic catalog
- #2144 Support fanning out parent record into multiple child contexts/syncs
- #1918 End RESTStream pagination if an empty page is received
- #2203 Fix serialization of arbitrary objects (e.g.
ObjectId
from mongoDB) during flattening -- Thanks @dgawlowsky! - #2200 Quote column names in INSERT statement
- #2195 Include empty
schemas
directory in REST tap cookiecutter - #2187 Replace use of deprecated
jsonschema._RefResolver
with recommendedreferencing
library - #2184 Reduce amount of unnecessary whitespace in Singer output
- #2183 Ensure
.vscode
directory is included when requested in cookiecutters and avoid failing if it does not exist - #2180 Limit supported Python versions in
--about
output to existing ones - #2108 Log sink name when an unhandled error occurs during setup
- #2158 Fix pytest plugin declaration so it can be used without requiring defining
pytest_plugins
inconftest.py
- #2105 Default handling of
ACTIVATE_VERSION
messages to soft deletes and add newSQLConnector.delete_old_versions
method
- #2189 Use
functools.lru_cache
instead of the stalememoization
library (#1981) - #2188 Remove unused
logger
parameter from private catalog helper functions - #2143 Drop support for Python 3.7
- #2157 Remove
pytz
dependency and usedatetime.timezone.utc
instead ofpytz.UTC
where possible - #2136 Create interface for schema validation in sinks, and implement it for
python-jsonschema
-- Thanks @BuzzCutNorman! - #2130 Allow loading stream schemas from
importlib.resources.abc.Traversable
types
- #2204 Document supported package extras
- #2186 Call out minimum recommended
cookiecutter
version - #2168 Explain
Progress is not resumable if interrupted
in docs FAQ - #2140 Update auth caching example to use
functools.cached_property
- #2118 Output JSONPath expression with match count message -- Thanks @mjsqu!
- #2107 Respect forced replication method when retrieving state
- #2094 Use
nulls_first
when available to orderNULL
results in incremental SQL streams
- #1733 Test with Python 3.12 🐍
- #2095 Use
CursorResult.mappings()
in SQL streams - #2092 Use
datetime.fromisoformat
in other places - #2090 Explicitly use
T
iso date separator
- #2111 Fix broken requests documentation links -- Thanks @mjsqu!
- #2076 Make a explicit dependency on
python-dateutil
- #2044 Add Parquet as a batch encoding option -- Thanks @jamielxcarter!
- #768 Better error messages when config validation fails
- #1854 Make stream logger a child of the tap logger
- #2070 Parse dates with
datetime.fromisoformat
/backports.datetime_fromisoformat
-- Thanks @BuzzCutNorman! - #2056 Break up
TapTestClassFactory._annotate_test_class
into simpler methods - #2058 Implement a
SingerWriter
class insinger_sdk.io_base
and use it to emit Singer messages -- Thanks @BuzzCutNorman! - #2061 Simplify target template file names with
post_gen_project.py
hook -- Thanks @vicmattos! - #2060 Simplify tap template file names with
post_gen_project.py
hook -- Thanks @vicmattos!
- #2035 Retry all 5xx status codes -- Thanks @asamasoma!
- #1999 Log JSONPath match count at the INFO level
- #1779 Cache SQL columns and schemas
- #2003 Add ability to do list comprehensions in stream map expressions -- Thanks @haleemur!
- #2018 Drop Python 3.7 support in cookiecutter templates -- Thanks @visch!
- #2006 Parse record
time_extracted
intodatetime.datetime
instance - #1996 Respect nullability of leaf properties when flattening schema
- #1844 Safely skip parsing record field as date-time if it is missing in schema
- #1885 Map
record
field to a JSONobject
type - #2015 Ensure
default
property is passed to SCHEMA messages -- Thanks @prakharcode!
- #2017 Document support for comprehensions in stream maps
- #1893 Standard configurable load methods
- #1861 SQLTap connector instance shared with streams -- Thanks @BuzzCutNorman!
- #1954 Missing begin()s related to SQLAlchemy 2.0 -- Thanks @andyoneal!
- #1951 Ensure SQL streams are sorted when a replication key is set
- #1949 Retry SQLAlchemy engine creation for adapters without JSON SerDe support
- #1939 Handle
decimal.Decimal
instances in flattening - #1927 Handle replication key not found in stream schema -- Thanks @mjsqu!
- #1977 Fix hanging downstream tests in tap-postgres
- #1970 Warn instead of crashing when schema helpers cannot append
null
to types
-
#1925 Add viztracer command for testing targets -- Thanks @mjsqu!
-
#1962 Ensure
raw_schema
in stream mapper is immutable
- #1905 Add email field and use human-readable questions in templates
- #1913 Fix tap tests for multiple test classes with different input catalogs
- #1892 Add a mapper cookiecutter template
- #1864 SQLTarget connector instance shared with sinks -- Thanks @BuzzCutNorman!
- #1878 Add
_sdc_sync_started_at
metadata column to indicate the start of the target process - #1484 Bump latest supported sqlalchemy from
1.*
to2.*
- #1898 Correctly serialize
decimal.Decimal
in JSON fields of SQL targets - #1881 Expose
add_record_metadata
as a builtin target setting - #1880 Append batch config if target supports the batch capability
- #1865 Handle missing record properties in SQL sinks
- #1838 Add deprecation warning when importing legacy testing helpers
- #1842 Ensure all expected tap parameters are passed to
SQLTap
initializer - #1853 Check against the unconformed key properties when validating record keys
- #1843 Target template should not reference
tap_id
- #1708 Finalize and write last state message with dedupe
- #1835 Avoid setting up mapper in discovery mode
- #1877 Use
importlib.resources
instead of__file__
to retrieve sample Singer output files
- #1852 Fix stale
pip_url
example that uses shell script workaround for editable installation
- #1815 Support optional headers for OAuth request -- Thanks @s7clarke10!
- #1800 Publish supported python versions in
--about
- #1829 Update cookiecutter copyright assignment to cookiecutter user -- Thanks @riordan!
- #1826 Serialization of
decimal.Decimal
- #1827 Add explicit dependency on
packaging
library - #1820 Include SCHEMA message count in target logs
- #1809 Deserialize floats as
decimal.Decimal
- #1770 Check schema has arrived before record
- #1796 Create batch directory if missing
- #1688 Incremental where clause generation from triggering TypeError -- Thanks @BuzzCutNorman!
- #1778 Sink schema comparison before adding metadata columns
- #1698 Force stream selection in tests
- #1775 Add tests for SQL type conversion from JSON schemas
- #1771 Add descriptions for
batch_config
properties - #1752 Change runner scope to function for target tests
- #1753 Always emit a STATE message at the start of the sync process
- #1745 Change
SQLStream.schema
into a cached property -- Thanks @mjsqu!
- #1756 Fix invalid JSON in Stream Maps page and add
meltano.yml
tabs -- Thanks @mjsqu! - #1763 Add Cloud banner
- #1728 Add an optional Dependabot file to projects generated from templates
- #1572 Add
batch_config
handling inappend_builtin_config()
-- Thanks @aaronsteers! - #1686 Log stream errors
- #1711 Validate records against stream schema in standard tap tests
- #1709 Add a default Apache 2.0 license to tap and target templates
- #1742 Recommend
meltano run
in target cookiecutter README
- #936 Use inheritance to construct plugin CLI
- #1721 Remove unsupported
previous_token
from HATEOAS example - #1703 Fix broken docs link for
record_metadata
page -- Thanks @menzenski!
- #1681 Allow SQL tap developers to leverage
post_process
-- Thanks @BuzzCutNorman! - #1672 Support deselecting streams by default
- #1648 Use Ruff to lint projects generated with Cookiecutter templates
- #1680 Pin
urllib3
to<2
to avoid incompatibility issues with botocore - #1646 Use
get_new_paginator
in REST tap cookiecutter template
- #1668 Break out default batch file writer into a separate class
- #1623 Explicitly support URL params in string form
- #1603 Allow
allowed_values
andexamples
in any JSON schema type constructor
- #1610 Consolidate config parsing for all plugin base classes
- #1601 Allow skipping child streams by returning an empty child context from parent stream
- #1581 Add
pattern
,contentMediaType
, andcontentEncoding
to Schema data class -- Thanks @BuzzCutNorman!
- #1587 Update cookiecutter tests path
- #1570 Move "about" formatting logic into dedicated classes
- #1563 Migrate shell scripts for cookiecutter e2e tests to Nox -- Thanks @mkranna!
- #1574 Conform metric field
type
to Singer spec - #1436 Handle sync abort, reduce duplicate
STATE
messages, rename_MAX_RECORD_LIMIT
asABORT_AT_RECORD_COUNT
- #1172 Handle merging of SQL types when character column lengths are less than the max -- Thanks @BuzzCutNorman!
- #1524 Preserve
__alias__
when mapping streams with repeated schema messages -- Thanks @DanilJr! - #1526 Handle missing
type
value when checking JSON schema types
- #1553 Change link color from pink to blue
- #1544 Update branding colors in docs site
- #1518 Fix HATEOAS pagination example
- #1478 Retry some streaming and decoding request errors -- Thanks @visch!
- #1480 Added
RESTStream.backoff_jitter
to support custom backoff jitter generators -- Thanks @visch! - #1438 Cookiecutter target tox ini -- Thanks @mkranna!
- #1467 Move
pyarrow
andviztracer
extras to main dependencies - #1487 Address SQLAlchemy 2.0 deprecation warnings
- #1482 Use pipx to run tox in CI template
- #1454 Cookiecutter bearer auth config -- Thanks @radbrt!
- #1434 Tap template: fix style and docstrings, and add test cases for SQL and "Other" sources -- Thanks @flexponsive!
- #1410 Tap template: fix style, types and imports; and also catch more errors by building from replay files in CI -- Thanks @flexponsive!
- #1428 Tap template: cover all REST authentication cases, and one GraphQL case -- Thanks @flexponsive!
- #1365 Add
strptime_to_utc
andstrftime
functions to_singerlib.utils
-- Thanks @menzenski! - #1394 Refactor SQLConnector connection handling -- Thanks @qbatten!
- #1241 Support declaring variant for use in package name
- #1109 Support
requests.auth
authenticators
- #1380 Move tests in cookiecutters to project root to support
pytest_plugins
- #1406 Use a version of
isort
compatible with Python 3.8 - #1385 SQL Targets ignore collation when evaluating column data types -- Thanks @BuzzCutNorman!
- #1342 Remove SQLSink snakecase conform in favor of simpler transformations
- #1364 TapDiscoveryTest remove catalog if one is passed
- #1390 Add incremental replication example -- Thanks @flexponsive!
- #1171 Improve included tap and target tests in
singer_sdk.testing
- #1345 Remove tox dependency from tap/target template
- #1358 Fix typo in
if __name__ ==
example
- #1283 Automatic catalog selection of replication keys
- #1335 Stream maps example for adding property with hardcoded string value
- #1308 Replace hyphens with underscores when generating expected env var name
<PLUGIN_NAME>_LOGLEVEL
-- Thanks @adherr! - #887 Make
conform_record_data_types
work on nested objects and arrays -- Thanks @Jack-Burnett! - #1287 Targets to fail gracefully when schema message is missing the
properties
key -- Thanks @visch!
- #1262 Support string
"__NULL__"
whereever null values are allowed in stream maps configuration
- #1281 Apply Version bump commit file perms with sudo
- #1280 Set repo file perms after checkout in Version bump workflow
- #1214 Avoid duplicate entries in
required
array of JSON schema helpers
- #1188 Support boolean
additional_properties
in JSON schema helper objects - #1237 Catch and retry
ConnectionResetError
exceptions in HTTP taps - #1087 S3 batch storage -- Thanks @jamielxcarter!
- #1197 Support
patternProperties
in JSON schema helpers - #1157 Built-in handling of
default-target-schema
for SQL Targets -- Thanks @BuzzCutNorman!
- #1238 Ensure metric tags coming from stream context can be JSON-serialized
- #1233 Add level and logger name to default log format
- #1219 Schema passthrough for whitelisted fields
- #1174 Do not emit log message if no record properties were ignored
- #1192 Change max record age for emitting state messages to 5 instead of 30 mins -- Thanks @spacecowboy!
- #1196 Improve performance of record message serialization -- Thanks @Jack-Burnett!
- #1243 Document inherited
PluginBase
attributes and methods - #1209 Fix argument descriptions for
OAuthAuthenticator
- #1175 Add
datetime
functions to simpleeval env in stream maps -- Thanks @qbatten!
- #1182 Update
SQLConnector
import for SQL target cookiecutter -- Thanks @radbrt! - #1168
SQLConnector.table_exists()
to use separatetable_name
andschema_name
instead of fully qualified name -- Thanks @BuzzCutNorman! - #1164 Write a valid final state message at the end of each stream sync -- Thanks @laurentS!
- #1114 Make DDL overridable for column
ADD
,ALTER
, andRENAME
operations
- #1126 Resolve failure in
_increment_stream_state()
for cases whenreplication_method
isLOG_BASED
- #1111 Push
_MAX_RECORDS_LIMIT
down into SQL
- #1091 Move SQLConnector into a separate module, for use by both SQLStream and SQLSink
- #1098 Add JSON Schema
Property
helpers forallowed_values
(enum
) andexamples
- #1096 Add secrets support for tap and target config, via
Property(..., secret=True)
- #1039 Support conforming singer property names to target identifier constraints in SQL sinks
- #1093 Add environment support to the cookie cutter for
meltano.yml
- #1036 Create schema and table on
add_sink
- #1032 Support stream property selection push-down in SQL streams
- #978 Allow configuring a dedicated metrics logger
- #1043 Batch storage
split_url
to work with Windows paths -- Thanks @BuzzCutNorman! - #826 Remove Poetry version pin for GitHub Actions -- Thanks @visch!
- #1001 Use column name in
allow_column_alter
error message
- #1060 Add explanation and recommendations for context usage
- #1074 Document an example implementation and usage of
BaseHATEOASPaginator
- #1020 Fixed typo in
docs/stream_maps.md
-- Thanks @spacecowboy! - #1006 Add links to Meltano install/tut
- #999 Absolute file paths created by taps running in BATCH mode can't be processed by the Sink
- Change
targetUrl
of semantic PR title check to point to SDK docs
- #968 Added cookiecutter support and docs for VSCode debugging
- #904 Add support for new
BATCH
message type in taps and targets
- #972 Resolve issue where TypeError is thrown by SQLConnector cookiecutter implementation due to super() references
- #829 Add checks for primary keys, replication keys and state partitioning keys to standard tap tests -- Thanks @laurentS!
- #732 Implement reference paginators.
- #898 Fix SQL type merging for pre-existing target tables -- Thanks @BuzzCutNorman!
- #856 Fix typo RecordsWitoutSchemaException -> RecordsWithoutSchemaException.
- Use
__future__.annotations
onsinger_sdk.helpers._singer
- #950 Document missing initializers for authentication and pagination helpers.
- #947 Remove stale autodoc page for RecordsWitoutSchemaException.
- #942 Add docs preview links to PR description.
- #842 Allow authenticating more generic requests
- #919 add
ConnectionError
to list of backoff exceptions for auto-retry
- #917 Allow Singer schemas to include the
required
andenum
fields - #759 Use recent start_date as starting_replication_value
- #908 Allow overriding the bulk insert statement in
SQLSink
- #784 Update return type for
backoff_max_tries
to reflect it accepts a callable that returns an integer - #874 Singer metrics are now properly emitted in JSON format --Thanks, @Jack-Burnett!
- #869 Cleanup whitespace in backoff code samples
- #785 Output full URL path in error messages
- #815 Generate correct SQL target project from cookiecutter
- #782 Allow lists and dictionaries as types for default JSON values
- #823 Add link to the sdk for README generation regarding Stream Maps
- #813 Fix PyPI trove classifiers
- #783 Document using pipx inject for nox-poetry
- Fix missing typing-extensions for Python<3.10 (#776)
- Tap and Target SDK: Adds the ability to override the logging level via
LOGLEVEL
environment variables. (!300) - Thanks, Eric Boucher! - Tap SDK: Allow sort checking to be disabled for taps with un-sortable replication keys. (#729, #730) - Thanks, Ilkka!
- Tap SDK: Add
Stream.calculate_sync_cost
hook to gather "cost" (in terms of number of requests, etc.) for each stream. (#348, #704) - Thanks, Laurent Savaëte! - Target SDK: Add end-of-pipe clean up hooks for
Sink
implementations (#750) - Thanks, Alexander Butler!
- Tap SDK: Bump minimum version of
PyJWT
to2.4
(#396, !302). - Tap SDK: Compare replication key values when incrementing state, only if the
check_sorted
flag is set to True (#736, #737).
- Tap and Target SDK: Resolves an issue where SQLAlchemy logs would be printed to
STDOUT
. (!303) - Thanks, Andrey Tatarinov! - Tap SDK: Reduces number of log lines printed when unmapped properties are ignored from the source API (!300) - Thanks, Eric Boucher!
- Tap and Target SDK: Remove trailing parenthesis from logged version (#766, #767).
- Tap and Target SDK: The
--config=ENV
option now also considers environment variables from a dotenv (.env
) file if present (#384, !293).
-
Target SDK: Use generic SQLALchemy markers for parameterized queries in SQL targets (#376, !287) - Thanks, Thomas Briggs!
-
Target SDK: Explicitly specify column names when inserting rows in SQL targets (#385, !294) - Thanks, Thomas Briggs!
-
Target SDK: Fixes bug where an
activate_version
message caused an error when destination table does not exist (#372, !285) - Thanks, Thomas Briggs! -
Tap and Target SDK: Do not fail
--about
option if tap or target is not configured (#379, !291).
- Tap SDK: Improved helpers for handling rate limits, backoff and retries (#137, #140, !277) - Thanks, Fred O'Loughlin!
- Remove "errors" from non-error log line to improve log searchability (!279) - Thanks, Laurent Savaëte!
- Tap and Target SDK: Fixed a bug where setting stream map property to
null
did not remove it from SCHEMA message (#370, !286) - Thanks, Ryan Whitten! - Tap and Target SDK: Fixed a bug where flattening resulted in an invalid SCHEMA message (!286) - Thanks, Ryan Whitten!
- Target SDK: Use
maxLength
in SQL targets for string fields if the schema provides it (#371, !284) - Thanks, Thomas Briggs!
- Tap Cookiecutter: Fixed a bug where the wrong key was used to select the appropriate
Tap
class for SQL taps (#353, !275) - Thanks, Dan Norman! - Tap Cookiecutter: Fixed a bug where
client.py
for SQL taps was overwritten during initialization (#354, !276) - Thanks, Dan Norman! - Tap SDK: Fixed a bug where a parent stream emitted schema messages when it's not selected, but at least one of its child streams is (#366, !280)
- Tap SDK: Bump
pyjwt
dependency to~=2.3
(!281) - Thanks, Eric Boucher!
- Raise more descriptive exceptions when wrapped JSON typing classes needs to be instantiated (#55, #360, !270).
- Support JSONPath extensions in
records_jsonpath
andnext_page_token_jsonpath
(#361, !271).
- Fixed a bug where setting a stream map property to null did not remove the property (#352, !263).
- Avoid SQLAlchemy deprecation warning caused by using
Engine.has_table()
(#341, !264) - Resolve issue where "falsey" defaults like '0', '', and 'False' would not be properly applied to tap settings config. (#357, !265)
- Return to stable
poetry-core
version in cookiecutter templates (#338, !260)
- Define all built-in JSON Schema string formats as separate types (#336, !250) - Thanks, Reuben Frankel!
- Enable JSONPath for GraphQL record extraction (#327, !247) - Thanks, Fred O'Loughlin!
- Add record and schema flattening in Stream Maps (!236),
- Resolve issues when aliasing stream maps using the keywords
__alias__
,__source__
, or__else__
(#301, #302, !243)
- Always sync one record per stream when invoking with
--test
or--test=all
(#311, !241) - Add
--test=schema
option to emit tap SCHEMA messages only (!218) - Thanks, Laurent Savaëte!
- Add support for SQL Taps (#74, !44)
- Add support for SQL Targets (#263, !44, !200, !239)
- Added Licence tracking to SDK GitLab Project (#166, !237)
- Inline Mapper SDK: Support for creation of inline mapper plugins (#257, !234)
- Tap and Target Cookiecutter: Support editable pip installs (
pip install -e .
) with PEP 660 (#238, !231)
- Tap Cookiecutter: Add output directory for
target-jsonl
(!228) -- Thanks, Niall Woodward! - Tap SDK: Make the
expires_in
property optional in OAuth response (#297, !232) -- Thanks, Daniel Ferguson!
- Tap SDK: Add configurable timeout for HTTP requests (#287, !217, !225) -- Thanks, Josh Lloyd!
- Tap and Target SDK: Adds support for Python 3.10 (#293, !224)
- Resolve lint errors when ArrayType is used to wrap other types (!223) -- Thanks, David Wallace!
- Tap SDK: Fix datelike type parsing bug with nested schemas (#283, !219)
- Tap SDK: Resolved bug in
--test
which caused child streams to not use record limiting (#268, !204, !220) -- Thanks, Derek Visch!
- Tap SDK: Fixed mapped
__key_properties__
not being passed to the emitted schema message (#281, !209) - Tap SDK: Fixed missing schema during development causing sync to fail #284, !212 -- Thanks, Fred Reimer!
- Tap SDK: New method
RESTStream.validate_response
for custom validation of HTTP responses (#207, !195) - Tap SDK: New method
RESTStream.request_decorator
for custom back-off and retry parameters (#137, !195)
- Target SDK: Document options for the target CLI and accept multiple config files as input (!183)
- Target SDK: CLI flag for targets to read messages from a file instead of stdin (#249, !190) -- Thanks, Charles Julian Knight!
- Target SDK: Add target mock classes and tap-to-target scenario tests (#198, !138)
- Tap and Target SDK: Create expanded list of capabilities (#186, !141)
- Tap and Target SDK: Fix markdown table formatting in
--about
for multi-line settings descriptions (#240, !185) - Tap SDK: Clarify undocumented feature of filtering
None
frompost_process()
(#233, !187) - Tap and Target SDK: Add
dataclasses
as an explicit third-party dependency for Python 3.6 (#245, !189) - Tap and Target SDK: Allows
--discover
and--about
execution without requiring settings validation (#235, !188)
- Tap and Target SDK: Adds capability to print markdown docs with
--about --format=markdown
(!172, !180) -- Thanks, Nick Müller!
- Tap and Target SDK: Autogenerated docstrings for arguments, return types, and exceptions raised (!166).
- Tap and Target SDK: Support Black by default by bumping min Python version to 3.6.2. (#224, !169)
- Fixes a bug where tox invocations after initial setup failed (!179) -- Thanks, Jon Watson!.
- Tap SDK: Fixes a bug in
Stream.get_starting_timestamp()
andStream.get_starting_replication_key_value()
calls where results where not cached breaking stream sorting (!157)
- Tap and Target SDK: Prevents the leaking of sensitive configuration values when JSON schema validation fails (!173) -- Thanks, Kevin Mullins!.
- Add description attribute to
Property
class for JSON schemas (#159, !164) -- Thanks, Stephen Bailey!
- Tap SDK: Set
key_properties = []
instead ofnull
per the Singer spec (!160) -- Thanks, Niall Woodward!
- Tap SDK: Fixes issue where stream map schema generation fails when overriding the value of an existing property. (#196, !165)
- Tap and Target SDK: Resolves
2to3
compatibility issues when installed withsetuptools>=58.0
. - Resolve issue preventing repo from being cloned on Windows.
- Tap and Target SDK: Added compatibility with PEP 561 and
mypy
type checking (#212, !150) -- Thanks, Laurent Savaëte!
- Tap SDK: Improved record parsing and validation performance, especially with large record objects (#161, !146)
- Tap SDK: Changed the signature of
Stream.apply_catalog
to reflect new catalog parsing flow (#161, !146)
- Tap and Target SDK: Adds support for Python 3.9 (#66, !38)
- Tap SDK: Added support for new authenticator classes:
BasicAuthenticator
,BearerTokenAuthenticator
, andAPIKeyAuthenticator
(#185, !128) -- Thanks, Stephen Bailey!
- Tap and Target SDK: Bumps
click
library version to 8.0 (#178, !140). - Target SDK: Improves
BatchSink
performance by reducing the frequency by which batches are processed. (#172, !137)
- Tap SDK: Improves CLI
--help
output (#177, !140). - Tap SDK: Fixes a bug in state tracking where timezone-aware timestamps are appended again with
+0:00
(#176, !142) -- Thanks, Joshua Adeyemi! - Tap SDK: Improve performance by reusing a single authenticator instance (#168, #173, !136)
- Tap SDK: Fixed a bug where not using a catalog file resulted in all streams being selected but all properties being removed from the schema and records (#190, !132)
- Tap SDK: Added full support for selection metadata as specified by the Singer Spec, including metadata for
selected
,selected-by-default
, andinclusion
(!121)
- Target SDK: Improved performance for Batch Sinks by skipping extra drain operations when newly recieved STATE messages are unchanged from the prior received STATE (#172, !125) -- Thanks, Pat Nadolny!
- Target SDK: Fixed a bug where would emit an invalid STATE payload (#188, !130) -- Thanks, Pat Nadolny!
- Tap SDK: Fixed a bug where replication key signposts were not correctly applied for streams which defined them (#180, !129)
- Added JSONPath for taps to handle record extraction from API responses (!77)
- Resolve batch
context
not being reset between batches (#164, !117)
- Removed unused
DEFAULT_BATCH_SIZE_ROWS
in favor ofmax_size
forBatchSink
implementations (#163, !118)
- Resolve stream map duplicates not aliased correctly (#154, !114)
- Added target support for
add_record_metadata
config (#157, !111)
- Resolve target failures when dates are parsed prior to JSON Schema validation (#156, !110)
- Resolve target failures when
default_sink_class
is not used (#153, !109) - Improved tap log messages when child property's selection metadata defaults to the parent's (#131, !91)
- Added Stream Map feature for inline transformation and filtering capabilities (#63, !4, !92, !103)
- Added Target SDK, components and templates for building Singer targets (#96, !4)
- Removed methods deprecated in v0.2.0:
get_partition_state()
andget_stream_or_partition_state()
. Affected developers should replace these with references toget_context_state()
. (#152, !107)
- Added support for parent-child streams (#97, !79)
- Added support for configurable metrics logging (#91, !79)
- Added ability to use fewer state bookmarks by setting
Stream.state_partitioning_keys
to a subset of available context keys (!79)
- Renamed the optional
partition
dictionary arg in method signatures to the more genericcontext
(!79)
- The methods
Stream.get_partition_state()
andStream.get_stream_or_partition_state()
have been deprecated in favor of the new and simplerget_context_state()
(!79)
- Code coverage is now tracked and available as a tool for SDK contributors to further improve overall stability and help prioritize unit test development. (#39, !89)
Stability and bugfix release. No breaking changes.
- Resolved excessive logging during selection filtering. (#125, !83)
- Resolved issue where deselected sub-fields were incorrectly included in stream records. (#126, !85) -- Thanks, Alex Levene!
- Added improved type hints for developers, including mypy code compliance for improved stability. (#127, !86)
Bugfix release. No breaking changes.
- Resolved tap failure when a sorted stream has non-unique replication keys. (#120, !82)
Significant release with newly added features. No breaking changes.
- Added support for GraphQL query variables (#115, !78)
- Added selection rules support for record and schema messages (#7, !26)
- Improved cookiecutter template coverage, resolved readability issues. (#116, #119, !75)
- Resolved tap failure when a stream is missing from the input catalog. (#105, !80)
- Resolved bug where unsorted streams did not properly advance state bookmarks for incremental streams. (#118, !74)
Significant release with newly added features. No breaking changes.
- Added
is_sorted
stream property, which enables long-running incremental streams to be resumed if interrupted. (!61) - Added signpost feature to prevent bookmarks from advancing beyond the point where all records have been streamed. (!61)
- Added
get_replication_key_signpost()
stream method which defaults to the current time for timestamp-based replication keys. (!61)
- Fixed a scenario where unsorted incremental streams would generate incorrect STATE bookmarks. (!61) -- Thanks, Egi Gjevori!
- Fixed a problem where CI pipelines would fail when run from a fork. (!71) -- Thanks, Derek Visch!
- Fixed fatal error when running from the cookiecutter shell script (#102, !64)
Fixes bug in state handling, adds improvements to documentation.
- Streamlined Dev Guide (!56)
- Added Code Samples page, including dynamic schema discovery examples (#33, !56)
- Added links to external sdk-based taps (#32, !56)
- Added static/dynamic property documentation (#86, !56)
- Added "implementation" docs for debugging and troubleshooting (#71, !41)
- Fixes bug in
Stream.get_starting_timestamp()
using incorrect state key (#94, !58)
Documentation and cookiecutter template improvements.
- Added 'admin_name' field in cookiecutter, streamline poetry setup (!25)
- Added meltano integration and testing options (#47, !52)
- Added new cookiecutter
.sh
script to ease testing during development (!52)
- Improved cookiecutter readme template with examples (#76, !53)
First official SDK release. Numerous changes and improvements implemented, with the goal of stabilizing the SDK and making it broadly available to the community.
- Added this CHANGELOG.md file (#68, !43)
- Added standardized tap tests (!36, #78, !46)
- Added SDK testing matrix for python versions 3.6, 3.7, 3.8 (#61, !33)
- Added support for multiple
--config=
inputs, combining one or more config.json files (#53, !27) - Added new CLI
--test
option to perform connection test on all defined streams (#14, !28) - Added default value support for plugin configs (!12) -- Contributed by: Ken Payne
- Promote
singer_sdk.helpers.typing
tosinger_sdk.typing
(#84) - Modified environment variable parsing logic for arrays (#82)
- Renamed
http_headers
inAuthenticator
class toauth_headers
(#75, !47) - Expect environment variables in all caps (
<PLUGIN>_<SETTING>
) (#59, !34) - Parse environment variables only if
--config=ENV
is passed (#53, !27)
- OAuth no longer applies
client_email
automatically ifclient_id
is missing (#83) - Resolved issue on Python 3.6:
cannot import 'metadata' from 'importlib'
(#58) - Fixed issue reading from JSON file (!11) -- Contributed by: Edgar R. Mondragón
- Look only for valid plugin settings in environment variables (!21) -- Contributed by: Edgar R. Mondragón
- Fixed bug in
STATE
handling (!13) -- Contributed by: Ken Payne
- Remove parquet sample (#81,!48)
Initial prerelease version for review and prototyping.