Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ coverage.xml
test-report.xml

*.egg-info/

.amp/
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ repos:
hooks:
- id: sync-with-uv
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.15.7
rev: v0.15.12
hooks:
- id: ruff-check
args: [--fix, --exit-non-zero-on-fix]
Expand Down
14 changes: 13 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.52.0]

### Added

- `tilebox-workflows`: Added automatic OpenTelemetry-based logging and tracing instrumentation to a Tilebox
observability backend.
- `tilebox-workflows`: Added `ExecutionContext.logger` and `ExecutionContext.tracer` access for task implementations to
emit structured logs and custom spans during task execution.
- `tilebox-workflows`: Added `JobClient.query_logs()` and `JobClient.query_spans()` to fetch telemetry for a job, with
list-like results that can be converted to pandas DataFrames via `to_pandas()`.

## [0.51.0] - 2026-04-07

### Changed
Expand Down Expand Up @@ -357,7 +368,8 @@ the first client that does not cache data (since it's already on the local file
- Released under the [MIT](https://opensource.org/license/mit) license.
- Released packages: `tilebox-datasets`, `tilebox-workflows`, `tilebox-storage`, `tilebox-grpc`

[Unreleased]: https://github.com/tilebox/tilebox-python/compare/v0.51.0...HEAD
[Unreleased]: https://github.com/tilebox/tilebox-python/compare/v0.52.0...HEAD
[0.52.0]: https://github.com/tilebox/tilebox-python/compare/v0.51.0...v0.52.0
[0.51.0]: https://github.com/tilebox/tilebox-python/compare/v0.50.1...v0.51.0
[0.50.1]: https://github.com/tilebox/tilebox-python/compare/v0.50.0...v0.50.1
[0.50.0]: https://github.com/tilebox/tilebox-python/compare/v0.49.0...v0.50.0
Expand Down
13 changes: 1 addition & 12 deletions tilebox-datasets/tests/data/datapoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@
from tests.query.pagination import paginations
from tests.query.time_interval import i64_datetimes
from tilebox.datasets.data.datapoint import AnyMessage, IngestResponse, QueryResultPage, RepeatedAny
from tilebox.datasets.datasets.v1 import core_pb2
from tilebox.datasets.query.time_interval import datetime_to_timestamp


@composite
Expand Down Expand Up @@ -138,8 +136,7 @@ def example_pandas_datapoints(draw: DrawFn) -> pd.DataFrame:
@composite
def anys(draw: DrawFn, generated_fields: bool = False, missing_fields: bool = False) -> AnyMessage:
"""A hypothesis strategy for generating random Any messages"""
# we need a random byte string here, but let's actually use a valid protobuf message, in this
# case because its easy to generate let's use a DatapointMetadata message
# we need a random byte string here, but let's actually use a valid protobuf message
datapoint = draw(example_datapoints(generated_fields, missing_fields))
return AnyMessage(example_dataset_type_url(), datapoint.SerializeToString())

Expand All @@ -158,14 +155,6 @@ def repeated_anys(
return RepeatedAny(example_dataset_type_url(), [dp.SerializeToString() for dp in datapoints])


@composite
def datapoint_metadata_messages(draw: DrawFn) -> core_pb2.DatapointMetadata:
event_time = datetime_to_timestamp(draw(i64_datetimes))
ingestion_time = datetime_to_timestamp(draw(i64_datetimes))
data_point_id = str(draw(uuids(version=4)))
return core_pb2.DatapointMetadata(event_time=event_time, ingestion_time=ingestion_time, id=data_point_id)


@composite
def query_result_pages(
draw: DrawFn, empty_next_page: bool | None = None, generated_fields: bool = True, missing_fields: bool = False
Expand Down
430 changes: 217 additions & 213 deletions tilebox-datasets/tilebox/datasets/buf/validate/validate_pb2.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ class BoolRules(_message.Message):
def __init__(self, const: bool = ..., example: _Optional[_Iterable[bool]] = ...) -> None: ...

class StringRules(_message.Message):
__slots__ = ("const", "len", "min_len", "max_len", "len_bytes", "min_bytes", "max_bytes", "pattern", "prefix", "suffix", "contains", "not_contains", "not_in", "email", "hostname", "ip", "ipv4", "ipv6", "uri", "uri_ref", "address", "uuid", "tuuid", "ip_with_prefixlen", "ipv4_with_prefixlen", "ipv6_with_prefixlen", "ip_prefix", "ipv4_prefix", "ipv6_prefix", "host_and_port", "ulid", "well_known_regex", "strict", "example")
__slots__ = ("const", "len", "min_len", "max_len", "len_bytes", "min_bytes", "max_bytes", "pattern", "prefix", "suffix", "contains", "not_contains", "not_in", "email", "hostname", "ip", "ipv4", "ipv6", "uri", "uri_ref", "address", "uuid", "tuuid", "ip_with_prefixlen", "ipv4_with_prefixlen", "ipv6_with_prefixlen", "ip_prefix", "ipv4_prefix", "ipv6_prefix", "host_and_port", "ulid", "protobuf_fqn", "protobuf_dot_fqn", "well_known_regex", "strict", "example")
Extensions: _python_message._ExtensionDict
CONST_FIELD_NUMBER: _ClassVar[int]
LEN_FIELD_NUMBER: _ClassVar[int]
Expand Down Expand Up @@ -422,6 +422,8 @@ class StringRules(_message.Message):
IPV6_PREFIX_FIELD_NUMBER: _ClassVar[int]
HOST_AND_PORT_FIELD_NUMBER: _ClassVar[int]
ULID_FIELD_NUMBER: _ClassVar[int]
PROTOBUF_FQN_FIELD_NUMBER: _ClassVar[int]
PROTOBUF_DOT_FQN_FIELD_NUMBER: _ClassVar[int]
WELL_KNOWN_REGEX_FIELD_NUMBER: _ClassVar[int]
STRICT_FIELD_NUMBER: _ClassVar[int]
EXAMPLE_FIELD_NUMBER: _ClassVar[int]
Expand Down Expand Up @@ -456,10 +458,12 @@ class StringRules(_message.Message):
ipv6_prefix: bool
host_and_port: bool
ulid: bool
protobuf_fqn: bool
protobuf_dot_fqn: bool
well_known_regex: KnownRegex
strict: bool
example: _containers.RepeatedScalarFieldContainer[str]
def __init__(self, const: _Optional[str] = ..., len: _Optional[int] = ..., min_len: _Optional[int] = ..., max_len: _Optional[int] = ..., len_bytes: _Optional[int] = ..., min_bytes: _Optional[int] = ..., max_bytes: _Optional[int] = ..., pattern: _Optional[str] = ..., prefix: _Optional[str] = ..., suffix: _Optional[str] = ..., contains: _Optional[str] = ..., not_contains: _Optional[str] = ..., not_in: _Optional[_Iterable[str]] = ..., email: bool = ..., hostname: bool = ..., ip: bool = ..., ipv4: bool = ..., ipv6: bool = ..., uri: bool = ..., uri_ref: bool = ..., address: bool = ..., uuid: bool = ..., tuuid: bool = ..., ip_with_prefixlen: bool = ..., ipv4_with_prefixlen: bool = ..., ipv6_with_prefixlen: bool = ..., ip_prefix: bool = ..., ipv4_prefix: bool = ..., ipv6_prefix: bool = ..., host_and_port: bool = ..., ulid: bool = ..., well_known_regex: _Optional[_Union[KnownRegex, str]] = ..., strict: bool = ..., example: _Optional[_Iterable[str]] = ..., **kwargs) -> None: ...
def __init__(self, const: _Optional[str] = ..., len: _Optional[int] = ..., min_len: _Optional[int] = ..., max_len: _Optional[int] = ..., len_bytes: _Optional[int] = ..., min_bytes: _Optional[int] = ..., max_bytes: _Optional[int] = ..., pattern: _Optional[str] = ..., prefix: _Optional[str] = ..., suffix: _Optional[str] = ..., contains: _Optional[str] = ..., not_contains: _Optional[str] = ..., not_in: _Optional[_Iterable[str]] = ..., email: bool = ..., hostname: bool = ..., ip: bool = ..., ipv4: bool = ..., ipv6: bool = ..., uri: bool = ..., uri_ref: bool = ..., address: bool = ..., uuid: bool = ..., tuuid: bool = ..., ip_with_prefixlen: bool = ..., ipv4_with_prefixlen: bool = ..., ipv6_with_prefixlen: bool = ..., ip_prefix: bool = ..., ipv4_prefix: bool = ..., ipv6_prefix: bool = ..., host_and_port: bool = ..., ulid: bool = ..., protobuf_fqn: bool = ..., protobuf_dot_fqn: bool = ..., well_known_regex: _Optional[_Union[KnownRegex, str]] = ..., strict: bool = ..., example: _Optional[_Iterable[str]] = ..., **kwargs) -> None: ...

class BytesRules(_message.Message):
__slots__ = ("const", "len", "min_len", "max_len", "pattern", "prefix", "suffix", "contains", "not_in", "ip", "ipv4", "ipv6", "uuid", "example")
Expand Down
51 changes: 17 additions & 34 deletions tilebox-datasets/tilebox/datasets/datasets/v1/core_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading