gooddata-flexconnect 1.74.1.dev1__tar.gz → 1.74.1.dev2__tar.gz
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.
- gooddata_flexconnect-1.74.1.dev2/AGENTS.md +83 -0
- gooddata_flexconnect-1.74.1.dev2/CLAUDE.md +1 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/PKG-INFO +5 -5
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/pyproject.toml +7 -7
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/.gitignore +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/.readthedocs.yaml +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/LICENSE.txt +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/Makefile +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/README.md +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/attribute.json +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/date-granularity.json +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/execution-context.json +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/filter.json +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/label-elements/depends-on-date-filter.json +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/label-elements/depends-on.json +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/label-elements/execution-request.json +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/__init__.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/__init__.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/data_source_messages.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/execution_context.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/flight_methods.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function_invocation.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function_registry.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function_task.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/py.typed +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/__init__.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/assert_error_info.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/__init__.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/conftest.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/test_data_source_messages.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/test_flex_fun_execution_context.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/test_registry.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/testing_funs.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/__init__.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/conftest.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_attribute_schema.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_depends_on_date_filter_schema.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_depends_on_schema.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_execution_context_schema.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_filter_schema.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_label_elements_execution_request_schema.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/__init__.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/conftest.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/__init__.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun1.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun2.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun3.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun4.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/test_flexconnect_server.py +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/ca-cert.pem +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/client-cert.pem +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/client-key.pem +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/server-cert.pem +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/server-key.pem +0 -0
- {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tox.ini +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# gooddata-flexconnect
|
|
2
|
+
|
|
3
|
+
Lets a developer expose their own tabular data as a data source inside GoodData, using a
|
|
4
|
+
table-function model: you subclass `FlexConnectFunction`, declare a name and an Arrow
|
|
5
|
+
schema, and implement `call()`. A FlexConnect server — `gooddata-flight-server` plus this
|
|
6
|
+
package's method provider — discovers your functions at startup, and GoodData maps each
|
|
7
|
+
one's schema to a dataset in the semantic model, invoking it over Flight RPC.
|
|
8
|
+
|
|
9
|
+
Consumed as a framework by projects outside this repo (see the `gooddata-flexconnect-template`
|
|
10
|
+
repository), so the function-authoring contract is an external API.
|
|
11
|
+
|
|
12
|
+
## Owns
|
|
13
|
+
|
|
14
|
+
- The `FlexConnectFunction` contract for authoring table-function style data sources
|
|
15
|
+
- Function registration and discovery
|
|
16
|
+
- The typed execution-context decoding of the request payload
|
|
17
|
+
- The Flight RPC glue that turns a generic Flight server into a FlexConnect server
|
|
18
|
+
|
|
19
|
+
## Does NOT Own
|
|
20
|
+
|
|
21
|
+
- Generic Flight server infrastructure, CLI, config and telemetry → `gooddata-flight-server`
|
|
22
|
+
- Core GoodData Cloud domain, catalog and compute APIs → `gooddata-sdk`
|
|
23
|
+
- PostgreSQL FDW integration → `gooddata-fdw`
|
|
24
|
+
|
|
25
|
+
## Architecture
|
|
26
|
+
|
|
27
|
+
**Depends on**: `gooddata-flight-server` and `gooddata-sdk`, plus `pyarrow`, `dynaconf`,
|
|
28
|
+
`structlog`, `orjson`.
|
|
29
|
+
|
|
30
|
+
All code lives under `src/gooddata_flexconnect/function/`: the base class, the registry,
|
|
31
|
+
the execution context, and the Flight methods.
|
|
32
|
+
|
|
33
|
+
### Authoring a function
|
|
34
|
+
|
|
35
|
+
A function is a **class**, not a callable. Subclass `FlexConnectFunction` and provide:
|
|
36
|
+
|
|
37
|
+
- `Name: str` — unique across the server; required
|
|
38
|
+
- `Schema: pyarrow.Schema` — the full result schema, declared statically; required
|
|
39
|
+
- `call(self, parameters, columns, headers) -> ArrowData` — the implementation
|
|
40
|
+
|
|
41
|
+
Optional overrides: `create()` (instance factory, called per invocation), `cancel()`, and
|
|
42
|
+
the static `on_load(ctx: ServerContext)` for one-time initialization.
|
|
43
|
+
|
|
44
|
+
### Discovery
|
|
45
|
+
|
|
46
|
+
Functions are not registered by hand. The server reads the `flexconnect.functions` setting
|
|
47
|
+
— a list of importable module paths — and `FlexConnectFunctionRegistry.load()` imports each
|
|
48
|
+
module and registers every top-level member that subclasses `FlexConnectFunction`. A
|
|
49
|
+
missing or empty `Name`, a duplicate `Name`, or a missing `Schema` raises at load time and
|
|
50
|
+
aborts startup. A function that is not exported at module top level is simply never found.
|
|
51
|
+
|
|
52
|
+
### Hosting
|
|
53
|
+
|
|
54
|
+
`create_flexconnect_flight_methods` is decorated with `@flight_server_methods` from
|
|
55
|
+
`gooddata-flight-server` and returns the `FlightServerMethods` implementation — it is the
|
|
56
|
+
single methods factory that turns the generic server into a FlexConnect server. It also
|
|
57
|
+
reads `flexconnect.call_deadline_ms` and `flexconnect.polling_interval_ms`.
|
|
58
|
+
|
|
59
|
+
## Gotchas
|
|
60
|
+
|
|
61
|
+
**Decode `parameters`, don't hand-parse it.** `call()` receives `parameters` as a raw
|
|
62
|
+
JSON-like dict. Use `ExecutionContext.from_parameters(parameters)` — it returns `None` when
|
|
63
|
+
there is no `executionContext` key, and otherwise a typed object exposing
|
|
64
|
+
`execution_type`, `organization_id`, `workspace_id`, `user_id` and either a
|
|
65
|
+
`ReportExecutionRequest` (attributes, metrics, filters) or a `LabelElementsExecutionRequest`.
|
|
66
|
+
Because this is public API consumed downstream, hand-rolled parsing in external projects
|
|
67
|
+
breaks silently on any wire-format change.
|
|
68
|
+
|
|
69
|
+
**`columns` is a trimming hint, not a contract.** The full result schema is fixed on the
|
|
70
|
+
class before any call. `columns` tells you which of those the caller wants and may be
|
|
71
|
+
ignored; it must not change aggregation semantics. Only `parameters` should drive
|
|
72
|
+
computation. Conflating "requested columns" with "requested aggregation" is the subtle
|
|
73
|
+
correctness trap here.
|
|
74
|
+
|
|
75
|
+
**Calls are asynchronous with a deadline.** Invocations run as background tasks with a
|
|
76
|
+
configurable call deadline and cancellation support, and the RPC layer supports polling for
|
|
77
|
+
long-running calls. Relevant when debugging timeouts.
|
|
78
|
+
|
|
79
|
+
## Testing
|
|
80
|
+
|
|
81
|
+
Package-local pytest suites under `tests/`. `make dev-certs` generates a CA/server/client
|
|
82
|
+
chain into the gitignored `test_data/` for driving a server by hand over TLS; the package
|
|
83
|
+
also ships its own checked-in certificates for the tests themselves.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gooddata-flexconnect
|
|
3
|
-
Version: 1.74.1.
|
|
3
|
+
Version: 1.74.1.dev2
|
|
4
4
|
Summary: Build your own data source for GoodData Cloud and GoodData Cloud Native.
|
|
5
|
-
Project-URL: Documentation, https://gooddata-flexconnect.readthedocs.io/en/v1.74.1.
|
|
5
|
+
Project-URL: Documentation, https://gooddata-flexconnect.readthedocs.io/en/v1.74.1.dev2
|
|
6
6
|
Project-URL: Source, https://github.com/gooddata/gooddata-python-sdk
|
|
7
7
|
Author-email: GoodData <support@gooddata.com>
|
|
8
8
|
License-Expression: MIT
|
|
@@ -21,11 +21,11 @@ Classifier: Topic :: Software Development
|
|
|
21
21
|
Classifier: Typing :: Typed
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Requires-Dist: dynaconf<4.0.0,>=3.1.11
|
|
24
|
-
Requires-Dist: gooddata-flight-server~=1.74.1.
|
|
25
|
-
Requires-Dist: gooddata-sdk~=1.74.1.
|
|
24
|
+
Requires-Dist: gooddata-flight-server~=1.74.1.dev2
|
|
25
|
+
Requires-Dist: gooddata-sdk~=1.74.1.dev2
|
|
26
26
|
Requires-Dist: orjson<4.0.0,>=3.9.15
|
|
27
27
|
Requires-Dist: pyarrow>=16.1.0
|
|
28
|
-
Requires-Dist: structlog
|
|
28
|
+
Requires-Dist: structlog<=26.1.0,>=24.0.0
|
|
29
29
|
Description-Content-Type: text/markdown
|
|
30
30
|
|
|
31
31
|
# GoodData FlexConnect
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# (C) 2025 GoodData Corporation
|
|
2
2
|
[project]
|
|
3
3
|
name = "gooddata-flexconnect"
|
|
4
|
-
version = "1.74.1.
|
|
4
|
+
version = "1.74.1.dev2"
|
|
5
5
|
description = "Build your own data source for GoodData Cloud and GoodData Cloud Native."
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = "MIT"
|
|
@@ -29,11 +29,11 @@ keywords = [
|
|
|
29
29
|
requires-python = ">=3.10"
|
|
30
30
|
dependencies = [
|
|
31
31
|
"dynaconf>=3.1.11,<4.0.0",
|
|
32
|
-
"gooddata-flight-server~=1.74.1.
|
|
33
|
-
"gooddata-sdk~=1.74.1.
|
|
32
|
+
"gooddata-flight-server~=1.74.1.dev2",
|
|
33
|
+
"gooddata-sdk~=1.74.1.dev2",
|
|
34
34
|
"orjson>=3.9.15,<4.0.0",
|
|
35
35
|
"pyarrow>=16.1.0",
|
|
36
|
-
"structlog>=24.0.0
|
|
36
|
+
"structlog>=24.0.0,<=26.1.0",
|
|
37
37
|
]
|
|
38
38
|
classifiers = [
|
|
39
39
|
"Development Status :: 4 - Beta",
|
|
@@ -50,14 +50,14 @@ classifiers = [
|
|
|
50
50
|
]
|
|
51
51
|
|
|
52
52
|
[project.urls]
|
|
53
|
-
Documentation = "https://gooddata-flexconnect.readthedocs.io/en/v1.74.1.
|
|
53
|
+
Documentation = "https://gooddata-flexconnect.readthedocs.io/en/v1.74.1.dev2"
|
|
54
54
|
Source = "https://github.com/gooddata/gooddata-python-sdk"
|
|
55
55
|
|
|
56
56
|
[dependency-groups]
|
|
57
57
|
test = [
|
|
58
58
|
"jsonschema~=4.23.0",
|
|
59
|
-
"pytest~=
|
|
60
|
-
"pytest-cov~=
|
|
59
|
+
"pytest~=9.1.1",
|
|
60
|
+
"pytest-cov~=7.1.0",
|
|
61
61
|
"pytest-json-report==1.5.0",
|
|
62
62
|
]
|
|
63
63
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/assert_error_info.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/__init__.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/conftest.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/testing_funs.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/__init__.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/conftest.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/__init__.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/conftest.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/__init__.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun1.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun2.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun3.py
RENAMED
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun4.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/ca-cert.pem
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|