bizon 0.1.0__py3-none-any.whl → 0.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bizon/alerting/__init__.py +0 -0
- bizon/alerting/alerts.py +23 -0
- bizon/alerting/models.py +28 -0
- bizon/alerting/slack/__init__.py +0 -0
- bizon/alerting/slack/config.py +5 -0
- bizon/alerting/slack/handler.py +39 -0
- bizon/cli/main.py +7 -3
- bizon/common/models.py +33 -7
- bizon/{destinations → connectors/destinations}/bigquery/config/bigquery.example.yml +3 -4
- bizon/connectors/destinations/bigquery/src/config.py +128 -0
- bizon/{destinations → connectors/destinations}/bigquery/src/destination.py +48 -25
- bizon/connectors/destinations/bigquery_streaming/src/config.py +57 -0
- bizon/connectors/destinations/bigquery_streaming/src/destination.py +377 -0
- bizon/connectors/destinations/bigquery_streaming_v2/src/config.py +57 -0
- bizon/connectors/destinations/bigquery_streaming_v2/src/destination.py +446 -0
- bizon/{destinations/bigquery_streaming → connectors/destinations/bigquery_streaming_v2}/src/proto_utils.py +30 -36
- bizon/{destinations → connectors/destinations}/file/src/config.py +9 -3
- bizon/connectors/destinations/file/src/destination.py +56 -0
- bizon/{destinations → connectors/destinations}/logger/src/config.py +2 -1
- bizon/{destinations → connectors/destinations}/logger/src/destination.py +18 -3
- bizon/connectors/sources/cycle/config/cycle.example.yml +15 -0
- bizon/connectors/sources/cycle/src/source.py +133 -0
- bizon/{sources/periscope/tests/periscope_pipeline_dashboard.py → connectors/sources/cycle/tests/cycle_customers.py} +1 -1
- bizon/{sources → connectors/sources}/dummy/config/dummy.example.yml +2 -2
- bizon/{sources → connectors/sources}/dummy/src/fake_api.py +6 -1
- bizon/{sources → connectors/sources}/dummy/src/source.py +18 -5
- bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline.py +2 -2
- bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_bigquery_backend.py +2 -2
- bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_kafka.py +2 -2
- bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_rabbitmq.py +2 -2
- bizon/connectors/sources/dummy/tests/dummy_pipeline_unnest.py +29 -0
- bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_write_data_bigquery.py +2 -2
- bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_write_data_bigquery_through_kafka.py +2 -2
- bizon/{sources → connectors/sources}/gsheets/config/default_auth.example.yml +4 -2
- bizon/{sources → connectors/sources}/gsheets/config/service_account.example.yml +4 -2
- bizon/{sources → connectors/sources}/hubspot/config/api_key.example.yml +4 -2
- bizon/{sources → connectors/sources}/hubspot/config/oauth.example.yml +4 -2
- bizon/{sources → connectors/sources}/hubspot/src/hubspot_objects.py +1 -1
- bizon/{sources → connectors/sources}/kafka/config/kafka.example.yml +3 -5
- bizon/connectors/sources/kafka/config/kafka_debezium.example.yml +110 -0
- bizon/connectors/sources/kafka/src/callback.py +18 -0
- bizon/connectors/sources/kafka/src/config.py +69 -0
- bizon/connectors/sources/kafka/src/decode.py +93 -0
- bizon/connectors/sources/kafka/src/source.py +381 -0
- bizon/connectors/sources/kafka/tests/kafka_pipeline.py +7 -0
- bizon/connectors/sources/periscope/config/periscope_charts.example.yml +20 -0
- bizon/connectors/sources/periscope/config/periscope_dashboards.example.yml +20 -0
- bizon/{sources → connectors/sources}/periscope/src/source.py +137 -13
- bizon/connectors/sources/periscope/tests/periscope_pipeline_dashboard.py +9 -0
- bizon/connectors/sources/pokeapi/config/pokeapi_pokemon_to_json.example.yml +19 -0
- bizon/connectors/sources/pokeapi/config/pokeapi_pokemon_to_logger.example.yml +10 -0
- bizon/connectors/sources/pokeapi/src/source.py +79 -0
- bizon/{destinations → destination}/buffer.py +5 -0
- bizon/destination/config.py +83 -0
- bizon/{destinations → destination}/destination.py +103 -15
- bizon/engine/backend/adapters/sqlalchemy/backend.py +3 -1
- bizon/engine/engine.py +20 -1
- bizon/engine/pipeline/consumer.py +73 -5
- bizon/engine/pipeline/models.py +8 -3
- bizon/engine/pipeline/producer.py +18 -9
- bizon/engine/queue/adapters/kafka/consumer.py +2 -2
- bizon/engine/queue/adapters/kafka/queue.py +3 -2
- bizon/engine/queue/adapters/python_queue/consumer.py +40 -23
- bizon/engine/queue/adapters/python_queue/queue.py +19 -9
- bizon/engine/queue/adapters/rabbitmq/consumer.py +3 -6
- bizon/engine/queue/adapters/rabbitmq/queue.py +3 -2
- bizon/engine/queue/config.py +16 -0
- bizon/engine/queue/queue.py +17 -16
- bizon/engine/runner/adapters/process.py +15 -2
- bizon/engine/runner/adapters/streaming.py +121 -0
- bizon/engine/runner/adapters/thread.py +32 -9
- bizon/engine/runner/config.py +28 -0
- bizon/engine/runner/runner.py +113 -24
- bizon/monitoring/__init__.py +0 -0
- bizon/monitoring/config.py +39 -0
- bizon/monitoring/datadog/__init__.py +0 -0
- bizon/monitoring/datadog/monitor.py +153 -0
- bizon/monitoring/monitor.py +71 -0
- bizon/monitoring/noop/__init__.py +0 -0
- bizon/monitoring/noop/monitor.py +30 -0
- bizon/source/callback.py +24 -0
- bizon/source/config.py +3 -3
- bizon/source/cursor.py +1 -1
- bizon/source/discover.py +4 -3
- bizon/source/models.py +4 -2
- bizon/source/source.py +10 -2
- bizon/transform/config.py +8 -0
- bizon/transform/transform.py +48 -0
- {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/METADATA +23 -6
- bizon-0.1.2.dist-info/RECORD +123 -0
- {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/WHEEL +1 -1
- bizon/destinations/bigquery/src/config.py +0 -51
- bizon/destinations/bigquery_streaming/src/config.py +0 -43
- bizon/destinations/bigquery_streaming/src/destination.py +0 -154
- bizon/destinations/config.py +0 -47
- bizon/destinations/file/src/destination.py +0 -27
- bizon/sources/kafka/src/source.py +0 -357
- bizon/sources/kafka/tests/kafka_pipeline.py +0 -9
- bizon/sources/periscope/config/periscope_charts.example.yml +0 -26
- bizon/sources/periscope/config/periscope_dashboards.example.yml +0 -26
- bizon-0.1.0.dist-info/RECORD +0 -93
- /bizon/{sources → connectors/sources}/gsheets/src/source.py +0 -0
- /bizon/{sources → connectors/sources}/gsheets/tests/gsheets_pipeline.py +0 -0
- /bizon/{sources → connectors/sources}/hubspot/src/hubspot_base.py +0 -0
- /bizon/{sources → connectors/sources}/hubspot/src/models/hs_object.py +0 -0
- /bizon/{sources → connectors/sources}/hubspot/tests/hubspot_pipeline.py +0 -0
- /bizon/{sources → connectors/sources}/periscope/tests/periscope_pipeline_charts.py +0 -0
- /bizon/{destinations → destination}/models.py +0 -0
- {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/LICENSE +0 -0
- {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/entry_points.txt +0 -0
bizon/source/callback.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
from bizon.source.config import SourceConfig
|
|
5
|
+
from bizon.source.models import SourceIteration
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AbstractSourceCallback(ABC):
|
|
9
|
+
@abstractmethod
|
|
10
|
+
def __init__(self, config: SourceConfig):
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
@abstractmethod
|
|
14
|
+
def on_iterations_written(self, iterations: List[SourceIteration]):
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class NoOpSourceCallback(AbstractSourceCallback):
|
|
19
|
+
def __init__(self, config: SourceConfig):
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
def on_iterations_written(self, iterations: List[SourceIteration]):
|
|
23
|
+
"""No-op callback"""
|
|
24
|
+
pass
|
bizon/source/config.py
CHANGED
|
@@ -21,7 +21,7 @@ class SourceSyncModes(str, Enum):
|
|
|
21
21
|
INCREMENTAL = "incremental"
|
|
22
22
|
|
|
23
23
|
# Stream mode
|
|
24
|
-
# - get single RUNNING streamJob
|
|
24
|
+
# - get single RUNNING streamJob syncs data from the last successfuly committed offset in the source system
|
|
25
25
|
STREAM = "stream"
|
|
26
26
|
|
|
27
27
|
|
|
@@ -32,8 +32,8 @@ class APIConfig(BaseModel):
|
|
|
32
32
|
class SourceConfig(BaseModel, ABC):
|
|
33
33
|
|
|
34
34
|
# Connector identifier to use, match a unique connector code
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
name: str = Field(..., description="Name of the source to sync")
|
|
36
|
+
stream: str = Field(..., description="Name of the stream to sync")
|
|
37
37
|
|
|
38
38
|
source_file_path: Optional[str] = Field(
|
|
39
39
|
default=None, description="Path to the source file, if not provided will look into bizon internal sources"
|
bizon/source/cursor.py
CHANGED
|
@@ -106,7 +106,7 @@ class Cursor:
|
|
|
106
106
|
self.job_status = JobStatus.SUCCEEDED
|
|
107
107
|
|
|
108
108
|
if self.total_records is not None and self.rows_fetched != self.total_records:
|
|
109
|
-
logger.
|
|
109
|
+
logger.info(
|
|
110
110
|
(
|
|
111
111
|
f"Source: {self.source_full_name} - Iteration {self.iteration} - "
|
|
112
112
|
f"Total records fetched: {self.rows_fetched} "
|
bizon/source/discover.py
CHANGED
|
@@ -57,8 +57,9 @@ def find_inherited_classes(file_path):
|
|
|
57
57
|
def get_python_import_path(relative_path: str) -> str:
|
|
58
58
|
"""Transform a relative path to a python import path"""
|
|
59
59
|
python_path = relative_path.replace("/", ".").replace(".py", "")
|
|
60
|
+
|
|
60
61
|
# Find the index where the desired substring starts
|
|
61
|
-
start_index = python_path.find("bizon.sources
|
|
62
|
+
start_index = python_path.find("bizon.connectors.sources")
|
|
62
63
|
|
|
63
64
|
# Extract the substring from that point onwards
|
|
64
65
|
if start_index != -1:
|
|
@@ -69,13 +70,13 @@ def get_python_import_path(relative_path: str) -> str:
|
|
|
69
70
|
def find_all_source_paths(source_dir_name: str = "src") -> Mapping[str, str]:
|
|
70
71
|
"""Find all source code paths in the sources directory
|
|
71
72
|
Return a dict mapping source_name to source_code_path
|
|
72
|
-
Like {'gsheets': '/path/to/bizon/sources/gsheets/src'}
|
|
73
|
+
Like {'gsheets': '/path/to/bizon/connectors/sources/gsheets/src'}
|
|
73
74
|
"""
|
|
74
75
|
|
|
75
76
|
discovered_sources_paths = {}
|
|
76
77
|
|
|
77
78
|
# Leading to the bizon internal sources directory
|
|
78
|
-
base_dir = os.path.join(BIZON_ABSOLUTE_PATH, "sources")
|
|
79
|
+
base_dir = os.path.join(BIZON_ABSOLUTE_PATH, "connectors", "sources")
|
|
79
80
|
|
|
80
81
|
for source_name in os.listdir(base_dir):
|
|
81
82
|
|
bizon/source/models.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
1
|
from datetime import datetime
|
|
3
|
-
from typing import List, Union
|
|
2
|
+
from typing import List, Optional, Union
|
|
4
3
|
|
|
5
4
|
import polars as pl
|
|
6
5
|
from pydantic import BaseModel, Field, field_validator
|
|
@@ -12,6 +11,7 @@ source_record_schema = pl.Schema(
|
|
|
12
11
|
("id", str),
|
|
13
12
|
("data", str), # JSON payload dumped as string
|
|
14
13
|
("timestamp", pl.Datetime(time_unit="us", time_zone="UTC")),
|
|
14
|
+
("destination_id", str),
|
|
15
15
|
]
|
|
16
16
|
)
|
|
17
17
|
|
|
@@ -28,6 +28,8 @@ class SourceRecord(BaseModel):
|
|
|
28
28
|
description="Timestamp of the record as defined by the source. Default is the time of extraction",
|
|
29
29
|
)
|
|
30
30
|
|
|
31
|
+
destination_id: Optional[str] = Field(None, description="Destination id")
|
|
32
|
+
|
|
31
33
|
@field_validator("id", mode="before")
|
|
32
34
|
def coerce_int_to_str(value: Union[int, str]) -> str:
|
|
33
35
|
# Coerce int to str in case Source return id as int
|
bizon/source/source.py
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
|
-
from datetime import datetime
|
|
3
2
|
from typing import Any, List, Optional, Tuple, Type, Union
|
|
4
3
|
|
|
5
4
|
from requests.auth import AuthBase
|
|
6
5
|
|
|
6
|
+
from .callback import AbstractSourceCallback, NoOpSourceCallback
|
|
7
7
|
from .config import SourceConfig
|
|
8
|
-
from .models import SourceIncrementalState, SourceIteration
|
|
8
|
+
from .models import SourceIncrementalState, SourceIteration, SourceRecord
|
|
9
9
|
from .session import Session
|
|
10
10
|
|
|
11
11
|
|
|
@@ -36,6 +36,10 @@ class AbstractSource(ABC):
|
|
|
36
36
|
"""Return the config class for the source"""
|
|
37
37
|
pass
|
|
38
38
|
|
|
39
|
+
def get_source_callback_instance(self) -> AbstractSourceCallback:
|
|
40
|
+
"""Return an instance of the source callback"""
|
|
41
|
+
return NoOpSourceCallback(config=self.config)
|
|
42
|
+
|
|
39
43
|
@abstractmethod
|
|
40
44
|
def get_authenticator(self) -> Union[AuthBase, None]:
|
|
41
45
|
"""Return an authenticator for the source, it will be set in the session
|
|
@@ -96,3 +100,7 @@ class AbstractSource(ABC):
|
|
|
96
100
|
def get_session(self) -> Session:
|
|
97
101
|
"""Return a new session"""
|
|
98
102
|
return Session()
|
|
103
|
+
|
|
104
|
+
def commit(self):
|
|
105
|
+
"""Commit the records to the source"""
|
|
106
|
+
pass
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import textwrap
|
|
3
|
+
|
|
4
|
+
import polars as pl
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
7
|
+
from .config import TransformModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Transform:
|
|
11
|
+
|
|
12
|
+
def __init__(self, transforms: list[TransformModel]):
|
|
13
|
+
self.transforms = transforms
|
|
14
|
+
|
|
15
|
+
def apply_transforms(self, df_source_records: pl.DataFrame) -> pl.DataFrame:
|
|
16
|
+
"""Apply transformation on df_source_records"""
|
|
17
|
+
|
|
18
|
+
# Process the transformations
|
|
19
|
+
for transform in self.transforms:
|
|
20
|
+
|
|
21
|
+
logger.debug(f"Applying transform {transform.label}")
|
|
22
|
+
|
|
23
|
+
# Create a function to be executed in the desired context
|
|
24
|
+
def my_transform(data: str) -> str:
|
|
25
|
+
|
|
26
|
+
data = json.loads(data)
|
|
27
|
+
|
|
28
|
+
# Start writing here
|
|
29
|
+
local_vars = {"data": data}
|
|
30
|
+
|
|
31
|
+
# Normalize the indentation of the Python code
|
|
32
|
+
normalized_python = textwrap.dedent(transform.python)
|
|
33
|
+
|
|
34
|
+
exec(normalized_python, {}, local_vars)
|
|
35
|
+
|
|
36
|
+
# Stop writing here
|
|
37
|
+
return json.dumps(local_vars["data"])
|
|
38
|
+
|
|
39
|
+
transformed_source_records = []
|
|
40
|
+
|
|
41
|
+
for row in df_source_records["data"].to_list():
|
|
42
|
+
transformed_source_records.append(my_transform(row))
|
|
43
|
+
|
|
44
|
+
df_source_records = df_source_records.with_columns(
|
|
45
|
+
pl.Series("data", transformed_source_records, dtype=pl.String).alias("data")
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
return df_source_records
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: bizon
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Extract and load your data reliably from API Clients with native fault-tolerant and checkpointing mechanism.
|
|
5
5
|
Author: Antoine Balliet
|
|
6
6
|
Author-email: antoine.balliet@gmail.com
|
|
@@ -11,6 +11,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
13
|
Provides-Extra: bigquery
|
|
14
|
+
Provides-Extra: datadog
|
|
14
15
|
Provides-Extra: gsheets
|
|
15
16
|
Provides-Extra: kafka
|
|
16
17
|
Provides-Extra: postgres
|
|
@@ -19,6 +20,8 @@ Requires-Dist: avro (>=1.12.0,<2.0.0) ; extra == "kafka"
|
|
|
19
20
|
Requires-Dist: backoff (>=2.2.1,<3.0.0)
|
|
20
21
|
Requires-Dist: click (>=8.1.7,<9.0.0)
|
|
21
22
|
Requires-Dist: confluent-kafka (>=2.6.0,<3.0.0) ; extra == "kafka"
|
|
23
|
+
Requires-Dist: datadog (>=0.50.2,<0.51.0) ; extra == "datadog"
|
|
24
|
+
Requires-Dist: ddtrace (>=3.10.0,<4.0.0) ; extra == "datadog"
|
|
22
25
|
Requires-Dist: dpath (>=2.2.0,<3.0.0)
|
|
23
26
|
Requires-Dist: fastavro (>=1.9.7,<2.0.0) ; extra == "kafka"
|
|
24
27
|
Requires-Dist: google-cloud-bigquery (>=3.25.0,<4.0.0) ; extra == "bigquery"
|
|
@@ -27,6 +30,7 @@ Requires-Dist: google-cloud-storage (>=2.17.0,<3.0.0)
|
|
|
27
30
|
Requires-Dist: gspread (>=6.1.2,<7.0.0) ; extra == "gsheets"
|
|
28
31
|
Requires-Dist: kafka-python (>=2.0.2,<3.0.0) ; extra == "kafka"
|
|
29
32
|
Requires-Dist: loguru (>=0.7.2,<0.8.0)
|
|
33
|
+
Requires-Dist: orjson (>=3.10.16,<4.0.0)
|
|
30
34
|
Requires-Dist: pendulum (>=3.0.0,<4.0.0)
|
|
31
35
|
Requires-Dist: pika (>=1.3.2,<2.0.0) ; extra == "rabbitmq"
|
|
32
36
|
Requires-Dist: polars (>=1.16.0,<2.0.0)
|
|
@@ -39,8 +43,10 @@ Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
|
|
|
39
43
|
Requires-Dist: pytz (>=2024.2,<2025.0)
|
|
40
44
|
Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
|
|
41
45
|
Requires-Dist: requests (>=2.28.2,<3.0.0)
|
|
46
|
+
Requires-Dist: simplejson (>=3.20.1,<4.0.0)
|
|
42
47
|
Requires-Dist: sqlalchemy (>=2.0.32,<3.0.0)
|
|
43
48
|
Requires-Dist: sqlalchemy-bigquery (>=1.11.0,<2.0.0) ; extra == "bigquery"
|
|
49
|
+
Requires-Dist: tenacity (>=9.0.0,<10.0.0)
|
|
44
50
|
Description-Content-Type: text/markdown
|
|
45
51
|
|
|
46
52
|
# bizon ⚡️
|
|
@@ -48,13 +54,17 @@ Extract and load your largest data streams with a framework you can trust for bi
|
|
|
48
54
|
|
|
49
55
|
## Features
|
|
50
56
|
- **Natively fault-tolerant**: Bizon uses a checkpointing mechanism to keep track of the progress and recover from the last checkpoint.
|
|
57
|
+
|
|
51
58
|
- **High throughput**: Bizon is designed to handle high throughput and can process billions of records.
|
|
59
|
+
|
|
52
60
|
- **Queue system agnostic**: Bizon is agnostic of the queuing system, you can use any queuing system among Python Queue, RabbitMQ, Kafka or Redpanda. Thanks to the `bizon.engine.queue.Queue` interface, adapters can be written for any queuing system.
|
|
53
|
-
|
|
61
|
+
|
|
62
|
+
- **Pipeline metrics**: Bizon provides exhaustive pipeline metrics and implement Datadog & OpenTelemetry for tracing. You can monitor:
|
|
54
63
|
- ETAs for completion
|
|
55
64
|
- Number of records processed
|
|
56
65
|
- Completion percentage
|
|
57
66
|
- Latency Source <> Destination
|
|
67
|
+
|
|
58
68
|
- **Lightweight & lean**: Bizon is lightweight, minimal codebase and only uses few dependencies:
|
|
59
69
|
- `requests` for HTTP requests
|
|
60
70
|
- `pyyaml` for configuration
|
|
@@ -83,8 +93,8 @@ Create a file named `config.yml` in your working directory with the following co
|
|
|
83
93
|
name: demo-creatures-pipeline
|
|
84
94
|
|
|
85
95
|
source:
|
|
86
|
-
|
|
87
|
-
|
|
96
|
+
name: dummy
|
|
97
|
+
stream: creatures
|
|
88
98
|
authentication:
|
|
89
99
|
type: api_key
|
|
90
100
|
params:
|
|
@@ -105,7 +115,7 @@ bizon run config.yml
|
|
|
105
115
|
|
|
106
116
|
Backend is the interface used by Bizon to store its state. It can be configured in the `backend` section of the configuration file. The following backends are supported:
|
|
107
117
|
- `sqlite`: In-memory SQLite database, useful for testing and development.
|
|
108
|
-
- `
|
|
118
|
+
- `bigquery`: Google BigQuery backend, perfect for light setup & production.
|
|
109
119
|
- `postgres`: PostgreSQL backend, for production use and frequent cursor updates.
|
|
110
120
|
|
|
111
121
|
## Queue configuration
|
|
@@ -115,6 +125,13 @@ Queue is the interface used by Bizon to exchange data between `Source` and `Dest
|
|
|
115
125
|
- `rabbitmq`: RabbitMQ, for production use and high throughput.
|
|
116
126
|
- `kafka`: Apache Kafka, for production use and high throughput and strong persistence.
|
|
117
127
|
|
|
128
|
+
## Runner configuration
|
|
129
|
+
|
|
130
|
+
Runner is the interface used by Bizon to run the pipeline. It can be configured in the `runner` section of the configuration file. The following runners are supported:
|
|
131
|
+
- `thread` (asynchronous)
|
|
132
|
+
- `process` (asynchronous)
|
|
133
|
+
- `stream` (synchronous)
|
|
134
|
+
|
|
118
135
|
## Start syncing your data 🚀
|
|
119
136
|
|
|
120
137
|
### Quick setup without any dependencies ✌️
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
bizon/__main__.py,sha256=6GV4zEg2wC8UBnmESrr71ZmpWo4cNWlrYE3PQuKwFHA,69
|
|
2
|
+
bizon/alerting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
bizon/alerting/alerts.py,sha256=BQJaFL9cv7gH4fopB1MCX8BFqgjZMdfDIfBqj3e1pcs,676
|
|
4
|
+
bizon/alerting/models.py,sha256=kWTeoT7dDC6UrkybU1sRAIXNAE0Wwipf8W7dEEhMZM0,553
|
|
5
|
+
bizon/alerting/slack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
bizon/alerting/slack/config.py,sha256=D_CAtzXu-O41OVoyrlYRlBxnGN9rNbnohYQ9CmBYt_E,84
|
|
7
|
+
bizon/alerting/slack/handler.py,sha256=0m6IUSkxqDMlpDWslkImQX74ScD8wIx3YtrhfpYNGUA,1620
|
|
8
|
+
bizon/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
+
bizon/cli/main.py,sha256=pQnphPLznllBVzifyIrn3es0U9E1VGSzeEv_COzq9FI,3364
|
|
10
|
+
bizon/cli/utils.py,sha256=aZ47YjFfifHkW95bAVzWfEQD3ZnxGSMT32bkRLmc5-c,953
|
|
11
|
+
bizon/common/errors/backoff.py,sha256=z7RkQt1Npdh0sfD3hBDaiWQKe4iqS6ewvT1Q4Fds5aU,508
|
|
12
|
+
bizon/common/errors/errors.py,sha256=mrYx1uE2kOuR2pEaB7ztK1l2m0E4V-_-hxq-DuILerY,682
|
|
13
|
+
bizon/common/models.py,sha256=yJbYhdzsMWwp2qWXO1cjT3nUhLtqMKM9yLEecb5NFTg,2710
|
|
14
|
+
bizon/connectors/destinations/bigquery/config/bigquery.example.yml,sha256=sy5-Piew00BlcjX5CFayFVrUq9G_vFYWXDmpWi9beTY,1263
|
|
15
|
+
bizon/connectors/destinations/bigquery/src/config.py,sha256=erTcw4M3ki5uvB2UJD5yxI80T7KVZj57_e70TB8ddLY,4001
|
|
16
|
+
bizon/connectors/destinations/bigquery/src/destination.py,sha256=5LtIH2i3tNivYiRj8RBXjRmeGJNIaYQJOIMNuXw42Ds,8969
|
|
17
|
+
bizon/connectors/destinations/bigquery_streaming/src/config.py,sha256=LdBKEqHPaGll8PW6c6q_lH7PJvsGdtv2BCrtB-TukTA,1898
|
|
18
|
+
bizon/connectors/destinations/bigquery_streaming/src/destination.py,sha256=aqMRDcSeX1hGO3VjyGs6lvd9BKbtwtbpdGSLI9xliko,16000
|
|
19
|
+
bizon/connectors/destinations/bigquery_streaming_v2/src/config.py,sha256=cdHST5Vx1VQbLsIVsPkoEtOJKmbA35XjsKzj6fZ5DHw,1907
|
|
20
|
+
bizon/connectors/destinations/bigquery_streaming_v2/src/destination.py,sha256=UgUne8dNsWIfhB7bXiPVZMlq5jx7eeAshc0sPglULzc,18638
|
|
21
|
+
bizon/connectors/destinations/bigquery_streaming_v2/src/proto_utils.py,sha256=aWYVzMPMTgsdDapYniu8h6Tf2Pty4fDisT_33d9yEJ4,3692
|
|
22
|
+
bizon/connectors/destinations/file/src/config.py,sha256=_SwVmFouv9HBCyBVR5B4CwSrfeOy8RFMcekvseTpD7Y,595
|
|
23
|
+
bizon/connectors/destinations/file/src/destination.py,sha256=9jXPm6nRrdQAD0udmOJtTt5Aab_tUuuDg7mHhngBgaA,1832
|
|
24
|
+
bizon/connectors/destinations/logger/src/config.py,sha256=IIB9DiGHTMJ0kJ7pkNojoyywiFwQlmVFdYL627nJ4rA,458
|
|
25
|
+
bizon/connectors/destinations/logger/src/destination.py,sha256=OU2eGcVXGzCNTu8qYxokKt3OmDHG5-hsPRIW2PqfZrM,1233
|
|
26
|
+
bizon/connectors/sources/cycle/config/cycle.example.yml,sha256=UDiqOa-8ZsykmNT625kxq9tyXOj_gKe9CFwg9r_8SYk,230
|
|
27
|
+
bizon/connectors/sources/cycle/src/source.py,sha256=NCYiAnQZOCwwyMPoRhv3LFlG-UlMBCR3iPapuk3AwAA,4265
|
|
28
|
+
bizon/connectors/sources/cycle/tests/cycle_customers.py,sha256=A48S20LxIC0A74JLoFn4NTHNTgBWV_5stTFtF1Gfk2c,271
|
|
29
|
+
bizon/connectors/sources/dummy/config/dummy.example.yml,sha256=Wvn8v644u1aKvRRsPzPPML4kYmWk0ZhMGrCPFoSbVZQ,331
|
|
30
|
+
bizon/connectors/sources/dummy/src/fake_api.py,sha256=5EEETp9INOmDJ57FNXm6wnsRtofQmR1xYp8hUKjn0Es,3067
|
|
31
|
+
bizon/connectors/sources/dummy/src/source.py,sha256=QPjrfbFmxZpVplHsc773657cuBRc2LnMuVOwcua1hc0,4095
|
|
32
|
+
bizon/connectors/sources/dummy/tests/dummy_pipeline.py,sha256=V9EKvugFXm3aNQVip-kMzlmvjlW6sZNGldxW1WdRa-E,397
|
|
33
|
+
bizon/connectors/sources/dummy/tests/dummy_pipeline_bigquery_backend.py,sha256=SO_x_IH9iY1e09NHJlS1-CON0SI21fxGFqljSz4EmM4,542
|
|
34
|
+
bizon/connectors/sources/dummy/tests/dummy_pipeline_kafka.py,sha256=zKhE7dhd6C4E_7VMepR8nSsGnesTJWXwlak-Dj01GD0,473
|
|
35
|
+
bizon/connectors/sources/dummy/tests/dummy_pipeline_rabbitmq.py,sha256=A6KmSEOlWMK0UuIZhZxWO8y-z8h19rtWEV8DuhKX8Xs,686
|
|
36
|
+
bizon/connectors/sources/dummy/tests/dummy_pipeline_unnest.py,sha256=64ZhjXUyZHzaIZTL_DO425yN6SlpB1vxzfhziE_pSEw,510
|
|
37
|
+
bizon/connectors/sources/dummy/tests/dummy_pipeline_write_data_bigquery.py,sha256=oTV9HmOzjs3B2WwTPzDlIT_VkoYuXxy1BtSkeTGkQqw,686
|
|
38
|
+
bizon/connectors/sources/dummy/tests/dummy_pipeline_write_data_bigquery_through_kafka.py,sha256=PFUhDuFw1Q1AMNMsnXPQxoqHIWf_wHEL1hLQodYlLcQ,596
|
|
39
|
+
bizon/connectors/sources/gsheets/config/default_auth.example.yml,sha256=KOBp6MfO4uJwpwEYW0tJ4X5ctVwwdur9poJB4Ohba6s,348
|
|
40
|
+
bizon/connectors/sources/gsheets/config/service_account.example.yml,sha256=XxVUnk9gGWc3lDb8CnzTHjTu8xz4Asyr5tXzY6qLvPg,1081
|
|
41
|
+
bizon/connectors/sources/gsheets/src/source.py,sha256=2N0_TmuCdRyieVAiTsG3niov4l3KeibCpbDNNyRVbvQ,5660
|
|
42
|
+
bizon/connectors/sources/gsheets/tests/gsheets_pipeline.py,sha256=lNSM3kZTd4W_-ajGIO3mdp8qGdEbnmWqsMm5pRiS0cw,181
|
|
43
|
+
bizon/connectors/sources/hubspot/config/api_key.example.yml,sha256=VDTRloE5caqAdGdXgvsJZ6nQT46JHzX_YboxeGbpP18,389
|
|
44
|
+
bizon/connectors/sources/hubspot/config/oauth.example.yml,sha256=YqBtj1IxIsdM9E85_4eVWl6mPiHsQNoQn41EzCqORy0,499
|
|
45
|
+
bizon/connectors/sources/hubspot/src/hubspot_base.py,sha256=F9_jEZnQTCRazETJ2_HeDKv9NNxG11umYmJ0FhUmTu4,3425
|
|
46
|
+
bizon/connectors/sources/hubspot/src/hubspot_objects.py,sha256=rlZl-pUb9IGq5Hbfa15JwrQZOr4uCp7q_rrQus7u3OI,6289
|
|
47
|
+
bizon/connectors/sources/hubspot/src/models/hs_object.py,sha256=-Y20H3-nenJyySMlvM4TPttPz4O8qm3ArKP_I8pxsuo,1235
|
|
48
|
+
bizon/connectors/sources/hubspot/tests/hubspot_pipeline.py,sha256=e6dCF5_MHMySkeiF6kKrSAuCa_48J22-ZeSCZSjrfUI,216
|
|
49
|
+
bizon/connectors/sources/kafka/config/kafka.example.yml,sha256=taIj3QUL3jynQCpO-YlDtt6nGvQp8hOzGkS0_RJFUQU,933
|
|
50
|
+
bizon/connectors/sources/kafka/config/kafka_debezium.example.yml,sha256=lqFbNbSAFRh1Q8a9xQ_7nhhvVsyVIZM4amGEvCqHXQE,2254
|
|
51
|
+
bizon/connectors/sources/kafka/src/callback.py,sha256=NgP9PLquHbVagz6E9VJK5Vx-kK8K2l80MhoeenbhOXY,484
|
|
52
|
+
bizon/connectors/sources/kafka/src/config.py,sha256=jyvpEkT2PUXXcyZgPK2T-YmwPpqeQBntY3gU5Zk5cKU,2510
|
|
53
|
+
bizon/connectors/sources/kafka/src/decode.py,sha256=5Xr1_u1KEqpQsJR9cQ9Y-UTFd40lNNg48tAoQFSj7WQ,2822
|
|
54
|
+
bizon/connectors/sources/kafka/src/source.py,sha256=uL1kQFLlrGXf-ebG8Cqx8mljVPnVsujOsQzDjxyZ9bM,15069
|
|
55
|
+
bizon/connectors/sources/kafka/tests/kafka_pipeline.py,sha256=9LaCqXJIEx2ye3dkWq0YK_bPX7d4fCX_OcDOJCk34WE,206
|
|
56
|
+
bizon/connectors/sources/periscope/config/periscope_charts.example.yml,sha256=9OgFDB7vguiNz2F2fmRqDNV8S_ddO9ncN5hgW9MhME4,350
|
|
57
|
+
bizon/connectors/sources/periscope/config/periscope_dashboards.example.yml,sha256=mQey_04cfCzNpm-tYICDRUmPOFTZGSaTYI2OpK604d0,364
|
|
58
|
+
bizon/connectors/sources/periscope/src/source.py,sha256=N4auF-PwME7SjsqR0ear3DO1WSRAIOaJCnOmsUFCYzE,12354
|
|
59
|
+
bizon/connectors/sources/periscope/tests/periscope_pipeline_charts.py,sha256=mU0JtfhS1KmWsS3iovGhGxK7iPVWiYzjBM_QfRL3ZQI,275
|
|
60
|
+
bizon/connectors/sources/periscope/tests/periscope_pipeline_dashboard.py,sha256=VmkixgCMLTqNPXYXPYqcK7ncHeeR96h68IXPcuC70iA,290
|
|
61
|
+
bizon/connectors/sources/pokeapi/config/pokeapi_pokemon_to_json.example.yml,sha256=H3FpBsyft5qSvuyurh-hhaASpq7GnehNeVAOOn31Txk,283
|
|
62
|
+
bizon/connectors/sources/pokeapi/config/pokeapi_pokemon_to_logger.example.yml,sha256=wuJUob6QF1jwm5pnfNcFfXeO01HCcu-TEoZCeuYl_lo,134
|
|
63
|
+
bizon/connectors/sources/pokeapi/src/source.py,sha256=gmR58dk7mNOqimJTdJKVT1doSpEaKIM5mY1hfWGKJvk,2538
|
|
64
|
+
bizon/destination/buffer.py,sha256=77sns18cjmo7_ejk9jjDF4uCT1mlaTCHqn82c2K2BIs,3156
|
|
65
|
+
bizon/destination/config.py,sha256=YX_rxh7U2-gh6NEPFByD9VBaDG0eMkv3yOgR8Vzi8g4,3034
|
|
66
|
+
bizon/destination/destination.py,sha256=Tx76KpOmLTzYx-HkNnVFVOL57Eh-GoqZwvKd6l_LjAo,14621
|
|
67
|
+
bizon/destination/models.py,sha256=_LUnkbbD_9XauYrNTthh9VmbYwWsVgPHF90FX6vmSjg,1278
|
|
68
|
+
bizon/engine/backend/adapters/sqlalchemy/backend.py,sha256=dXp4kszGuMDeJMEmf6MsVCC02Je1X9meAfmh92GQTfI,15454
|
|
69
|
+
bizon/engine/backend/adapters/sqlalchemy/config.py,sha256=K-FpE_-VHnTSAQOduouhXFVy43EkrKbeZLqr9_OfeMw,1846
|
|
70
|
+
bizon/engine/backend/backend.py,sha256=4J6uLKVh0hIPkOYO5XEg4ia8mPlOS13C3hSrIJ171VA,5849
|
|
71
|
+
bizon/engine/backend/config.py,sha256=GhRzPWRGMaO-UJJRXkaqN_nlkFOCW6UOovwZLHLXrA8,900
|
|
72
|
+
bizon/engine/backend/models.py,sha256=ECImDNji7u9eSkkjiw8sYq80l17vDF7MplTFvCpMgqA,5101
|
|
73
|
+
bizon/engine/config.py,sha256=cKgI1IfzDncoxG3FsKUz-Aa3fU41ucQPaafjjhKeU90,2039
|
|
74
|
+
bizon/engine/engine.py,sha256=l5S5I_7W-K4hQZsbxzZoDxk85A91tY4kR1lG1bcRddk,1706
|
|
75
|
+
bizon/engine/pipeline/consumer.py,sha256=mgND9fD76T81Zu9P2Y4FgL9ZYoRs9E_R5aFZsdW6oO4,3208
|
|
76
|
+
bizon/engine/pipeline/models.py,sha256=qOra2MJGN6-PuouKpKuZRjutnQmzom0mgWDFZ16LcM8,405
|
|
77
|
+
bizon/engine/pipeline/producer.py,sha256=uARKW771TPLItDHSh0N7HqaQL2LqekSlaZMik0pB0PA,10059
|
|
78
|
+
bizon/engine/queue/adapters/kafka/config.py,sha256=o7GAb_ls9N0nQV04B6Y4XjLo-Q57x28r63gjFG9LvVg,1091
|
|
79
|
+
bizon/engine/queue/adapters/kafka/consumer.py,sha256=JPpvp3u5NXGvKRo60-ihRI4DlZxGJB1qH5Qw91XT8qc,2576
|
|
80
|
+
bizon/engine/queue/adapters/kafka/queue.py,sha256=9XVuIH3MSEBLbNpnYwAugk6vfGz7IiuVKVdjeGZjLME,2001
|
|
81
|
+
bizon/engine/queue/adapters/python_queue/config.py,sha256=_pyiIm1_PUjBo3WhKTATQcT2gazk-iHv0SdzNoGTeow,961
|
|
82
|
+
bizon/engine/queue/adapters/python_queue/consumer.py,sha256=3Omq15fpU1nS1EZn8J9T_TdsHIPqxUmC75k8ZTFfG_8,1818
|
|
83
|
+
bizon/engine/queue/adapters/python_queue/queue.py,sha256=XQ57hZCDFrdeF03pnTfb1Yx2MWhPHdJHC-UGV0y1vkg,2728
|
|
84
|
+
bizon/engine/queue/adapters/rabbitmq/config.py,sha256=9N_7WREvNjJgcNTC3Y2kHII-iId2MZa3ssHHks6PyAs,987
|
|
85
|
+
bizon/engine/queue/adapters/rabbitmq/consumer.py,sha256=EYhpPMb0c7vFX6M4ZBSQjUvkWjxW9B58dGpyfZkxcoc,2038
|
|
86
|
+
bizon/engine/queue/adapters/rabbitmq/queue.py,sha256=pg_XUtXAd14Yi4H3k-yLXF3JM5yc-1WBlfFiEEfutfg,1745
|
|
87
|
+
bizon/engine/queue/config.py,sha256=tTxo4OgSoDItMyWYIHLufFcOFqBGbIyPN5ZDNi1jZhI,1269
|
|
88
|
+
bizon/engine/queue/queue.py,sha256=Y9uj31d-ZgW2f0F02iccp_o-m-RoMm_jR61NkLdMQ2M,3461
|
|
89
|
+
bizon/engine/runner/adapters/process.py,sha256=0szaMKew7hbLcKR3k1pvwpDDynU7lcowpOJf48C8i3Y,3051
|
|
90
|
+
bizon/engine/runner/adapters/streaming.py,sha256=fLl5JvW6__GD0yBsvraqr7XKRyHEmjO3bsjbcoCk_tE,5213
|
|
91
|
+
bizon/engine/runner/adapters/thread.py,sha256=3BOGJlVFFWSA_NcK4NmwzB5FMFe6fqp0Ev_shukksPc,3792
|
|
92
|
+
bizon/engine/runner/config.py,sha256=CK3rsudAo1cDhr2-fTmKcozWrmTsFmGzScKPl4cndWQ,2456
|
|
93
|
+
bizon/engine/runner/runner.py,sha256=3AObfFotMkqaRPjBxJXmWRE-h0onMQBi3EpFU0JsKy8,11069
|
|
94
|
+
bizon/monitoring/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
95
|
+
bizon/monitoring/config.py,sha256=wRZRfW4ejjFDSG6swWj7kIULlaNYUPdbIKblQC9lzsk,1112
|
|
96
|
+
bizon/monitoring/datadog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
|
+
bizon/monitoring/datadog/monitor.py,sha256=NMtnIYq6n3I-QYmMJ6r8w63SO5DJ3wiDxXkcwqXEswY,6120
|
|
98
|
+
bizon/monitoring/monitor.py,sha256=aJ3JEgD-f-HydGFAmprwL8YCA0WumDeXpm2P-uqp4wM,2627
|
|
99
|
+
bizon/monitoring/noop/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
100
|
+
bizon/monitoring/noop/monitor.py,sha256=9fALRj6LSxvNcqUTp6aKj5fLJqbpUMqu_xbP-T9Dbso,1079
|
|
101
|
+
bizon/source/auth/authenticators/abstract_oauth.py,sha256=gJ40Sbrt0lnHfLupzkzOvUmse3X0Fp2XRHHqjqnVXdI,5274
|
|
102
|
+
bizon/source/auth/authenticators/abstract_token.py,sha256=GMEQNyqkPYHmpY_FygChfokLLbohsz2r0WxttAQjsbw,899
|
|
103
|
+
bizon/source/auth/authenticators/basic.py,sha256=78xtyw9fR1Nvr3DnKWT2qzyvJnBOT84evzZV53UhKrc,1290
|
|
104
|
+
bizon/source/auth/authenticators/cookies.py,sha256=XSHthvRDRIxTJTgOLRzgQUhpQ3wdJW41Oy-gagTG2bU,802
|
|
105
|
+
bizon/source/auth/authenticators/oauth.py,sha256=5P8y1kz2P8gIIMCCVr_cTNelSA4c34sxcnNNdOAwf0Q,3365
|
|
106
|
+
bizon/source/auth/authenticators/token.py,sha256=P6SKRAarAEv28YiWp8hQLSKAV7twNlyNTGRr9sxlx58,956
|
|
107
|
+
bizon/source/auth/builder.py,sha256=hc4zBNj31LZc-QqgIyx1VQEYTm9Xv81vY5pJiwQroJo,860
|
|
108
|
+
bizon/source/auth/config.py,sha256=2jjcBLP95XsCkfKxdUei4X2yHI2WX92lJb8D8Txw86g,750
|
|
109
|
+
bizon/source/callback.py,sha256=lfTwU_bzJwR0q5sbiKoK8uedQ-dhfHzoYkPVqm8b_Ho,602
|
|
110
|
+
bizon/source/config.py,sha256=ELr9XL_WM-qJDuFWO01SlNEbyb3WRJcnTavu-So87Ns,2225
|
|
111
|
+
bizon/source/cursor.py,sha256=ZQGXYvTOoJA77w3hbsocjpjT-QOYeqBki032Fc1FVB8,4239
|
|
112
|
+
bizon/source/discover.py,sha256=4qPtHN_LFO4tVrq9mXwhoVDmaDP7R8I1zrksi3ksSEo,11156
|
|
113
|
+
bizon/source/models.py,sha256=swyyS3bE6HtctX8_EBPwIVhChu1DQ7SFcPEIQ0eZAkw,1706
|
|
114
|
+
bizon/source/session.py,sha256=z4dZlKC_PD8w_utTuAqs1vsfGuRkxHh5WQZhVKamNd0,1979
|
|
115
|
+
bizon/source/source.py,sha256=j-aWCMd7Su8tVdWo143LU-n14ebNkgXlxnYMhMT6pHI,3703
|
|
116
|
+
bizon/transform/config.py,sha256=DFfzUCprOy5mv0G5CDBKeZFXRtegIuRQ5fBdnye9czE,242
|
|
117
|
+
bizon/transform/transform.py,sha256=IjluHZ2DY4uuuA-sn1x_1AqcavltglRbGbK4PJCr7Dk,1417
|
|
118
|
+
bizon/utils.py,sha256=HXaPiyxpWKoy3XN5vSYOve1ezlFeOYin3aFqTjcabUQ,81
|
|
119
|
+
bizon-0.1.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
120
|
+
bizon-0.1.2.dist-info/METADATA,sha256=Vr0kr2kAhglxQdDx9Re5LJoDZ8OVxL4RFUWcyLbdicw,6283
|
|
121
|
+
bizon-0.1.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
122
|
+
bizon-0.1.2.dist-info/entry_points.txt,sha256=wtCd-6JswSY8lPWYSvOf7ASX1zfKgmgXtgg5XQS5274,44
|
|
123
|
+
bizon-0.1.2.dist-info/RECORD,,
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
from typing import Literal, Optional
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, Field
|
|
5
|
-
|
|
6
|
-
from bizon.destinations.config import (
|
|
7
|
-
AbstractDestinationConfig,
|
|
8
|
-
AbstractDestinationDetailsConfig,
|
|
9
|
-
DestinationTypes,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class GCSBufferFormat(str, Enum):
|
|
14
|
-
PARQUET = "parquet"
|
|
15
|
-
CSV = "csv"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class TimePartitioning(str, Enum):
|
|
19
|
-
DAY = "DAY"
|
|
20
|
-
HOUR = "HOUR"
|
|
21
|
-
MONTH = "MONTH"
|
|
22
|
-
YEAR = "YEAR"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class BigQueryAuthentication(BaseModel):
|
|
26
|
-
service_account_key: str = Field(
|
|
27
|
-
description="Service Account Key JSON string. If empty it will be infered",
|
|
28
|
-
default="",
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class BigQueryConfigDetails(AbstractDestinationDetailsConfig):
|
|
33
|
-
project_id: str
|
|
34
|
-
dataset_id: str
|
|
35
|
-
dataset_location: Optional[str] = "US"
|
|
36
|
-
table_id: Optional[str] = Field(
|
|
37
|
-
default=None, description="Table ID, if not provided it will be inferred from source name"
|
|
38
|
-
)
|
|
39
|
-
gcs_buffer_bucket: str
|
|
40
|
-
gcs_buffer_format: Optional[GCSBufferFormat] = GCSBufferFormat.PARQUET
|
|
41
|
-
|
|
42
|
-
time_partitioning: Optional[TimePartitioning] = Field(
|
|
43
|
-
default=TimePartitioning.DAY, description="BigQuery Time partitioning type"
|
|
44
|
-
)
|
|
45
|
-
authentication: Optional[BigQueryAuthentication] = None
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class BigQueryConfig(AbstractDestinationConfig):
|
|
49
|
-
name: Literal[DestinationTypes.BIGQUERY]
|
|
50
|
-
buffer_size: Optional[int] = 2000
|
|
51
|
-
config: BigQueryConfigDetails
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
from typing import Literal, Optional
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, Field, field_validator
|
|
5
|
-
|
|
6
|
-
from bizon.destinations.config import (
|
|
7
|
-
AbstractDestinationConfig,
|
|
8
|
-
AbstractDestinationDetailsConfig,
|
|
9
|
-
DestinationTypes,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class TimePartitioning(str, Enum):
|
|
14
|
-
DAY = "DAY"
|
|
15
|
-
HOUR = "HOUR"
|
|
16
|
-
MONTH = "MONTH"
|
|
17
|
-
YEAR = "YEAR"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class BigQueryAuthentication(BaseModel):
|
|
21
|
-
service_account_key: str = Field(
|
|
22
|
-
description="Service Account Key JSON string. If empty it will be infered",
|
|
23
|
-
default="",
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class BigQueryStreamingConfigDetails(AbstractDestinationDetailsConfig):
|
|
28
|
-
project_id: str
|
|
29
|
-
dataset_id: str
|
|
30
|
-
dataset_location: Optional[str] = "US"
|
|
31
|
-
table_id: Optional[str] = Field(
|
|
32
|
-
default=None, description="Table ID, if not provided it will be inferred from source name"
|
|
33
|
-
)
|
|
34
|
-
time_partitioning: Optional[TimePartitioning] = Field(
|
|
35
|
-
default=TimePartitioning.DAY, description="BigQuery Time partitioning type"
|
|
36
|
-
)
|
|
37
|
-
authentication: Optional[BigQueryAuthentication] = None
|
|
38
|
-
bq_max_rows_per_request: Optional[int] = Field(30000, description="Max rows per buffer streaming request.")
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class BigQueryStreamingConfig(AbstractDestinationConfig):
|
|
42
|
-
name: Literal[DestinationTypes.BIGQUERY_STREAMING]
|
|
43
|
-
config: BigQueryStreamingConfigDetails
|