Skip to main content

PyCarol

PyCarol is a Python SDK designed to support data ingestion and data access workflows on Carol. It provides abstractions for authentication, connector and staging management, data ingestion, and querying, enabling reliable integration with Carol services using Python. The SDK encapsulates low-level API communication and authentication logic, making data pipelines easier to build, maintain, and operate.

Table of Contents

Getting Started

Run pip install pycarol to install the latest stable version from PyPI. Documentation is hosted on Read the Docs.

Explicit authentication methods

Carol is the main object to access pyCarol and Carol APIs.

Using user/password

from pycarol import PwdAuth, Carol

carol = Carol(
    domain=TENANT_NAME,
    app_name=APP_NAME,
    auth=PwdAuth(USERNAME, PASSWORD),
    organization=ORGANIZATION
)

Using Tokens

from pycarol import PwdKeyAuth, Carol

carol = Carol(
    domain=TENANT_NAME,
    app_name=APP_NAME,
    auth=PwdKeyAuth(pwd_auth_token),
    organization=ORGANIZATION
)

Using API Key

from pycarol import ApiKeyAuth, Carol

carol = Carol(
    domain=DOMAIN,
    app_name=APP_NAME,
    auth=ApiKeyAuth(api_key=X_AUTH_KEY),
    connector_id=CONNECTORID,
    organization=ORGANIZATION
)

Setting up Carol entities

from pycarol import Connectors

connector_id = Connectors(carol).create(
    name="my_connector",
    label="connector_label"
)

Sending Data

from pycarol import Staging

Staging(carol).send_data(
    staging_name="my_stag",
    data=[{"name": "Rafael"}],
    connector_id=CONNECTORID
)

Staging batch API: Batch ingestion

To group multiple send_data() calls under one batch (e.g. for Carol to process as a unit), use start_batch() and end_batch(). Each request is tagged with batchId and batchIdSequence. If you do not start a batch explicitly, a batch is auto-started and auto-ended around a single send_data() call.

  • ``Staging.start_batch()``: Starts a batch, generates a batchId, returns it.

  • ``Staging.end_batch()``: Sends the batch summary to Carol and clears the current batch.

  • ``Staging.send_data()``: When a batch is active, appends batchId and batchIdSequence to the intake URL.

from pycarol import Carol, Staging
from dotenv import load_dotenv
load_dotenv()

carol = Carol()
json_ex = [
    {"name": "Rafael", "email": {"type": "email", "email": "rafael@totvs.com.br"}},
    {"name": "Leandro", "email": {"type": "email", "email": "Leandro@totvs.com.br"}},
]
staging = Staging(carol)

# Single send_data: batch is generated internally
staging.send_data(staging_name="test_batch", data=json_ex, step_size=1,
                  connector_id=CONNECTORID, print_stats=True)

# User-managed batch for multiple intake calls
staging.start_batch()
staging.send_data(staging_name="test_batch", data=json_ex, step_size=1,
                  connector_id=CONNECTORID, print_stats=True)
staging.send_data(staging_name="test_batch", data=json_ex, step_size=4,
                  connector_id=CONNECTORID, print_stats=True)
staging.end_batch()

Reading data

from pycarol import BQ, Carol

BQ(Carol()).query("SELECT * FROM stg_connectorname_tablename")

Carol In Memory

PyCarol provides an easy way to work with in-memory data using the Memory class, built on top of DuckDB. Queries are executed locally over in-memory data, without triggering BigQuery jobs or consuming BigQuery slots, and results are returned as pandas DataFrames. The recommended usage is with BQStorage objects.

On BQStorage you can optionally indicate the dataset by declaring dataset_id. If you don’t, it will default to Carol’s dataset.

from pycarol import Carol, Memory, BQStorage
from dotenv import load_dotenv

load_dotenv()
carol = Carol()

storage = BQStorage(carol)
memory = Memory()

t = storage.query(
    "ingestion_stg_connectorname_tablename",
    column_names=["tenantid", "processing", "_ingestionDatetime"],
    max_stream_count=50
)
memory.add("my_table", t)

table = memory.query("SELECT * FROM my_table")
print(table)

The syntax of Carol In Memory follows DuckDB SQL Syntax.

Logging

Prerequisites

Set LONGTASKID when running locally.

Logging messages to Carol

import logging
from pycarol import CarolHandler, Carol

logger = logging.getLogger(__name__)
logger.addHandler(CarolHandler(Carol()))
logger.info("Hello Carol")

Notes

  • Logs are linked to long tasks

  • Console fallback when task ID is missing

Calling Carol APIs

In addition to the high-level abstractions provided by pyCarol, it is also possible to call Carol APIs directly when needed. This is useful for endpoints that are not yet covered by specific SDK methods.

carol.call_api(
    "v1/tenantApps/subscribe/carolApps/{carol_app_id}",
    method="POST"
)

Settings

from pycarol.apps import Apps
Apps(carol).get_settings(app_name="my_app")

Useful Functions

from pycarol.functions import track_tasks
track_tasks(carol, ["task1", "task2"])

Release process

  1. Open PR to main

  2. Merge after approval

  3. Update README if needed

Made with ❤ at TOTVS IDeIA

Release files for pycarol 2.56.14

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pycarol 2.56.14
File Size Uploaded
pycarol-2.56.14.tar.gz 120.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pycarol 2.56.14
File Interpreter ABI Platform
pycarol-2.56.14-py3-none-any.whl Python 3 none any Details

Total release size: 258.3 kB

Release files / pycarol-2.56.14.tar.gz

Download URL pycarol-2.56.14.tar.gz
Size 120.7 kB
Tags Source
SHA-256 checksum
How to use checksums
2fae05322ae854f50600a1893e39b62b9acfad8b9d0ab9883d89c64bbfa8ee0d
BLAKE2b-256 checksum
How to use checksums
6c8254a89ff9ca6657b4d861af863cf623ed09ece663a80d07b9756cf53ec644
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release files / pycarol-2.56.14-py3-none-any.whl

Download URL pycarol-2.56.14-py3-none-any.whl
Size 137.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a400b7a326eafe6319b9735c82671ae59ff36b45aa1aa5ec86530e2799c942f6
BLAKE2b-256 checksum
How to use checksums
267b36bd72b543d73718d9886194d8e70f53226627b9694d2757f69c5429ef92
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release history Release notifications | RSS feed

This release

2.56.14 This release

2 release files

2.56.2

2 release files

2.56.1

2 release files

2.56.0

2 release files

2.55.7

2 release files

2.55.6

2 release files

2.55.4

2 release files

2.55.3

2 release files

2.55.0

1 release file

2.54.15

1 release file

2.54.13

1 release file

2.54.12

1 release file

2.54.10

1 release file

2.54.9

1 release file

2.54.8

1 release file

2.54.7

1 release file

2.54.6

1 release file

2.54.5

1 release file

2.54.4

1 release file

2.54.3

1 release file

2.54.2

1 release file

2.54.1

1 release file

2.54.0

1 release file

2.53.0

1 release file

2.52.6

1 release file

2.52.5

1 release file

2.52.4

1 release file

2.52.3

1 release file

2.52.2

1 release file

2.52.1

1 release file

2.52.0

1 release file

2.51.2

1 release file

2.51.1

1 release file

2.51.0

1 release file

2.50.0

1 release file

2.49.0

1 release file

2.48.2

1 release file

2.48.1

1 release file

2.48.0

1 release file

2.47.8

1 release file

2.47.7

1 release file

2.47.6

1 release file

2.47.5

1 release file

2.47.4

1 release file

2.47.3

1 release file

2.47.2

1 release file

2.47.1

1 release file

2.47.0

1 release file

2.46.3

1 release file

2.46.2

1 release file

2.46.0

1 release file

2.45.8

1 release file

2.45.7

1 release file

2.45.6

1 release file

2.45.5

1 release file

2.45.4

1 release file

2.45.3

1 release file

2.45.2

1 release file

2.45.1

1 release file

2.45.0

1 release file

2.44.0

1 release file

2.42.0

1 release file

2.41.3

1 release file

2.41.2

1 release file

2.41.1

1 release file

2.41.0

1 release file

2.40.6

1 release file

2.40.5

1 release file

2.40.4

1 release file

2.40.3

1 release file

2.40.2

1 release file

2.40.1

1 release file

2.40.0

1 release file

2.39.2

1 release file

2.39.1

1 release file

2.39.0

1 release file

2.38.0

1 release file

2.37.0

1 release file

2.35.1

1 release file

2.35.0

1 release file

2.34.3

1 release file

2.34.2

1 release file

2.34.1

1 release file

2.34.0

1 release file

2.33.3

1 release file

2.33.2

1 release file

2.33.1

1 release file

2.33.0

1 release file

2.32.1

1 release file

2.32.0

1 release file

2.31.2

1 release file

2.31.1

1 release file

2.30.0

1 release file

2.29.2

1 release file

2.29.1

1 release file

2.29.0

1 release file

2.28.1

1 release file

2.28.0

1 release file

2.27.2

1 release file

2.27.1

1 release file

2.27.0

1 release file

2.26.0

1 release file

2.25.0

1 release file

2.24.2

1 release file

2.24.1

1 release file

2.24.0

1 release file

2.23.0

1 release file

2.22.0

1 release file

2.21.0

1 release file

2.20.2

1 release file

2.20.1

1 release file

2.20.0

1 release file

2.19.4

1 release file

2.19.3

1 release file

2.19.2

1 release file

2.19.1

1 release file

2.19.0

1 release file

2.18.0

1 release file

2.17.0

1 release file

2.16.4

1 release file

2.16.3

1 release file

2.16.2

1 release file

2.16.1

1 release file

2.15.3

1 release file

2.15.2

1 release file

2.15.1

1 release file

2.14.3

1 release file

2.14.2

1 release file

2.14.1

1 release file

2.13.7

1 release file

2.13.6

1 release file

2.13.5

1 release file

2.13.4

1 release file

2.13.3

1 release file

2.13.2

1 release file

2.13.1

1 release file

2.12.3

1 release file

2.12.2

1 release file

2.12.1

1 release file

2.12

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page