feat(python-sdk): add support for write conflict settings #643
feat(python-sdk): add support for write conflict settings #643
Conversation
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. WalkthroughThis PR adds support for conflict options on write operations across the Python SDK templates within the generator. It updates API references, introduces new model classes for conflict handling (ConflictOptions, ClientWriteOptions), extends client write methods to accept and propagate conflict options, and updates tests and documentation to exercise the new functionality. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes The changes span 16+ files with a mix of new model definitions, client logic extensions, and comprehensive test updates. While the modifications follow a consistent, homogeneous pattern (threading conflict options through write operations), the scope encompasses both async and sync variants, introduces new public APIs, and modifies client core logic. Template refactoring and straightforward model additions reduce overall complexity, but logic density in client changes and breadth of affected areas warrant moderate review effort. Possibly related PRs
Suggested reviewers
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@evansims I ran into a small issue here |
|
👋 Hey @SoulPancake — you'll just need some minor tweaks on After line 119: invalid_values = ", ".join(map(str, set({{{name}}}) - set(allowed_values)))
valid_values = ", ".join(map(str, allowed_values))
raise ValueError(
f"Invalid values for `{{{name}}}` [{invalid_values}], must be a subset of [{valid_values}]"
)After line 128: invalid_keys = ", ".join(map(str, set({{{name}}}.keys()) - set(allowed_values)))
valid_values = ", ".join(map(str, allowed_values))
raise ValueError(
f"Invalid keys in `{{{name}}}` [{invalid_keys}], must be a subset of [{valid_values}]"
)And after line 139: raise ValueError(
f"Invalid value for `{{{name}}}` ({{{name}}}), must be one of {allowed_values}"
) |
|
I am still reverse-synching this PR with the py-sdk PR. I will mark this ready for review post that |
There was a problem hiding this comment.
Pull Request Overview
Adds support for write conflict handling in the Python SDK templates by introducing conflict options for duplicate writes and missing deletes, updates tests, and documents usage.
- Introduces ConflictOptions with enum controls for on_duplicate_writes and on_missing_deletes.
- Wires conflict options into write request construction; updates tests to assert request payloads and adds new tests for ignore behavior.
- Updates OpenAPI ref, CI workflow, README docs, and improves some template error messages and formatting.
Reviewed Changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| config/clients/python/template/src/client/models/write_conflict_opts.py.mustache | New model for conflict options/enums enabling duplicate/missing handling. |
| config/clients/python/template/src/client/models/write_options.py.mustache | New typed write options container including conflict options (not yet wired as primary input type). |
| config/clients/python/template/src/client/models/write_request.py.mustache | Changes writes/deletes tuple-key helpers to accept conflict parameters. |
| config/clients/python/template/src/client/client.py.mustache | Async client: plumbs conflict options into WriteRequest build. |
| config/clients/python/template/src/sync/client/client.py.mustache | Sync client: plumbs conflict options into WriteRequest build. |
| config/clients/python/template/test/client/client_test.py.mustache | Async tests updated/added to validate conflict behavior and formatting tweaks. |
| config/clients/python/template/test/sync/client/client_test.py.mustache | Sync tests updated/added to validate conflict behavior and formatting tweaks. |
| config/clients/python/template/test/sync/api_test.py.mustache | Adjusts expected payloads to include default on_duplicate/on_missing. |
| config/clients/python/template/test/api_test.py.mustache | Adjusts expected payloads to include default on_duplicate/on_missing. |
| config/clients/python/template/model.mustache | Refactors enum validation error messages to f-strings. |
| config/clients/python/template/README_calling_api.mustache | Documents conflict options for write operations. |
| config/clients/python/template/src/client/models/init.py.mustache | Exports new conflict/write options in public API. |
| config/clients/python/config.overrides.json | Maps new support files into package outputs. |
| Makefile | Updates OPEN_API_REF to a newer API commit supporting the new fields. |
| .github/workflows/main.yaml | Aligns CI OPEN_API_REF with Makefile. |
config/clients/python/template/src/client/models/write_request.py.mustache
Outdated
Show resolved
Hide resolved
config/clients/python/template/src/client/models/write_request.py.mustache
Outdated
Show resolved
Hide resolved
config/clients/python/template/test/client/client_test.py.mustache
Outdated
Show resolved
Hide resolved
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
config/clients/python/template/src/client/models/write_request.py.mustache (2)
49-66: Preserve backward compatibility forwrites_tuple_keysPreviously this was a property; changing it to a method is a breaking API change. Keep the new parameterized builder, but reintroduce a legacy property that returns the default behavior.
Apply these diffs:
- Rename the new methods to builder names and add legacy properties.
- def writes_tuple_keys( - self, on_duplicate: str | None = None - ) -> WriteRequestWrites | None: + def build_writes_tuple_keys( + self, on_duplicate: str | None = None + ) -> WriteRequestWrites | None: @@ - if on_duplicate is not None: - return WriteRequestWrites(tuple_keys=keys, on_duplicate=on_duplicate) - return WriteRequestWrites(tuple_keys=keys) + if on_duplicate is not None: + return WriteRequestWrites(tuple_keys=keys, on_duplicate=on_duplicate) + return WriteRequestWrites(tuple_keys=keys) + + @property + def writes_tuple_keys(self) -> WriteRequestWrites | None: + # Legacy property: default behavior + return self.build_writes_tuple_keys()
67-83: Do the same fordeletes_tuple_keysReintroduce the legacy property and add builder method.
- def deletes_tuple_keys( - self, on_missing: str | None = None - ) -> WriteRequestDeletes | None: + def build_deletes_tuple_keys( + self, on_missing: str | None = None + ) -> WriteRequestDeletes | None: @@ - if on_missing is not None: - return WriteRequestDeletes(tuple_keys=keys, on_missing=on_missing) - return WriteRequestDeletes(tuple_keys=keys) + if on_missing is not None: + return WriteRequestDeletes(tuple_keys=keys, on_missing=on_missing) + return WriteRequestDeletes(tuple_keys=keys) + + @property + def deletes_tuple_keys(self) -> WriteRequestDeletes | None: + # Legacy property: default behavior + return self.build_deletes_tuple_keys()
🧹 Nitpick comments (8)
config/clients/python/CHANGELOG.md.mustache (1)
4-9: Align naming and references in Unreleased entry.
- Use the actual PR/issue reference for this generator change (current PR is #643), or drop the number to avoid drift.
- Consider matching field names to the Python surface to reduce confusion: “on_duplicate_writes” and “on_missing_deletes” (enums) rather than “on_duplicate/on_missing”.
- - feat: add support for conflict options for Write operations: (#235) + - feat: add support for conflict options for Write operations (#643) @@ - - `on_duplicate` for handling duplicate tuple writes (ERROR or IGNORE) - - `on_missing` for handling deletes of non-existent tuples (ERROR or IGNORE) + - `on_duplicate_writes` for handling duplicate tuple writes (ERROR or IGNORE) + - `on_missing_deletes` for handling deletes of non-existent tuples (ERROR or IGNORE)Ensure the README anchor exists at README.md#conflict-options-for-write-operations in the generated package.
config/clients/python/template/README_calling_api.mustache (1)
455-496: Use templated package name and re-exported imports in the example.Avoid hardcoding “openfga_sdk”; import from {{packageName}} and from client.models (init re-exports). Keeps docs stable if packageName changes.
-# from openfga_sdk import OpenFgaClient -# from openfga_sdk.client.models import ClientTuple, ClientWriteRequest -# from openfga_sdk.client.models.write_conflict_opts import ( -# ClientWriteRequestOnDuplicateWrites, -# ClientWriteRequestOnMissingDeletes, -# ConflictOptions, -# ) +# from {{packageName}} import OpenFgaClient +# from {{packageName}}.client.models import ClientTuple, ClientWriteRequest +# from {{packageName}}.client.models import ( +# ClientWriteRequestOnDuplicateWrites, +# ClientWriteRequestOnMissingDeletes, +# ConflictOptions, +# )Confirm client/models/init.py.mustache re-exports the three symbols so the above import works.
config/clients/python/template/src/sync/client/client.py.mustache (1)
115-122: Broaden options typing; add return type for clarity.options may now hold ConflictOptions objects, so the current dict[str, int|str|dict] hint is too narrow. Recommend widening and adding typing imports.
+from typing import Any, Optional @@ -def options_to_conflict_info(options: dict[str, int | str | dict[str, int | str]] | None = None): +def options_to_conflict_info(options: dict[str, Any] | None = None) -> Optional[object]: """ Return the conflict info """ if options is not None and options.get("conflict"): return options["conflict"] return NoneOptionally, annotate return to the actual ConflictOptions type if importing it here won’t create a circular import.
If you prefer stronger typing end-to-end, I can propose a follow-up to standardize options: dict[str, Any] across helpers in this file.
config/clients/python/template/test/sync/client/client_test.py.mustache (1)
3963-4150: Consider optional test enhancements for more comprehensive coverage.The current conflict options tests are solid, but you might consider adding:
- Explicit tests for
ERRORenum values (currently only tested implicitly through default behavior)- Tests for conflict options in batch operations (
write_batch,delete_batchwithtransaction.disabled=True)- Edge case: conflict options with empty writes/deletes arrays
These additions would make the test suite more robust but are not critical since the core functionality is well-tested.
config/clients/python/template/src/client/client.py.mustache (1)
87-106: Consider looseningoptionstyping (non-blocking)
optionsis annotated asdict[str, int | str | dict[...] ], but you store objects (e.g.,RetryParams,ConflictOptions). PreferMapping[str, Any]across helpers to reflect actual usage.- from {{packageName}}.api_client import ApiClient + from {{packageName}}.api_client import ApiClient + from typing import Any, Mapping @@ -def options_to_kwargs( - options: dict[str, int | str | dict[str, int | str]] | None = None, -) -> dict[str, int | str | dict[str, int | str]]: +def options_to_kwargs( + options: Mapping[str, Any] | None = None, +) -> dict[str, Any]: @@ -def options_to_transaction_info(options: dict[str, int | str | dict[str, int | str]] | None = None): +def options_to_transaction_info(options: Mapping[str, Any] | None = None): @@ -def options_to_conflict_info(options: dict[str, int | str | dict[str, int | str]] | None = None): +def options_to_conflict_info(options: Mapping[str, Any] | None = None):config/clients/python/template/src/client/models/write_options.py.mustache (1)
7-71: Optional: simplify with@dataclassThis is a plain data container; consider a dataclass for brevity and type clarity. Non-blocking.
+from dataclasses import dataclass @@ -class ClientWriteOptions: - """ - OpenFGA client write options - """ - def __init__(..., conflict: ConflictOptions | None = None) -> None: - self._authorization_model_id = authorization_model_id - self._transaction = transaction - self._conflict = conflict - @property - def authorization_model_id(self) -> str | None: ... - @authorization_model_id.setter - def authorization_model_id(self, value: str | None) -> None: ... - @property - def transaction(self) -> WriteTransactionOpts | None: ... - @transaction.setter - def transaction(self, value: WriteTransactionOpts | None) -> None: ... - @property - def conflict(self) -> ConflictOptions | None: ... - @conflict.setter - def conflict(self, value: ConflictOptions | None) -> None: ... +@dataclass +class ClientWriteOptions: + """OpenFGA client write options""" + authorization_model_id: str | None = None + transaction: WriteTransactionOpts | None = None + conflict: ConflictOptions | None = Noneconfig/clients/python/template/src/client/models/write_conflict_opts.py.mustache (2)
16-27: LGTM! Clean initialization with modern type hints.The implementation correctly uses Python 3.10+ union syntax and follows the private attribute pattern. Runtime validation is appropriately deferred to the API call level.
Consider enhancing the class docstring to include usage examples or describe the purpose of the conflict options:
class ConflictOptions: """ - OpenFGA client write conflict options + OpenFGA client write conflict options. + + Attributes: + on_duplicate_writes: How to handle duplicate write operations (ERROR or IGNORE) + on_missing_deletes: How to handle deletes on missing tuples (ERROR or IGNORE) """
29-61: Properties implemented correctly.The getter/setter pattern is properly implemented. The absence of runtime validation is appropriate for a client-side options class where type hints provide static checking.
Consider enriching the property docstrings to be more descriptive:
@property def on_duplicate_writes(self) -> ClientWriteRequestOnDuplicateWrites | None: """ - Return on_duplicate_writes + Get the policy for handling duplicate write operations. + + Returns: + ClientWriteRequestOnDuplicateWrites | None: ERROR or IGNORE, or None if not set """ return self._on_duplicate_writes @on_duplicate_writes.setter def on_duplicate_writes( self, value: ClientWriteRequestOnDuplicateWrites | None, ) -> None: """ - Set on_duplicate_writes + Set the policy for handling duplicate write operations. + + Args: + value: ERROR or IGNORE, or None to unset """ self._on_duplicate_writes = valueApply similar improvements to
on_missing_deletesproperties.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (16)
.github/workflows/main.yaml(1 hunks)Makefile(1 hunks)config/clients/python/CHANGELOG.md.mustache(1 hunks)config/clients/python/config.overrides.json(1 hunks)config/clients/python/template/README_calling_api.mustache(1 hunks)config/clients/python/template/model.mustache(1 hunks)config/clients/python/template/src/client/client.py.mustache(4 hunks)config/clients/python/template/src/client/models/__init__.py.mustache(2 hunks)config/clients/python/template/src/client/models/write_conflict_opts.py.mustache(1 hunks)config/clients/python/template/src/client/models/write_options.py.mustache(1 hunks)config/clients/python/template/src/client/models/write_request.py.mustache(3 hunks)config/clients/python/template/src/sync/client/client.py.mustache(4 hunks)config/clients/python/template/test/api_test.py.mustache(2 hunks)config/clients/python/template/test/client/client_test.py.mustache(24 hunks)config/clients/python/template/test/sync/api_test.py.mustache(2 hunks)config/clients/python/template/test/sync/client/client_test.py.mustache(21 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
config/**/*.mustache
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Validate mustache syntax and variable references across all template files, including CHANGELOG.md.mustache
Files:
config/clients/python/template/src/client/client.py.mustacheconfig/clients/python/CHANGELOG.md.mustacheconfig/clients/python/template/test/sync/api_test.py.mustacheconfig/clients/python/template/test/api_test.py.mustacheconfig/clients/python/template/src/client/models/__init__.py.mustacheconfig/clients/python/template/src/sync/client/client.py.mustacheconfig/clients/python/template/test/sync/client/client_test.py.mustacheconfig/clients/python/template/src/client/models/write_request.py.mustacheconfig/clients/python/template/src/client/models/write_conflict_opts.py.mustacheconfig/clients/python/template/test/client/client_test.py.mustacheconfig/clients/python/template/model.mustacheconfig/clients/python/template/src/client/models/write_options.py.mustacheconfig/clients/python/template/README_calling_api.mustache
config/**/*.{json,mustache}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Never hardcode API keys or credentials in configuration or template files
Files:
config/clients/python/template/src/client/client.py.mustacheconfig/clients/python/CHANGELOG.md.mustacheconfig/clients/python/template/test/sync/api_test.py.mustacheconfig/clients/python/template/test/api_test.py.mustacheconfig/clients/python/template/src/client/models/__init__.py.mustacheconfig/clients/python/config.overrides.jsonconfig/clients/python/template/src/sync/client/client.py.mustacheconfig/clients/python/template/test/sync/client/client_test.py.mustacheconfig/clients/python/template/src/client/models/write_request.py.mustacheconfig/clients/python/template/src/client/models/write_conflict_opts.py.mustacheconfig/clients/python/template/test/client/client_test.py.mustacheconfig/clients/python/template/model.mustacheconfig/clients/python/template/src/client/models/write_options.py.mustacheconfig/clients/python/template/README_calling_api.mustache
Makefile
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Makefile: Update OPEN_API_REF in the Makefile when targeting new OpenFGA API versions
Update Docker image tags in the Makefile when upgrading build tools
Use official, tagged Docker images for containerized builds
Files:
Makefile
config/clients/*/config.overrides.json
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
config/clients/*/config.overrides.json: Always update the packageVersion in each language-specific config.overrides.json when making version changes
Maintain FOSSA compliance notice IDs in each language’s config.overrides.json
Files:
config/clients/python/config.overrides.json
config/{common/config.base.json,clients/*/config.overrides.json}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Ensure consistent versioning across base and language override configuration files to avoid version conflicts
Files:
config/clients/python/config.overrides.json
🧠 Learnings (2)
📚 Learning: 2025-09-04T17:35:34.111Z
Learnt from: CR
PR: openfga/sdk-generator#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-09-04T17:35:34.111Z
Learning: Applies to Makefile : Update OPEN_API_REF in the Makefile when targeting new OpenFGA API versions
Applied to files:
Makefile
📚 Learning: 2025-08-12T14:18:58.827Z
Learnt from: rhamzeh
PR: openfga/sdk-generator#573
File: config/clients/java/config.overrides.json:184-191
Timestamp: 2025-08-12T14:18:58.827Z
Learning: In the OpenFGA SDK generator, templates are inherited from the upstream OpenAPI Generator (openapitools/openapi-generator-cli). Only custom or modified templates need to be explicitly defined in the config overrides files. Base templates like `settings.gradle.mustache` are provided by the upstream generator and don't require override mappings.
Applied to files:
config/clients/python/config.overrides.json
🪛 Gitleaks (8.28.0)
.github/workflows/main.yaml
[high] 139-139: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build-and-test-java-sdk
🔇 Additional comments (20)
.github/workflows/main.yaml (1)
139-139: Update OPEN_API_REF to v1.10.0 API for write conflict support.The change updates the Python SDK test to use the same API reference already in use by Go, .NET, and Java SDKs. This aligns with the PR objective to support write conflict options, which were introduced in OpenFGA v1.10.0. The static analysis tool flags this as a potential API key, but this is a false positive—the value is a git commit SHA and poses no security risk.
Makefile (1)
3-3: LGTM!The update properly sets the default OPEN_API_REF to v1.10.0 API, consistent with the workflow changes and aligned with coding guidelines. The OPEN_API_URL interpolation (line 4) will automatically resolve to the new OpenFGA API documentation. No additional configuration changes are needed.
config/clients/python/config.overrides.json (1)
156-163: Additions look correct; paths and destinations match existing pattern.Both templates are mapped consistently under src/client/models and use SupportingFiles like peers. No hardcoded secrets found.
Please confirm:
- packageVersion consistency across common/config.base.json and other language overrides, and whether this feature ships with 0.9.7 or a new tag.
- FOSSA notice ID unchanged intentionally. As per coding guidelines.
config/clients/python/template/model.mustache (1)
120-124: Good switch to f-strings; preserves behavior and satisfies ruff.Temporary vars (invalid_values/valid_values) improve readability; f-strings avoid .format. No semantic change.
Tiny gotcha: set(...) requires hashable elements; for enum containers that’s fine. If any enum container could carry non-hashables in future, consider list comprehensions instead of sets.
Also applies to: 129-133, 140-141
config/clients/python/template/src/sync/client/client.py.mustache (1)
444-491: Verification successful—conflict options correctly plumbed and signatures match.All checks pass:
writes_tuple_keysanddeletes_tuple_keysaccepton_duplicateandon_missingas named parametersClientWriteRequestOnDuplicateWrites,ClientWriteRequestOnMissingDeletes, andConflictOptionsare properly re-exported- Enum values are correctly extracted and passed to tuple-key builders without leaking into kwargs
config/clients/python/template/test/api_test.py.mustache (2)
931-932: Verify default conflict behavior for deletes is correct.Similar to the write test above, this test now expects
"on_missing": "error"to always be present in delete requests.The same verification concerns apply here:
- Confirm
"error"is the correct default foron_missing- Consider adding tests for explicit conflict option configuration on deletes
876-877: No changes required — test implementation is correct.The test at lines 876-877 correctly expects
"on_duplicate": "error"when conflict options are explicitly configured withClientWriteRequestOnDuplicateWrites.ERROR. The codebase shows:
on_duplicateis conditionally included only when conflict options are explicitly set (not a hardcoded default)- When no conflict options are provided, the field is omitted entirely
- Both "error" and "ignore" values are properly tested elsewhere in the same test file (e.g., line 4011)
The implementation properly handles the conditional inclusion of conflict options in the write request payload.
config/clients/python/template/test/sync/api_test.py.mustache (2)
943-944: Consistent conflict option handling in sync client tests.The synchronous client tests correctly mirror the async version by expecting
"on_duplicate": "error"in write requests.The same verification and test coverage considerations mentioned for the async tests (lines 876-877 in api_test.py.mustache) apply here.
998-999: Consistent conflict option handling for deletes in sync client tests.The synchronous client tests correctly mirror the async version by expecting
"on_missing": "error"in delete requests.The same verification considerations mentioned for the async tests (lines 931-932 in api_test.py.mustache) apply here.
config/clients/python/template/test/sync/client/client_test.py.mustache (4)
1017-1024: LGTM! Consistent default conflict options added to write/delete tests.The updates correctly add default conflict option assertions to existing tests, ensuring writes default to
"on_duplicate": "error"and deletes default to"on_missing": "error". This maintains backward compatibility testing while supporting the new feature.Also applies to: 1063-1070
3963-4017: LGTM! Conflict options test implementation is correct.The test properly verifies that
ConflictOptionswithon_duplicate_writes=IGNOREresults in"on_duplicate": "ignore"in the request body.
4020-4075: LGTM! Missing deletes conflict option test is correct.The test properly verifies that
ConflictOptionswithon_missing_deletes=IGNOREresults in"on_missing": "ignore"in the request body.
4078-4150: LGTM! Combined conflict options test is thorough.The test correctly verifies that both conflict options can be used simultaneously, with writes including
"on_duplicate": "ignore"and deletes including"on_missing": "ignore".config/clients/python/template/src/client/client.py.mustache (3)
115-122: Good utility for extracting conflict optionsHelper cleanly isolates conflict extraction. No issues.
470-485: Conflict enums correctly mapped to request payloadsPassing
on_duplicate/on_missingonly when provided preserves previous defaults. Looks solid.If the generator’s model defaults ever stop serializing
"error"when omitted, tests relying on explicit keys will fail. Please keep an eye on that in CI.
481-485: Follow-up if you keep method rename in ClientWriteRequestIf you introduce builder methods in ClientWriteRequest for tuple keys (see separate comment), update these calls accordingly. Proposed names:
build_writes_tuple_keys(...),build_deletes_tuple_keys(...).config/clients/python/template/src/client/models/__init__.py.mustache (2)
18-24: Public exports updated correctlyNew conflict types and ClientWriteOptions are properly re-exported.
41-45: all looks consistentSurface area is coherent; no duplicates found.
config/clients/python/template/src/client/models/write_request.py.mustache (1)
1-83: Review comment is incorrect—call sites already pass conflict parametersThe call sites in
src/sync/client/client.py.mustacheandsrc/client/client.py.mustachealready invoke the builder methods with the required parameters (on_duplicateandon_missing), making the requested updates unnecessary.Likely an incorrect or invalid review comment.
config/clients/python/template/src/client/models/write_conflict_opts.py.mustache (1)
1-13: LGTM! Clean enum definitions.The string enum pattern is correctly implemented, and the use of both
strandEnuminheritance allows these enums to be used as strings while maintaining type safety.
config/clients/python/template/test/client/client_test.py.mustache
Outdated
Show resolved
Hide resolved
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Description
for #610
What problem is being solved?
The linked PR in the python sdk is the following : openfga/python-sdk#237
How is it being solved?
What changes are made to solve it?
References
Review Checklist
mainSummary by CodeRabbit
New Features
Documentation