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.
Files changed (110) hide show
  1. bizon/alerting/__init__.py +0 -0
  2. bizon/alerting/alerts.py +23 -0
  3. bizon/alerting/models.py +28 -0
  4. bizon/alerting/slack/__init__.py +0 -0
  5. bizon/alerting/slack/config.py +5 -0
  6. bizon/alerting/slack/handler.py +39 -0
  7. bizon/cli/main.py +7 -3
  8. bizon/common/models.py +33 -7
  9. bizon/{destinations → connectors/destinations}/bigquery/config/bigquery.example.yml +3 -4
  10. bizon/connectors/destinations/bigquery/src/config.py +128 -0
  11. bizon/{destinations → connectors/destinations}/bigquery/src/destination.py +48 -25
  12. bizon/connectors/destinations/bigquery_streaming/src/config.py +57 -0
  13. bizon/connectors/destinations/bigquery_streaming/src/destination.py +377 -0
  14. bizon/connectors/destinations/bigquery_streaming_v2/src/config.py +57 -0
  15. bizon/connectors/destinations/bigquery_streaming_v2/src/destination.py +446 -0
  16. bizon/{destinations/bigquery_streaming → connectors/destinations/bigquery_streaming_v2}/src/proto_utils.py +30 -36
  17. bizon/{destinations → connectors/destinations}/file/src/config.py +9 -3
  18. bizon/connectors/destinations/file/src/destination.py +56 -0
  19. bizon/{destinations → connectors/destinations}/logger/src/config.py +2 -1
  20. bizon/{destinations → connectors/destinations}/logger/src/destination.py +18 -3
  21. bizon/connectors/sources/cycle/config/cycle.example.yml +15 -0
  22. bizon/connectors/sources/cycle/src/source.py +133 -0
  23. bizon/{sources/periscope/tests/periscope_pipeline_dashboard.py → connectors/sources/cycle/tests/cycle_customers.py} +1 -1
  24. bizon/{sources → connectors/sources}/dummy/config/dummy.example.yml +2 -2
  25. bizon/{sources → connectors/sources}/dummy/src/fake_api.py +6 -1
  26. bizon/{sources → connectors/sources}/dummy/src/source.py +18 -5
  27. bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline.py +2 -2
  28. bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_bigquery_backend.py +2 -2
  29. bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_kafka.py +2 -2
  30. bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_rabbitmq.py +2 -2
  31. bizon/connectors/sources/dummy/tests/dummy_pipeline_unnest.py +29 -0
  32. bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_write_data_bigquery.py +2 -2
  33. bizon/{sources → connectors/sources}/dummy/tests/dummy_pipeline_write_data_bigquery_through_kafka.py +2 -2
  34. bizon/{sources → connectors/sources}/gsheets/config/default_auth.example.yml +4 -2
  35. bizon/{sources → connectors/sources}/gsheets/config/service_account.example.yml +4 -2
  36. bizon/{sources → connectors/sources}/hubspot/config/api_key.example.yml +4 -2
  37. bizon/{sources → connectors/sources}/hubspot/config/oauth.example.yml +4 -2
  38. bizon/{sources → connectors/sources}/hubspot/src/hubspot_objects.py +1 -1
  39. bizon/{sources → connectors/sources}/kafka/config/kafka.example.yml +3 -5
  40. bizon/connectors/sources/kafka/config/kafka_debezium.example.yml +110 -0
  41. bizon/connectors/sources/kafka/src/callback.py +18 -0
  42. bizon/connectors/sources/kafka/src/config.py +69 -0
  43. bizon/connectors/sources/kafka/src/decode.py +93 -0
  44. bizon/connectors/sources/kafka/src/source.py +381 -0
  45. bizon/connectors/sources/kafka/tests/kafka_pipeline.py +7 -0
  46. bizon/connectors/sources/periscope/config/periscope_charts.example.yml +20 -0
  47. bizon/connectors/sources/periscope/config/periscope_dashboards.example.yml +20 -0
  48. bizon/{sources → connectors/sources}/periscope/src/source.py +137 -13
  49. bizon/connectors/sources/periscope/tests/periscope_pipeline_dashboard.py +9 -0
  50. bizon/connectors/sources/pokeapi/config/pokeapi_pokemon_to_json.example.yml +19 -0
  51. bizon/connectors/sources/pokeapi/config/pokeapi_pokemon_to_logger.example.yml +10 -0
  52. bizon/connectors/sources/pokeapi/src/source.py +79 -0
  53. bizon/{destinations → destination}/buffer.py +5 -0
  54. bizon/destination/config.py +83 -0
  55. bizon/{destinations → destination}/destination.py +103 -15
  56. bizon/engine/backend/adapters/sqlalchemy/backend.py +3 -1
  57. bizon/engine/engine.py +20 -1
  58. bizon/engine/pipeline/consumer.py +73 -5
  59. bizon/engine/pipeline/models.py +8 -3
  60. bizon/engine/pipeline/producer.py +18 -9
  61. bizon/engine/queue/adapters/kafka/consumer.py +2 -2
  62. bizon/engine/queue/adapters/kafka/queue.py +3 -2
  63. bizon/engine/queue/adapters/python_queue/consumer.py +40 -23
  64. bizon/engine/queue/adapters/python_queue/queue.py +19 -9
  65. bizon/engine/queue/adapters/rabbitmq/consumer.py +3 -6
  66. bizon/engine/queue/adapters/rabbitmq/queue.py +3 -2
  67. bizon/engine/queue/config.py +16 -0
  68. bizon/engine/queue/queue.py +17 -16
  69. bizon/engine/runner/adapters/process.py +15 -2
  70. bizon/engine/runner/adapters/streaming.py +121 -0
  71. bizon/engine/runner/adapters/thread.py +32 -9
  72. bizon/engine/runner/config.py +28 -0
  73. bizon/engine/runner/runner.py +113 -24
  74. bizon/monitoring/__init__.py +0 -0
  75. bizon/monitoring/config.py +39 -0
  76. bizon/monitoring/datadog/__init__.py +0 -0
  77. bizon/monitoring/datadog/monitor.py +153 -0
  78. bizon/monitoring/monitor.py +71 -0
  79. bizon/monitoring/noop/__init__.py +0 -0
  80. bizon/monitoring/noop/monitor.py +30 -0
  81. bizon/source/callback.py +24 -0
  82. bizon/source/config.py +3 -3
  83. bizon/source/cursor.py +1 -1
  84. bizon/source/discover.py +4 -3
  85. bizon/source/models.py +4 -2
  86. bizon/source/source.py +10 -2
  87. bizon/transform/config.py +8 -0
  88. bizon/transform/transform.py +48 -0
  89. {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/METADATA +23 -6
  90. bizon-0.1.2.dist-info/RECORD +123 -0
  91. {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/WHEEL +1 -1
  92. bizon/destinations/bigquery/src/config.py +0 -51
  93. bizon/destinations/bigquery_streaming/src/config.py +0 -43
  94. bizon/destinations/bigquery_streaming/src/destination.py +0 -154
  95. bizon/destinations/config.py +0 -47
  96. bizon/destinations/file/src/destination.py +0 -27
  97. bizon/sources/kafka/src/source.py +0 -357
  98. bizon/sources/kafka/tests/kafka_pipeline.py +0 -9
  99. bizon/sources/periscope/config/periscope_charts.example.yml +0 -26
  100. bizon/sources/periscope/config/periscope_dashboards.example.yml +0 -26
  101. bizon-0.1.0.dist-info/RECORD +0 -93
  102. /bizon/{sources → connectors/sources}/gsheets/src/source.py +0 -0
  103. /bizon/{sources → connectors/sources}/gsheets/tests/gsheets_pipeline.py +0 -0
  104. /bizon/{sources → connectors/sources}/hubspot/src/hubspot_base.py +0 -0
  105. /bizon/{sources → connectors/sources}/hubspot/src/models/hs_object.py +0 -0
  106. /bizon/{sources → connectors/sources}/hubspot/tests/hubspot_pipeline.py +0 -0
  107. /bizon/{sources → connectors/sources}/periscope/tests/periscope_pipeline_charts.py +0 -0
  108. /bizon/{destinations → destination}/models.py +0 -0
  109. {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/LICENSE +0 -0
  110. {bizon-0.1.0.dist-info → bizon-0.1.2.dist-info}/entry_points.txt +0 -0
@@ -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 syncs data from the last destination cursor using last pagination, a single RUNNING StreamJob will be created and considered as always running.
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
- source_name: str = Field(..., description="Name of the source to sync")
36
- stream_name: str = Field(..., description="Name of the stream to sync")
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.warning(
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,8 @@
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class TransformModel(BaseModel):
7
+ label: str = Field(..., description="Label of the transform")
8
+ python: str = Field(..., description="Python code for the transform")
@@ -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
1
+ Metadata-Version: 2.3
2
2
  Name: bizon
3
- Version: 0.1.0
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
- - **Pipeline metrics**: Bizon provides exhaustive pipeline metrics and implement OpenTelemetry for tracing. You can monitor:
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
- source_name: dummy
87
- stream_name: creatures
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
- - `biguquery`: Google BigQuery backend, perfect for light setup & production.
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,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -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