gooddata-flexconnect 1.61.1.dev2__tar.gz → 1.62.1.dev1__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 (54) hide show
  1. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/PKG-INFO +4 -4
  2. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/json_schemas/execution-context/filter.json +38 -0
  3. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/pyproject.toml +4 -4
  4. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/__init__.py +1 -0
  5. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/execution_context.py +42 -0
  6. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/test_filter_schema.py +15 -0
  7. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/.gitignore +0 -0
  8. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/.readthedocs.yaml +0 -0
  9. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/LICENSE.txt +0 -0
  10. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/Makefile +0 -0
  11. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/README.md +0 -0
  12. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/json_schemas/execution-context/attribute.json +0 -0
  13. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/json_schemas/execution-context/date-granularity.json +0 -0
  14. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/json_schemas/execution-context/execution-context.json +0 -0
  15. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/json_schemas/execution-context/label-elements/depends-on-date-filter.json +0 -0
  16. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/json_schemas/execution-context/label-elements/depends-on.json +0 -0
  17. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/json_schemas/execution-context/label-elements/execution-request.json +0 -0
  18. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/__init__.py +0 -0
  19. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/data_source_messages.py +0 -0
  20. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/flight_methods.py +0 -0
  21. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/function.py +0 -0
  22. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/function_invocation.py +0 -0
  23. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/function_registry.py +0 -0
  24. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/function/function_task.py +0 -0
  25. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/src/gooddata_flexconnect/py.typed +0 -0
  26. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/__init__.py +0 -0
  27. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/assert_error_info.py +0 -0
  28. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/function/__init__.py +0 -0
  29. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/function/conftest.py +0 -0
  30. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/function/test_data_source_messages.py +0 -0
  31. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/function/test_flex_fun_execution_context.py +0 -0
  32. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/function/test_registry.py +0 -0
  33. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/function/testing_funs.py +0 -0
  34. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/__init__.py +0 -0
  35. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/conftest.py +0 -0
  36. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/test_attribute_schema.py +0 -0
  37. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/test_depends_on_date_filter_schema.py +0 -0
  38. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/test_depends_on_schema.py +0 -0
  39. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/test_execution_context_schema.py +0 -0
  40. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/json_schemas/test_label_elements_execution_request_schema.py +0 -0
  41. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/__init__.py +0 -0
  42. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/conftest.py +0 -0
  43. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/funs/__init__.py +0 -0
  44. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/funs/fun1.py +0 -0
  45. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/funs/fun2.py +0 -0
  46. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/funs/fun3.py +0 -0
  47. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/funs/fun4.py +0 -0
  48. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/test_flexconnect_server.py +0 -0
  49. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/tls/ca-cert.pem +0 -0
  50. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/tls/client-cert.pem +0 -0
  51. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/tls/client-key.pem +0 -0
  52. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/tls/server-cert.pem +0 -0
  53. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tests/server/tls/server-key.pem +0 -0
  54. {gooddata_flexconnect-1.61.1.dev2 → gooddata_flexconnect-1.62.1.dev1}/tox.ini +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gooddata-flexconnect
3
- Version: 1.61.1.dev2
3
+ Version: 1.62.1.dev1
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.61.1.dev2
5
+ Project-URL: Documentation, https://gooddata-flexconnect.readthedocs.io/en/v1.62.1.dev1
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,8 +21,8 @@ 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.61.1.dev2
25
- Requires-Dist: gooddata-sdk~=1.61.1.dev2
24
+ Requires-Dist: gooddata-flight-server~=1.62.1.dev1
25
+ Requires-Dist: gooddata-sdk~=1.62.1.dev1
26
26
  Requires-Dist: orjson<4.0.0,>=3.9.15
27
27
  Requires-Dist: pyarrow>=16.1.0
28
28
  Requires-Dist: structlog<25.0.0,>=24.0.0
@@ -59,6 +59,44 @@
59
59
  "values"
60
60
  ]
61
61
  },
62
+ {
63
+ "type": "object",
64
+ "description": "Filter for matching label values using a literal string pattern.",
65
+ "properties": {
66
+ "filterType": {
67
+ "const": "matchAttributeFilter"
68
+ },
69
+ "labelIdentifier": {
70
+ "type": "string",
71
+ "description": "Identifier of the label used."
72
+ },
73
+ "matchType": {
74
+ "type": "string",
75
+ "enum": ["CONTAINS", "STARTS_WITH", "ENDS_WITH"],
76
+ "description": "The type of string match to apply."
77
+ },
78
+ "literal": {
79
+ "type": "string",
80
+ "description": "The literal value to match against."
81
+ },
82
+ "negate": {
83
+ "type": "boolean",
84
+ "default": false,
85
+ "description": "Whether to negate the match."
86
+ },
87
+ "caseSensitive": {
88
+ "type": "boolean",
89
+ "default": false,
90
+ "description": "Whether the match is case-sensitive."
91
+ }
92
+ },
93
+ "required": [
94
+ "filterType",
95
+ "labelIdentifier",
96
+ "matchType",
97
+ "literal"
98
+ ]
99
+ },
62
100
  {
63
101
  "type": "object",
64
102
  "description": "Filter for relative date ranges.",
@@ -1,7 +1,7 @@
1
1
  # (C) 2025 GoodData Corporation
2
2
  [project]
3
3
  name = "gooddata-flexconnect"
4
- version = "1.61.1.dev2"
4
+ version = "1.62.1.dev1"
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,8 +29,8 @@ keywords = [
29
29
  requires-python = ">=3.10"
30
30
  dependencies = [
31
31
  "dynaconf>=3.1.11,<4.0.0",
32
- "gooddata-flight-server~=1.61.1.dev2",
33
- "gooddata-sdk~=1.61.1.dev2",
32
+ "gooddata-flight-server~=1.62.1.dev1",
33
+ "gooddata-sdk~=1.62.1.dev1",
34
34
  "orjson>=3.9.15,<4.0.0",
35
35
  "pyarrow>=16.1.0",
36
36
  "structlog>=24.0.0,<25.0.0",
@@ -50,7 +50,7 @@ classifiers = [
50
50
  ]
51
51
 
52
52
  [project.urls]
53
- Documentation = "https://gooddata-flexconnect.readthedocs.io/en/v1.61.1.dev2"
53
+ Documentation = "https://gooddata-flexconnect.readthedocs.io/en/v1.62.1.dev1"
54
54
  Source = "https://github.com/gooddata/gooddata-python-sdk"
55
55
 
56
56
  [dependency-groups]
@@ -11,6 +11,7 @@ from gooddata_flexconnect.function.execution_context import (
11
11
  ExecutionContextAttribute,
12
12
  ExecutionContextAttributeSorting,
13
13
  ExecutionContextFilter,
14
+ ExecutionContextMatchAttributeFilter,
14
15
  ExecutionContextNegativeAttributeFilter,
15
16
  ExecutionContextPositiveAttributeFilter,
16
17
  ExecutionContextRelativeDateFilter,
@@ -176,6 +176,38 @@ class ExecutionContextNegativeAttributeFilter:
176
176
  """
177
177
 
178
178
 
179
+ @dataclass
180
+ class ExecutionContextMatchAttributeFilter:
181
+ """
182
+ Information about the match attribute filter.
183
+ """
184
+
185
+ label_identifier: str
186
+ """
187
+ Identifier of the label used.
188
+ """
189
+
190
+ literal: str
191
+ """
192
+ Value to filter by.
193
+ """
194
+
195
+ match_type: str
196
+ """
197
+ Match type of the filter.
198
+ """
199
+
200
+ negate: bool
201
+ """
202
+ Whether the filter should keep values NOT matching the literal.
203
+ """
204
+
205
+ case_sensitive: bool
206
+ """
207
+ Whether the matching should be made in a case-sensitive way.
208
+ """
209
+
210
+
179
211
  @dataclass
180
212
  class ExecutionContextRelativeDateFilter:
181
213
  """
@@ -228,6 +260,7 @@ class ExecutionContextAbsoluteDateFilter:
228
260
  ExecutionContextFilter: TypeAlias = Union[
229
261
  ExecutionContextPositiveAttributeFilter,
230
262
  ExecutionContextNegativeAttributeFilter,
263
+ ExecutionContextMatchAttributeFilter,
231
264
  ExecutionContextRelativeDateFilter,
232
265
  ExecutionContextAbsoluteDateFilter,
233
266
  ]
@@ -564,6 +597,15 @@ def _dict_to_filter(d: dict) -> ExecutionContextFilter:
564
597
  if filter_type == "negativeAttributeFilter":
565
598
  return ExecutionContextNegativeAttributeFilter(label_identifier=d["labelIdentifier"], values=d["values"])
566
599
 
600
+ if filter_type == "matchAttributeFilter":
601
+ return ExecutionContextMatchAttributeFilter(
602
+ label_identifier=d["labelIdentifier"],
603
+ literal=d["literal"],
604
+ match_type=d["matchType"],
605
+ negate=d.get("negate", False),
606
+ case_sensitive=d.get("caseSensitive", False),
607
+ )
608
+
567
609
  if filter_type == "relativeDateFilter":
568
610
  return ExecutionContextRelativeDateFilter(
569
611
  dataset_identifier=d["datasetIdentifier"],
@@ -16,6 +16,12 @@ from jsonschema.exceptions import ValidationError
16
16
  "labelIdentifier": "attribute1",
17
17
  "values": ["id1", "id2", "id3", None],
18
18
  },
19
+ {
20
+ "filterType": "matchAttributeFilter",
21
+ "labelIdentifier": "attribute1",
22
+ "literal": "foo",
23
+ "matchType": "CONTAINS",
24
+ },
19
25
  {
20
26
  "filterType": "relativeDateFilter",
21
27
  "from": -5,
@@ -42,6 +48,15 @@ def test_valid_filter_schema(value, get_validator):
42
48
  {"filterType": "negativeAttributeFilter", "labelIdentifier": "attribute1"}, # missing values
43
49
  {"filterType": "relativeDateFilter", "from": -5, "to": 0, "granularity": "DAY"}, # missing datasetIdentifier
44
50
  {"filterType": "absoluteDateFilter", "from": "2021-01-01", "to": "2021-12-31"}, # missing datasetIdentifier
51
+ # missing match type
52
+ {"filterType": "matchAttributeFilter", "labelIdentifier": "attribute1", "literal": "foo"},
53
+ # invalid match type
54
+ {
55
+ "filterType": "matchAttributeFilter",
56
+ "labelIdentifier": "attribute1",
57
+ "literal": "foo",
58
+ "matchType": "INVALID",
59
+ },
45
60
  ],
46
61
  )
47
62
  def test_invalid_filter_schema(value, get_validator):