redis-featureform 3.0.0rc1__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 (148) hide show
  1. redis_featureform-3.0.0rc1/PKG-INFO +129 -0
  2. redis_featureform-3.0.0rc1/README.md +78 -0
  3. redis_featureform-3.0.0rc1/pyproject.toml +220 -0
  4. redis_featureform-3.0.0rc1/src/featureform/__init__.py +257 -0
  5. redis_featureform-3.0.0rc1/src/featureform/_apply_wait.py +183 -0
  6. redis_featureform-3.0.0rc1/src/featureform/_generated/__init__.py +1 -0
  7. redis_featureform-3.0.0rc1/src/featureform/_generated/openapi/__init__.py +13 -0
  8. redis_featureform-3.0.0rc1/src/featureform/_generated/openapi/_internal.py +1396 -0
  9. redis_featureform-3.0.0rc1/src/featureform/_generated/openapi/github_com_redislabsdev_featureform_internal_rest_types.py +29 -0
  10. redis_featureform-3.0.0rc1/src/featureform/_generated/openapi/server.py +78 -0
  11. redis_featureform-3.0.0rc1/src/featureform/_generated/openapi/types.py +311 -0
  12. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/__init__.py +1 -0
  13. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/__init__.py +1 -0
  14. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/__init__.py +1 -0
  15. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/apply_pb2.py +58 -0
  16. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/apply_pb2.pyi +322 -0
  17. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/apply_pb2_grpc.py +147 -0
  18. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/apply_pb2_grpc.pyi +82 -0
  19. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/audit_pb2.py +47 -0
  20. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/audit_pb2.pyi +140 -0
  21. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/audit_pb2_grpc.py +97 -0
  22. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/audit_pb2_grpc.pyi +49 -0
  23. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/catalog_pb2.py +58 -0
  24. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/catalog_pb2.pyi +270 -0
  25. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/catalog_pb2_grpc.py +192 -0
  26. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/catalog_pb2_grpc.pyi +88 -0
  27. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/common_pb2.py +44 -0
  28. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/common_pb2.pyi +128 -0
  29. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/common_pb2_grpc.py +24 -0
  30. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/common_pb2_grpc.pyi +20 -0
  31. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/dataframe_pb2.py +67 -0
  32. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/dataframe_pb2.pyi +342 -0
  33. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/dataframe_pb2_grpc.py +97 -0
  34. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/dataframe_pb2_grpc.pyi +49 -0
  35. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/provider_pb2.py +117 -0
  36. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/provider_pb2.pyi +1183 -0
  37. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/provider_pb2_grpc.py +277 -0
  38. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/provider_pb2_grpc.pyi +106 -0
  39. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/rbac_pb2.py +157 -0
  40. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/rbac_pb2.pyi +1281 -0
  41. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/rbac_pb2_grpc.py +1072 -0
  42. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/rbac_pb2_grpc.pyi +260 -0
  43. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_pb2.py +108 -0
  44. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_pb2.pyi +1247 -0
  45. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_pb2_grpc.py +24 -0
  46. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_pb2_grpc.pyi +20 -0
  47. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_service_pb2.py +214 -0
  48. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_service_pb2.pyi +2280 -0
  49. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_service_pb2_grpc.py +1645 -0
  50. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/resource_service_pb2_grpc.pyi +373 -0
  51. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/secret_provider_pb2.py +83 -0
  52. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/secret_provider_pb2.pyi +587 -0
  53. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/secret_provider_pb2_grpc.py +277 -0
  54. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/secret_provider_pb2_grpc.pyi +106 -0
  55. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/serving_pb2.py +112 -0
  56. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/serving_pb2.pyi +783 -0
  57. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/serving_pb2_grpc.py +146 -0
  58. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/serving_pb2_grpc.pyi +76 -0
  59. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/version_pb2.py +41 -0
  60. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/version_pb2.pyi +72 -0
  61. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/version_pb2_grpc.py +102 -0
  62. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/version_pb2_grpc.pyi +64 -0
  63. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/workspace_pb2.py +65 -0
  64. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/workspace_pb2.pyi +296 -0
  65. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/workspace_pb2_grpc.py +322 -0
  66. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/featureform/v2/workspace_pb2_grpc.pyi +124 -0
  67. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/scheduler/__init__.py +1 -0
  68. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/scheduler/v1/__init__.py +1 -0
  69. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/scheduler/v1/scheduler_pb2.py +155 -0
  70. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/scheduler/v1/scheduler_pb2.pyi +1618 -0
  71. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/scheduler/v1/scheduler_pb2_grpc.py +972 -0
  72. redis_featureform-3.0.0rc1/src/featureform/_generated/proto/scheduler/v1/scheduler_pb2_grpc.pyi +262 -0
  73. redis_featureform-3.0.0rc1/src/featureform/_internal/__init__.py +1 -0
  74. redis_featureform-3.0.0rc1/src/featureform/_internal/http.py +224 -0
  75. redis_featureform-3.0.0rc1/src/featureform/_internal/logging.py +299 -0
  76. redis_featureform-3.0.0rc1/src/featureform/_internal/telemetry/__init__.py +73 -0
  77. redis_featureform-3.0.0rc1/src/featureform/_internal/telemetry/base.py +126 -0
  78. redis_featureform-3.0.0rc1/src/featureform/_internal/telemetry/config.py +71 -0
  79. redis_featureform-3.0.0rc1/src/featureform/_internal/telemetry/noop.py +89 -0
  80. redis_featureform-3.0.0rc1/src/featureform/_internal/telemetry/otel.py +152 -0
  81. redis_featureform-3.0.0rc1/src/featureform/_version.py +39 -0
  82. redis_featureform-3.0.0rc1/src/featureform/auth/__init__.py +17 -0
  83. redis_featureform-3.0.0rc1/src/featureform/auth/token.py +346 -0
  84. redis_featureform-3.0.0rc1/src/featureform/cli/__init__.py +5 -0
  85. redis_featureform-3.0.0rc1/src/featureform/cli/admin_client.py +888 -0
  86. redis_featureform-3.0.0rc1/src/featureform/cli/commands/__init__.py +27 -0
  87. redis_featureform-3.0.0rc1/src/featureform/cli/commands/_common.py +23 -0
  88. redis_featureform-3.0.0rc1/src/featureform/cli/commands/_provider_config.py +427 -0
  89. redis_featureform-3.0.0rc1/src/featureform/cli/commands/apply.py +737 -0
  90. redis_featureform-3.0.0rc1/src/featureform/cli/commands/audit.py +58 -0
  91. redis_featureform-3.0.0rc1/src/featureform/cli/commands/auth.py +147 -0
  92. redis_featureform-3.0.0rc1/src/featureform/cli/commands/catalog.py +116 -0
  93. redis_featureform-3.0.0rc1/src/featureform/cli/commands/config.py +175 -0
  94. redis_featureform-3.0.0rc1/src/featureform/cli/commands/dataframe.py +182 -0
  95. redis_featureform-3.0.0rc1/src/featureform/cli/commands/graph.py +538 -0
  96. redis_featureform-3.0.0rc1/src/featureform/cli/commands/machine_credential.py +142 -0
  97. redis_featureform-3.0.0rc1/src/featureform/cli/commands/provider.py +518 -0
  98. redis_featureform-3.0.0rc1/src/featureform/cli/commands/rbac.py +445 -0
  99. redis_featureform-3.0.0rc1/src/featureform/cli/commands/scheduler.py +955 -0
  100. redis_featureform-3.0.0rc1/src/featureform/cli/commands/secret_provider.py +305 -0
  101. redis_featureform-3.0.0rc1/src/featureform/cli/commands/workspace.py +167 -0
  102. redis_featureform-3.0.0rc1/src/featureform/cli/errors.py +155 -0
  103. redis_featureform-3.0.0rc1/src/featureform/cli/main.py +475 -0
  104. redis_featureform-3.0.0rc1/src/featureform/cli/output/__init__.py +13 -0
  105. redis_featureform-3.0.0rc1/src/featureform/cli/output/base.py +49 -0
  106. redis_featureform-3.0.0rc1/src/featureform/cli/output/json_fmt.py +71 -0
  107. redis_featureform-3.0.0rc1/src/featureform/cli/output/table.py +163 -0
  108. redis_featureform-3.0.0rc1/src/featureform/cli/output/yaml_fmt.py +64 -0
  109. redis_featureform-3.0.0rc1/src/featureform/cli/scheduler_client.py +1025 -0
  110. redis_featureform-3.0.0rc1/src/featureform/cli/utils/__init__.py +5 -0
  111. redis_featureform-3.0.0rc1/src/featureform/cli/utils/context.py +250 -0
  112. redis_featureform-3.0.0rc1/src/featureform/client.py +4740 -0
  113. redis_featureform-3.0.0rc1/src/featureform/config.py +118 -0
  114. redis_featureform-3.0.0rc1/src/featureform/dataframe/__init__.py +10 -0
  115. redis_featureform-3.0.0rc1/src/featureform/dataframe/client.py +660 -0
  116. redis_featureform-3.0.0rc1/src/featureform/dataframe/result.py +309 -0
  117. redis_featureform-3.0.0rc1/src/featureform/errors.py +796 -0
  118. redis_featureform-3.0.0rc1/src/featureform/py.typed +0 -0
  119. redis_featureform-3.0.0rc1/src/featureform/resources/__init__.py +112 -0
  120. redis_featureform-3.0.0rc1/src/featureform/resources/base.py +185 -0
  121. redis_featureform-3.0.0rc1/src/featureform/resources/dataset.py +224 -0
  122. redis_featureform-3.0.0rc1/src/featureform/resources/entity.py +47 -0
  123. redis_featureform-3.0.0rc1/src/featureform/resources/feature.py +368 -0
  124. redis_featureform-3.0.0rc1/src/featureform/resources/label.py +245 -0
  125. redis_featureform-3.0.0rc1/src/featureform/resources/provider.py +570 -0
  126. redis_featureform-3.0.0rc1/src/featureform/resources/realtime_feature.py +593 -0
  127. redis_featureform-3.0.0rc1/src/featureform/resources/training.py +191 -0
  128. redis_featureform-3.0.0rc1/src/featureform/serving/__init__.py +12 -0
  129. redis_featureform-3.0.0rc1/src/featureform/serving/_decode.py +93 -0
  130. redis_featureform-3.0.0rc1/src/featureform/serving/_metadata.py +99 -0
  131. redis_featureform-3.0.0rc1/src/featureform/serving/_realtime.py +253 -0
  132. redis_featureform-3.0.0rc1/src/featureform/serving/cache.py +190 -0
  133. redis_featureform-3.0.0rc1/src/featureform/serving/client.py +769 -0
  134. redis_featureform-3.0.0rc1/src/featureform/serving/types.py +134 -0
  135. redis_featureform-3.0.0rc1/src/featureform/spark.py +151 -0
  136. redis_featureform-3.0.0rc1/src/featureform/transport/__init__.py +49 -0
  137. redis_featureform-3.0.0rc1/src/featureform/transport/base.py +42 -0
  138. redis_featureform-3.0.0rc1/src/featureform/transport/grpc.py +763 -0
  139. redis_featureform-3.0.0rc1/src/featureform/transport/rest.py +223 -0
  140. redis_featureform-3.0.0rc1/src/featureform/types/__init__.py +124 -0
  141. redis_featureform-3.0.0rc1/src/featureform/types/catalog.py +48 -0
  142. redis_featureform-3.0.0rc1/src/featureform/types/entity.py +39 -0
  143. redis_featureform-3.0.0rc1/src/featureform/types/provider.py +496 -0
  144. redis_featureform-3.0.0rc1/src/featureform/types/resource.py +387 -0
  145. redis_featureform-3.0.0rc1/src/featureform/types/secret.py +104 -0
  146. redis_featureform-3.0.0rc1/src/featureform/types/secret_provider.py +126 -0
  147. redis_featureform-3.0.0rc1/src/featureform/types/workspace.py +54 -0
  148. redis_featureform-3.0.0rc1/src/featureform/version.py +228 -0
@@ -0,0 +1,129 @@
1
+ Metadata-Version: 2.3
2
+ Name: redis-featureform
3
+ Version: 3.0.0rc1
4
+ Summary: Enterprise Python client for Featureform v2 API
5
+ Author: Simba Khadder
6
+ Author-email: Simba Khadder <simba.khadder@redis.com>
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Typing :: Typed
15
+ Requires-Dist: cloudpickle>=3.0.0
16
+ Requires-Dist: httpx>=0.27.0
17
+ Requires-Dist: packaging>=24.0
18
+ Requires-Dist: pydantic>=2.0.0
19
+ Requires-Dist: structlog>=24.0.0
20
+ Requires-Dist: typer>=0.12.0
21
+ Requires-Dist: rich>=13.0.0
22
+ Requires-Dist: pyyaml>=6.0.0
23
+ Requires-Dist: grpcio>=1.60.0
24
+ Requires-Dist: grpcio-health-checking>=1.60.0
25
+ Requires-Dist: protobuf>=4.25.0
26
+ Requires-Dist: pyarrow>=17.0.0
27
+ Requires-Dist: pandas>=2.3.3
28
+ Requires-Dist: tomli>=2.0.0 ; python_full_version < '3.11'
29
+ Requires-Dist: pytest>=8.0.0 ; extra == 'dev'
30
+ Requires-Dist: pytest-cov>=4.1.0 ; extra == 'dev'
31
+ Requires-Dist: pytest-asyncio>=0.23.0 ; extra == 'dev'
32
+ Requires-Dist: pytest-httpx>=0.30.0 ; extra == 'dev'
33
+ Requires-Dist: psycopg[binary]>=3.2.0 ; extra == 'dev'
34
+ Requires-Dist: requests>=2.33.0 ; extra == 'dev'
35
+ Requires-Dist: redis>=5.0.0 ; extra == 'dev'
36
+ Requires-Dist: schemathesis>=4 ; extra == 'dev'
37
+ Requires-Dist: polars>=1.30.0 ; extra == 'dev'
38
+ Requires-Dist: schemathesis>=4 ; extra == 'dev'
39
+ Requires-Dist: ruff>=0.8.0 ; extra == 'dev'
40
+ Requires-Dist: mypy>=1.8.0 ; extra == 'dev'
41
+ Requires-Dist: pyright>=1.1.350 ; extra == 'dev'
42
+ Requires-Dist: datamodel-code-generator>=0.55.0 ; extra == 'dev'
43
+ Requires-Dist: opentelemetry-api>=1.20.0 ; extra == 'otel'
44
+ Requires-Dist: opentelemetry-sdk>=1.20.0 ; extra == 'otel'
45
+ Requires-Dist: pyspark>=3.5,<5 ; extra == 'pyspark'
46
+ Requires-Python: >=3.10
47
+ Provides-Extra: dev
48
+ Provides-Extra: otel
49
+ Provides-Extra: pyspark
50
+ Description-Content-Type: text/markdown
51
+
52
+ # Python Client
53
+
54
+ A modern Python client library built with best-in-class tooling.
55
+
56
+ ## Features
57
+
58
+ - Built with [UV](https://docs.astral.sh/uv/) for fast, reliable dependency management
59
+ - Type-safe with [mypy](https://mypy-lang.org/)
60
+ - Linted and formatted with [Ruff](https://docs.astral.sh/ruff/)
61
+ - Tested with [pytest](https://docs.pytest.org/)
62
+ - Full type annotations (PEP 561 compatible)
63
+
64
+ ## Development Setup
65
+
66
+ ### Prerequisites
67
+
68
+ - Python 3.9 or higher
69
+ - [UV](https://docs.astral.sh/uv/) package manager
70
+
71
+ ### Installation
72
+
73
+ Install the package with development dependencies:
74
+
75
+ ```bash
76
+ make dev-install
77
+ ```
78
+
79
+ Or using UV directly:
80
+
81
+ ```bash
82
+ uv sync --all-extras
83
+ ```
84
+
85
+ ## Development
86
+
87
+ ### Running Tests
88
+
89
+ ```bash
90
+ make test
91
+ ```
92
+
93
+ ### Linting
94
+
95
+ ```bash
96
+ make lint
97
+ ```
98
+
99
+ ### Formatting
100
+
101
+ ```bash
102
+ make format
103
+ ```
104
+
105
+ ### Type Checking
106
+
107
+ ```bash
108
+ make type-check
109
+ ```
110
+
111
+ ### Building
112
+
113
+ ```bash
114
+ make build
115
+ ```
116
+
117
+ ## Project Structure
118
+
119
+ ```
120
+ python-client/
121
+ ├── src/
122
+ │ └── python_client/ # Main package
123
+ │ ├── __init__.py
124
+ │ └── py.typed # PEP 561 marker
125
+ ├── tests/ # Test suite
126
+ ├── pyproject.toml # Project configuration
127
+ ├── Makefile # Development commands
128
+ └── README.md # This file
129
+ ```
@@ -0,0 +1,78 @@
1
+ # Python Client
2
+
3
+ A modern Python client library built with best-in-class tooling.
4
+
5
+ ## Features
6
+
7
+ - Built with [UV](https://docs.astral.sh/uv/) for fast, reliable dependency management
8
+ - Type-safe with [mypy](https://mypy-lang.org/)
9
+ - Linted and formatted with [Ruff](https://docs.astral.sh/ruff/)
10
+ - Tested with [pytest](https://docs.pytest.org/)
11
+ - Full type annotations (PEP 561 compatible)
12
+
13
+ ## Development Setup
14
+
15
+ ### Prerequisites
16
+
17
+ - Python 3.9 or higher
18
+ - [UV](https://docs.astral.sh/uv/) package manager
19
+
20
+ ### Installation
21
+
22
+ Install the package with development dependencies:
23
+
24
+ ```bash
25
+ make dev-install
26
+ ```
27
+
28
+ Or using UV directly:
29
+
30
+ ```bash
31
+ uv sync --all-extras
32
+ ```
33
+
34
+ ## Development
35
+
36
+ ### Running Tests
37
+
38
+ ```bash
39
+ make test
40
+ ```
41
+
42
+ ### Linting
43
+
44
+ ```bash
45
+ make lint
46
+ ```
47
+
48
+ ### Formatting
49
+
50
+ ```bash
51
+ make format
52
+ ```
53
+
54
+ ### Type Checking
55
+
56
+ ```bash
57
+ make type-check
58
+ ```
59
+
60
+ ### Building
61
+
62
+ ```bash
63
+ make build
64
+ ```
65
+
66
+ ## Project Structure
67
+
68
+ ```
69
+ python-client/
70
+ ├── src/
71
+ │ └── python_client/ # Main package
72
+ │ ├── __init__.py
73
+ │ └── py.typed # PEP 561 marker
74
+ ├── tests/ # Test suite
75
+ ├── pyproject.toml # Project configuration
76
+ ├── Makefile # Development commands
77
+ └── README.md # This file
78
+ ```
@@ -0,0 +1,220 @@
1
+ [project]
2
+ name = "redis-featureform"
3
+ version = "3.0.0rc1"
4
+ description = "Enterprise Python client for Featureform v2 API"
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "Simba Khadder", email = "simba.khadder@redis.com" }
8
+ ]
9
+ requires-python = ">=3.10"
10
+ dependencies = [
11
+ "cloudpickle>=3.0.0",
12
+ "httpx>=0.27.0",
13
+ "packaging>=24.0",
14
+ "pydantic>=2.0.0",
15
+ "structlog>=24.0.0",
16
+ "typer>=0.12.0",
17
+ "rich>=13.0.0",
18
+ "pyyaml>=6.0.0",
19
+ "grpcio>=1.60.0",
20
+ "grpcio-health-checking>=1.60.0",
21
+ "protobuf>=4.25.0",
22
+ "pyarrow>=17.0.0",
23
+ "pandas>=2.3.3",
24
+ "tomli>=2.0.0; python_version < '3.11'",
25
+ ]
26
+ classifiers = [
27
+ "Development Status :: 3 - Alpha",
28
+ "Intended Audience :: Developers",
29
+ "Programming Language :: Python :: 3",
30
+ "Programming Language :: Python :: 3.10",
31
+ "Programming Language :: Python :: 3.11",
32
+ "Programming Language :: Python :: 3.12",
33
+ "Programming Language :: Python :: 3.13",
34
+ "Typing :: Typed",
35
+ ]
36
+
37
+ [project.optional-dependencies]
38
+ dev = [
39
+ "pytest>=8.0.0",
40
+ "pytest-cov>=4.1.0",
41
+ "pytest-asyncio>=0.23.0",
42
+ "pytest-httpx>=0.30.0",
43
+ "psycopg[binary]>=3.2.0",
44
+ "requests>=2.33.0",
45
+ "redis>=5.0.0",
46
+ "schemathesis>=4",
47
+ "polars>=1.30.0",
48
+ "schemathesis>=4",
49
+ "ruff>=0.8.0",
50
+ "mypy>=1.8.0",
51
+ "pyright>=1.1.350",
52
+ "datamodel-code-generator>=0.55.0",
53
+ ]
54
+ otel = [
55
+ "opentelemetry-api>=1.20.0",
56
+ "opentelemetry-sdk>=1.20.0",
57
+ ]
58
+ pyspark = [
59
+ "pyspark>=3.5,<5",
60
+ ]
61
+
62
+ [project.scripts]
63
+ ff = "featureform.cli.main:app"
64
+
65
+ [build-system]
66
+ requires = ["uv_build>=0.9.6,<0.10.0"]
67
+ build-backend = "uv_build"
68
+
69
+ [tool.uv.build-backend]
70
+ module-name = "featureform"
71
+
72
+ [dependency-groups]
73
+ dev = [
74
+ "pytest>=8.0.0",
75
+ "pytest-cov>=4.1.0",
76
+ "pytest-asyncio>=0.23.0",
77
+ "pytest-httpx>=0.30.0",
78
+ "psycopg[binary]>=3.2.0",
79
+ "requests>=2.33.0",
80
+ "redis>=5.0.0",
81
+ "schemathesis>=4",
82
+ "polars>=1.30.0",
83
+ "schemathesis>=4",
84
+ "ruff>=0.8.0",
85
+ "mypy>=1.8.0",
86
+ "pyright>=1.1.350",
87
+ "grpcio-tools>=1.60.0",
88
+ "types-pyyaml>=6.0.12.20250915",
89
+ "types-protobuf>=6.32.1.20251210",
90
+ "grpc-stubs>=1.53.0.6",
91
+ "opentelemetry-api>=1.20.0",
92
+ "opentelemetry-sdk>=1.20.0",
93
+ "boto3>=1.42.35",
94
+ "pyiceberg[s3fs]>=0.8.0",
95
+ "pyspark>=3.5,<5",
96
+ "datamodel-code-generator>=0.55.0",
97
+ "mypy-protobuf>=5.0.0",
98
+ ]
99
+
100
+ [tool.ruff]
101
+ line-length = 100
102
+ target-version = "py310"
103
+ exclude = [
104
+ "src/featureform/_generated",
105
+ ]
106
+
107
+ [tool.ruff.lint]
108
+ select = [
109
+ "E", # pycodestyle errors
110
+ "W", # pycodestyle warnings
111
+ "F", # pyflakes
112
+ "I", # isort
113
+ "B", # flake8-bugbear
114
+ "C4", # flake8-comprehensions
115
+ "UP", # pyupgrade
116
+ "ARG", # flake8-unused-arguments
117
+ "SIM", # flake8-simplify
118
+ ]
119
+ ignore = [
120
+ "E501", # line too long (handled by formatter)
121
+ ]
122
+
123
+ [tool.ruff.format]
124
+ quote-style = "double"
125
+ indent-style = "space"
126
+
127
+ [tool.mypy]
128
+ python_version = "3.10"
129
+ warn_return_any = true
130
+ warn_unused_configs = true
131
+ disallow_untyped_defs = true
132
+ disallow_incomplete_defs = true
133
+ check_untyped_defs = true
134
+ no_implicit_optional = true
135
+ warn_redundant_casts = true
136
+ warn_unused_ignores = true
137
+ warn_no_return = true
138
+ strict_equality = true
139
+ strict = true
140
+ exclude = [
141
+ "^src/featureform/_generated/",
142
+ ]
143
+
144
+ [[tool.mypy.overrides]]
145
+ module = "featureform._generated.*"
146
+ ignore_errors = true
147
+
148
+ [[tool.mypy.overrides]]
149
+ module = "featureform.transport.grpc"
150
+ disallow_untyped_calls = false
151
+
152
+ [[tool.mypy.overrides]]
153
+ module = ["cloudpickle", "cloudpickle.*"]
154
+ ignore_missing_imports = true
155
+
156
+ [[tool.mypy.overrides]]
157
+ module = "featureform.dataframe.*"
158
+ ignore_errors = true
159
+
160
+ [[tool.mypy.overrides]]
161
+ module = "featureform.cli.commands.dataframe"
162
+ ignore_errors = true
163
+
164
+ [tool.pyright]
165
+ pythonVersion = "3.10"
166
+ typeCheckingMode = "strict"
167
+ reportMissingImports = true
168
+ reportMissingTypeStubs = false
169
+ reportUnknownArgumentType = false
170
+ reportUnknownVariableType = false
171
+ exclude = [
172
+ "src/featureform/_generated/**",
173
+ ]
174
+ # OTel SDK has incomplete type stubs
175
+ extraPaths = []
176
+ ignore = [
177
+ "tests/unit/telemetry/test_otel.py",
178
+ # PyArrow has incomplete type stubs - ignore dataframe module
179
+ "src/featureform/dataframe/**",
180
+ "src/featureform/cli/commands/dataframe.py",
181
+ ]
182
+
183
+ [tool.pytest.ini_options]
184
+ testpaths = ["tests"]
185
+ python_files = ["test_*.py"]
186
+ python_classes = ["Test*"]
187
+ python_functions = ["test_*"]
188
+ markers = [
189
+ "auth_required: test requires an auth-enabled stack and identity provider",
190
+ "grpc_only: test requires the gRPC server (for example Arrow Flight / dataframe queries)",
191
+ "multi_node: test requires the dedicated two-node auth-enabled stack",
192
+ "rest_only: test requires the REST server",
193
+ ]
194
+ addopts = [
195
+ "-v",
196
+ "--strict-markers",
197
+ "--cov=featureform",
198
+ "--cov-report=term-missing",
199
+ "--cov-report=html",
200
+ ]
201
+ [tool.coverage.run]
202
+ source = ["src"]
203
+ parallel = true
204
+ omit = [
205
+ "*/tests/*",
206
+ "*/__pycache__/*",
207
+ "src/featureform/_generated/*",
208
+ "src/featureform/_generated/**/*",
209
+ ]
210
+
211
+ [tool.coverage.report]
212
+ exclude_lines = [
213
+ "pragma: no cover",
214
+ "def __repr__",
215
+ "raise AssertionError",
216
+ "raise NotImplementedError",
217
+ "if __name__ == .__main__.:",
218
+ "if TYPE_CHECKING:",
219
+ "@abstractmethod",
220
+ ]
@@ -0,0 +1,257 @@
1
+ """Featureform Python client library.
2
+
3
+ Enterprise-grade Python client for Featureform v2 API.
4
+ """
5
+
6
+ from featureform._apply_wait import ApplyWaitError, WaitTarget
7
+ from featureform._internal.logging import (
8
+ LogLevel,
9
+ configure_logging,
10
+ current_request_id,
11
+ get_logger,
12
+ request_id_context,
13
+ temporary_log_level,
14
+ )
15
+ from featureform._internal.telemetry import TelemetryConfig
16
+ from featureform._version import resolve_version
17
+ from featureform.client import (
18
+ ApplyResult,
19
+ ApplyWaitResult,
20
+ Client,
21
+ GraphClientBase,
22
+ GRPCGraphClient,
23
+ PingResult,
24
+ ProviderClient,
25
+ ResourceChange,
26
+ RESTGraphClient,
27
+ SecretProviderClient,
28
+ WorkspaceClient,
29
+ )
30
+ from featureform.config import Config
31
+ from featureform.errors import (
32
+ AlreadyExistsError,
33
+ ConnectionError,
34
+ DataframeFallbackError,
35
+ DataframePlanResolutionError,
36
+ FeatureformError,
37
+ FlightFallbackUnavailableError,
38
+ InternalError,
39
+ InvalidArgumentError,
40
+ NotFoundError,
41
+ SparkExecutionError,
42
+ TimeoutError,
43
+ ValidationError,
44
+ )
45
+
46
+ # New DSL resource classes
47
+ from featureform.resources import (
48
+ AggregateFeature,
49
+ AttributeFeature,
50
+ Dataset,
51
+ EnvSecretProvider,
52
+ Feature,
53
+ FeatureBuilder,
54
+ FeatureInput,
55
+ FeatureResource,
56
+ FeatureView,
57
+ FunctionNormalizerDetails,
58
+ IcebergPrimaryDataset,
59
+ IcebergProvider,
60
+ K8sSecretProvider,
61
+ Label,
62
+ LabelBuilder,
63
+ LabelResource,
64
+ PostgresPrimaryDataset,
65
+ PostgresProvider,
66
+ PostgresTransformedDataset,
67
+ PrimaryDataset,
68
+ RealtimeFeature,
69
+ RealtimeInput,
70
+ RedisClusterProvider,
71
+ RedisProvider,
72
+ Resource,
73
+ ResourceRegistry,
74
+ S3Provider,
75
+ Secret,
76
+ SecretProviderBase,
77
+ SerializerDetails,
78
+ SparkIcebergTransformedDataset,
79
+ SparkProvider,
80
+ TrainingSet,
81
+ TransformedDataset,
82
+ VaultSecretProvider,
83
+ )
84
+ from featureform.resources import Provider as ProviderBase
85
+ from featureform.resources.entity import Entity
86
+ from featureform.spark import DataframeExecutionInfo, SparkOptions, get_execution_info
87
+ from featureform.types import (
88
+ CreateWorkspaceRequest,
89
+ DynamoDBConfig,
90
+ EnvSecretConfig,
91
+ KafkaConfig,
92
+ KubernetesSecretConfig,
93
+ PostgresConfig,
94
+ Provider,
95
+ ProviderConfig,
96
+ ProviderType,
97
+ RedisConfig,
98
+ RegisterProviderRequest,
99
+ RegisterSecretProviderRequest,
100
+ S3Config,
101
+ SecretProvider,
102
+ SecretProviderConfig,
103
+ SecretProviderType,
104
+ SnowflakeConfig,
105
+ SparkProviderConfig,
106
+ UpdateProviderRequest,
107
+ UpdateSecretProviderRequest,
108
+ UpdateWorkspaceRequest,
109
+ VaultSecretConfig,
110
+ Workspace,
111
+ )
112
+
113
+ # Type helpers from types.resource
114
+ from featureform.types.resource import (
115
+ AggregateFunction,
116
+ FeatureLag,
117
+ IcebergConfig,
118
+ IcebergTableLocation,
119
+ MaterializationEngine,
120
+ PostgresDatasetConfig,
121
+ ScalarType,
122
+ SparkConfig,
123
+ TableLocation,
124
+ TrainingSetType,
125
+ ValueType,
126
+ )
127
+
128
+ __version__ = resolve_version()
129
+
130
+ __all__ = [
131
+ # Version
132
+ "__version__",
133
+ # Client
134
+ "ApplyResult",
135
+ "ApplyWaitError",
136
+ "ApplyWaitResult",
137
+ "Client",
138
+ "GRPCGraphClient",
139
+ "GraphClientBase",
140
+ "PingResult",
141
+ "ProviderClient",
142
+ "RESTGraphClient",
143
+ "ResourceChange",
144
+ "SecretProviderClient",
145
+ "WaitTarget",
146
+ "WorkspaceClient",
147
+ # Config
148
+ "Config",
149
+ # Logging
150
+ "LogLevel",
151
+ "configure_logging",
152
+ "current_request_id",
153
+ "get_logger",
154
+ "request_id_context",
155
+ "temporary_log_level",
156
+ # Telemetry
157
+ "TelemetryConfig",
158
+ # Errors
159
+ "AlreadyExistsError",
160
+ "ConnectionError",
161
+ "DataframeFallbackError",
162
+ "DataframePlanResolutionError",
163
+ "FeatureformError",
164
+ "FlightFallbackUnavailableError",
165
+ "InternalError",
166
+ "InvalidArgumentError",
167
+ "NotFoundError",
168
+ "SparkExecutionError",
169
+ "TimeoutError",
170
+ "ValidationError",
171
+ # New DSL - Base
172
+ "Resource",
173
+ "ResourceRegistry",
174
+ # New DSL - Secrets
175
+ "Secret",
176
+ "SecretProviderBase",
177
+ "EnvSecretProvider",
178
+ "VaultSecretProvider",
179
+ "K8sSecretProvider",
180
+ # New DSL - Providers (NOT Resources - registered separately)
181
+ "IcebergProvider",
182
+ "PostgresProvider",
183
+ "ProviderBase",
184
+ "RedisProvider",
185
+ "RedisClusterProvider",
186
+ "S3Provider",
187
+ "SparkProvider",
188
+ "SparkOptions",
189
+ "get_execution_info",
190
+ # New DSL - Entity
191
+ "Entity",
192
+ # New DSL - Datasets
193
+ "Dataset",
194
+ "IcebergPrimaryDataset",
195
+ "PostgresPrimaryDataset",
196
+ "PostgresTransformedDataset",
197
+ "PrimaryDataset",
198
+ "SparkIcebergTransformedDataset",
199
+ "TransformedDataset",
200
+ # New DSL - Features (builder pattern)
201
+ "Feature",
202
+ "FeatureBuilder",
203
+ "FeatureResource",
204
+ "FeatureInput",
205
+ "AttributeFeature",
206
+ "AggregateFeature",
207
+ "FunctionNormalizerDetails",
208
+ # New DSL - Labels (builder pattern)
209
+ "Label",
210
+ "LabelBuilder",
211
+ "LabelResource",
212
+ "RealtimeFeature",
213
+ "RealtimeInput",
214
+ "SerializerDetails",
215
+ # New DSL - Training
216
+ "FeatureView",
217
+ "TrainingSet",
218
+ # Type helpers
219
+ "AggregateFunction",
220
+ "FeatureLag",
221
+ "IcebergConfig",
222
+ "IcebergTableLocation",
223
+ "MaterializationEngine",
224
+ "PostgresDatasetConfig",
225
+ "ScalarType",
226
+ "SparkConfig",
227
+ "DataframeExecutionInfo",
228
+ "TableLocation",
229
+ "TrainingSetType",
230
+ "ValueType",
231
+ # Workspace Types
232
+ "CreateWorkspaceRequest",
233
+ "UpdateWorkspaceRequest",
234
+ "Workspace",
235
+ # Provider Types (legacy)
236
+ "KafkaConfig",
237
+ "PostgresConfig",
238
+ "Provider",
239
+ "ProviderConfig",
240
+ "ProviderType",
241
+ "DynamoDBConfig",
242
+ "RedisConfig",
243
+ "RegisterProviderRequest",
244
+ "S3Config",
245
+ "SparkProviderConfig",
246
+ "SnowflakeConfig",
247
+ "UpdateProviderRequest",
248
+ # SecretProvider Types
249
+ "EnvSecretConfig",
250
+ "KubernetesSecretConfig",
251
+ "RegisterSecretProviderRequest",
252
+ "SecretProvider",
253
+ "SecretProviderConfig",
254
+ "SecretProviderType",
255
+ "UpdateSecretProviderRequest",
256
+ "VaultSecretConfig",
257
+ ]