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.
Files changed (56) hide show
  1. gooddata_flexconnect-1.74.1.dev2/AGENTS.md +83 -0
  2. gooddata_flexconnect-1.74.1.dev2/CLAUDE.md +1 -0
  3. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/PKG-INFO +5 -5
  4. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/pyproject.toml +7 -7
  5. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/.gitignore +0 -0
  6. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/.readthedocs.yaml +0 -0
  7. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/LICENSE.txt +0 -0
  8. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/Makefile +0 -0
  9. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/README.md +0 -0
  10. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/attribute.json +0 -0
  11. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/date-granularity.json +0 -0
  12. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/execution-context.json +0 -0
  13. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/filter.json +0 -0
  14. {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
  15. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/label-elements/depends-on.json +0 -0
  16. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/json_schemas/execution-context/label-elements/execution-request.json +0 -0
  17. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/__init__.py +0 -0
  18. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/__init__.py +0 -0
  19. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/data_source_messages.py +0 -0
  20. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/execution_context.py +0 -0
  21. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/flight_methods.py +0 -0
  22. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function.py +0 -0
  23. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function_invocation.py +0 -0
  24. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function_registry.py +0 -0
  25. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/function/function_task.py +0 -0
  26. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/src/gooddata_flexconnect/py.typed +0 -0
  27. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/__init__.py +0 -0
  28. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/assert_error_info.py +0 -0
  29. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/__init__.py +0 -0
  30. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/conftest.py +0 -0
  31. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/test_data_source_messages.py +0 -0
  32. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/test_flex_fun_execution_context.py +0 -0
  33. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/test_registry.py +0 -0
  34. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/function/testing_funs.py +0 -0
  35. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/__init__.py +0 -0
  36. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/conftest.py +0 -0
  37. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_attribute_schema.py +0 -0
  38. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_depends_on_date_filter_schema.py +0 -0
  39. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_depends_on_schema.py +0 -0
  40. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_execution_context_schema.py +0 -0
  41. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_filter_schema.py +0 -0
  42. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/json_schemas/test_label_elements_execution_request_schema.py +0 -0
  43. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/__init__.py +0 -0
  44. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/conftest.py +0 -0
  45. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/__init__.py +0 -0
  46. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun1.py +0 -0
  47. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun2.py +0 -0
  48. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun3.py +0 -0
  49. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/funs/fun4.py +0 -0
  50. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/test_flexconnect_server.py +0 -0
  51. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/ca-cert.pem +0 -0
  52. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/client-cert.pem +0 -0
  53. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/client-key.pem +0 -0
  54. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/server-cert.pem +0 -0
  55. {gooddata_flexconnect-1.74.1.dev1 → gooddata_flexconnect-1.74.1.dev2}/tests/server/tls/server-key.pem +0 -0
  56. {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.dev1
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.dev1
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.dev1
25
- Requires-Dist: gooddata-sdk~=1.74.1.dev1
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<25.0.0,>=24.0.0
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.dev1"
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.dev1",
33
- "gooddata-sdk~=1.74.1.dev1",
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,<25.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.dev1"
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~=8.3.4",
60
- "pytest-cov~=6.0.0",
59
+ "pytest~=9.1.1",
60
+ "pytest-cov~=7.1.0",
61
61
  "pytest-json-report==1.5.0",
62
62
  ]
63
63