Skip to main content

Syncari Python SDK

Syncari Python Synapse Development Kit or synapse-sdk

Helpers

syncari.helpers provides utilities for the common edge cases a synapse hits when mapping an external system onto Syncari records: epoch-millisecond dates, fabricated modified dates, flat-vs-nested payloads, sending every field, and CSV data.

All helpers are pure functions importable from syncari.helpers:

from syncari.helpers import (
    to_epoch_millis, from_epoch_millis, now_epoch_millis,
    seconds_to_millis, millis_to_seconds, fabricate_last_modified,
    flatten, unflatten, get_in,
    all_field_names, with_all_fields, build_record, build_record_from_connection,
    csv_to_records, records_to_csv,
)

Dates and epoch millis

Syncari stores Record.lastModified and Record.createdAt as epoch milliseconds (UTC). These helpers convert to and from that representation.

to_epoch_millis('2021-01-01T00:00:00Z')          # 1609459200000
to_epoch_millis(datetime(2021, 1, 1))            # naive datetime is treated as UTC
from_epoch_millis(1609459200000)                 # datetime(2021, 1, 1, tzinfo=utc)
now_epoch_millis()                               # current time as epoch millis
seconds_to_millis(1609459200)                    # 1609459200000

to_epoch_millis accepts a datetime, a date, or an ISO-8601 string (a trailing Z is accepted). It rejects integers on purpose, so that seconds are never silently mistaken for millis; use seconds_to_millis for epoch seconds.

For systems that do not expose a real modified date, fabricate one. Only fields that are None are filled, unless force=True:

fabricate_last_modified(records)                       # set lastModified to now where missing
fabricate_last_modified(records, when=1609459200000)   # use a specific stamp
fabricate_last_modified(record, set_created=True)      # also fill createdAt

Accepts a single Record or a list and returns the same shape.

Flatten and unflatten

For APIs that reject flat schemas (or, conversely, need a flat payload), repackage the dictionary. Keys are joined with a separator (. by default).

flatten({'a': {'b': {'c': 1}}})       # {'a.b.c': 1}
unflatten({'a.b.c': 1})               # {'a': {'b': {'c': 1}}}
flatten(nested, sep='/')              # custom separator

unflatten raises ValueError when a key would be both a leaf and a branch (for example {'a': 1, 'a.b': 2}).

Limitations: only nested dicts are descended into (no list indices), and round-tripping is not safe when keys themselves contain the separator. Integer keys become strings.

To pluck a single nested value into a flat field (rather than flattening the whole dict), use get_in. It returns default when any step along the path is missing, so it never raises on absent keys:

row['value_amount']   = get_in(row, 'value.amount')             # 100  -> flat key
row['value_currency'] = get_in(row, 'value.currency', default='USD')
owner_id              = get_in(row, ['owner_id', 'id'])         # list path also accepted

This fits connectors that return nested reference objects (e.g. {'owner_id': {'id': 42}}) where you want one inner value, not the whole subtree flattened.

Sending all fields

Build a record that carries every field, lifting id / watermark / created values out of the raw dict by field name. The full values dict is preserved, so unmapped fields still travel downstream.

record = build_record(
    raw,
    id_field='Id',
    watermark_field='LastModifiedDate',   # converted to epoch millis
    created_field='CreatedDate',
    name='contact',                       # Record.name = the entity/object name
)

# Use the field names already configured on the connection:
record = build_record_from_connection(raw, connection)

Record.name is normally the entity/object name ('contact', 'deal'), so pass it via name. If a per-record label lives in the data instead, pass name_field='Name'; when both are given, the name_field value (when present) overrides name.

build_record accepts watermark / created values as a datetime, date, ISO string, an int, or an all-digit string (for example a CSV-sourced '1609459200000'); numeric values are assumed to already be epoch millis. A blank or whitespace-only watermark / created value (common in CSV) is treated as missing and leaves lastModified / createdAt unset rather than raising.

with_all_fields projects a raw dict onto every field in the schema. All original keys are kept; with fill_missing=True, schema fields absent from the dict are added as None:

with_all_fields(raw, schema, fill_missing=True)
all_field_names(schema)               # ['Id', 'Name', ...]

CSV

records = csv_to_records(csv_text, id_field='Id')
csv_text = records_to_csv(records)
csv_to_records(text, delimiter=';')   # custom delimiter

All CSV values are strings (CSV carries no types). Fully blank rows are skipped by default (skip_blank=False keeps them); rows with more cells than headers have the extra unnamed cells dropped rather than raising. A leading UTF-8 BOM is stripped so the first column name is not corrupted (and id_field / name_field still match). When fieldnames is omitted, records_to_csv uses the first-seen-order union of all record value keys.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

syncari_sdk-1.3.23.tar.gz (29.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

syncari_sdk-1.3.23-py3-none-any.whl (37.5 kB view details)

Uploaded Python 3

File details

Details for the file syncari_sdk-1.3.23.tar.gz.

File metadata

  • Download URL: syncari_sdk-1.3.23.tar.gz
  • Upload date:
  • Size: 29.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for syncari_sdk-1.3.23.tar.gz
Algorithm Hash digest
SHA256 21c3105e9cc5197f4ec78ee513e2d2c45c63fd4381d66d9b574bdac33f170a3d
MD5 0d5da407a5f017ac3d6ef7c201f90435
BLAKE2b-256 fa0e726fe4ec1dc543ab364de16d459e1815aac60fb2500dc3021973455846ca

See more details on using hashes here.

File details

Details for the file syncari_sdk-1.3.23-py3-none-any.whl.

File metadata

  • Download URL: syncari_sdk-1.3.23-py3-none-any.whl
  • Upload date:
  • Size: 37.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for syncari_sdk-1.3.23-py3-none-any.whl
Algorithm Hash digest
SHA256 80815ad6b47870fa66572e0d943cf591b54e21a6c039b42035b473ebdd7be8ea
MD5 531e1fc36626eb5e9a7b61259ddefd1f
BLAKE2b-256 dc56357d0c9fdec841ca06ca0827b72e84f3acfe9700efd39023512e88954bab

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.3.23 This release

2 files

1.3.22

2 files

1.3.21

2 files

1.3.19

2 files

1.3.18

2 files

1.3.17

2 files

1.3.16

2 files

1.3.15

2 files

1.3.14

2 files

1.3.13

2 files

1.3.12

2 files

1.3.11

2 files

1.3.10

2 files

1.3.9

2 files

1.3.8

2 files

1.3.7

2 files

1.3.6

2 files

1.3.5

2 files

1.3.4

2 files

1.3.3

2 files

1.3.2

2 files

1.3.1

2 files

1.3.0

3 files

1.2.17

2 files

1.2.16

2 files

1.2.15

2 files

1.2.14

2 files

1.2.13

2 files

1.2.12

2 files

1.2.11

2 files

1.2.10

2 files

1.2.9

2 files

1.2.8

2 files

1.2.7

2 files

1.2.6

2 files

1.2.5

2 files

1.2.4

2 files

1.2.3

2 files

1.2.2

2 files

1.1.17

2 files

1.1.16

2 files

1.1.14

2 files

1.1.13

2 files

1.1.12

2 files

1.1.11

2 files

1.1.10

2 files

1.1.9

2 files

1.1.8

2 files

1.1.7

2 files

1.1.6

2 files

1.1.5

2 files

1.1.4

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.3

2 files

1.0.2

2 files

1.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page