-
Notifications
You must be signed in to change notification settings - Fork 0
fix:target mode encryption #86
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @b-long, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request focuses on enhancing the codebase's maintainability and type safety. It includes an update to the pre-commit configuration to align with current linting practices and refines type annotations for I/O operations within the TDF handling logic, promoting more robust static analysis.
Highlights
- Pre-commit Configuration Update: The pre-commit hook for Ruff has been updated from
rufftoruff-checkin the configuration file. - Type Hint Refinement: Type hints for I/O streams in
src/otdf_python/tdf.pyhave been made more specific, changingBinaryIOtoio.BytesIOforoutput_streamincreate_tdfandtdf_datainload_tdf. - Code Clarity Improvement: An unnecessary
type: ignorecomment has been removed from thezipfile.ZipFileinstantiation inload_tdf, improving code clarity and indicating better type inference or resolution.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.
| Feature | Command | Description |
|---|---|---|
| Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
| Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
| Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
| Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request updates a pre-commit hook and adjusts type hints for stream objects in tdf.py. The update to the ruff pre-commit hook ID is a good maintenance change. The type hint change in create_tdf correctly aligns the function signature with its implementation, making the API safer. However, the change to the load_tdf function's signature is unnecessarily restrictive and could negatively affect performance when dealing with large files. I've provided a specific comment with a suggestion to improve this.
|
|
||
| def load_tdf( | ||
| self, tdf_data: bytes | BinaryIO, config: TDFReaderConfig | ||
| self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The type hint for tdf_data has been narrowed from bytes | BinaryIO to bytes | io.BytesIO. This is unnecessarily restrictive. The implementation uses zipfile.ZipFile, which can process any BinaryIO object, including file streams. This change would force users to load entire files into memory, which is inefficient for large TDFs. It's better to keep the more flexible bytes | BinaryIO type to allow direct processing from file streams. If this change was intended to fix a type checker warning, it would be preferable to keep the more flexible API and use a # type: ignore with an explanatory comment if needed.
| self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig | |
| self, tdf_data: bytes | BinaryIO, config: TDFReaderConfig |
0764c1c to
5fe1b11
Compare
5fe1b11 to
10fedad
Compare
1a5b088 to
3f83d5b
Compare
|
/gemini review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces several improvements. It enables import sorting via ruff, which has been applied across the codebase, leading to better code style consistency. The integration tests have been significantly refactored: they are now more robust by failing fast instead of skipping on setup errors, and new tests have been added to cover different TDF versions. The test suite has also been reorganized for better clarity. I've suggested a few places where tests could be further improved by reducing code duplication through parameterization and extracting helper functions.
| @pytest.mark.integration | ||
| def test_cli_decrypt_different_file_types_v4_2_2( | ||
| tdf_v4_2_2_files, temp_credentials_file | ||
| ): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test, test_cli_decrypt_different_file_types_v4_2_2, is nearly identical to test_cli_decrypt_different_file_types_v4_3_1. To improve maintainability and reduce code duplication, consider combining them into a single parameterized test using pytest.mark.parametrize. This would allow you to run the same test logic against different TDF versions with minimal repeated code.
For example:
@pytest.mark.integration
@pytest.mark.parametrize(
"tdf_files_fixture",
[
pytest.param("tdf_v4_3_1_files", id="v4.3.1"),
pytest.param("tdf_v4_2_2_files", id="v4.2.2"),
],
)
def test_cli_decrypt_different_file_types(
tdf_files_fixture, temp_credentials_file, request
):
"""
Test CLI decrypt with different file types for different TDF versions.
"""
tdf_files = request.getfixturevalue(tdf_files_fixture)
# ... rest of the test logic| @pytest.mark.integration | ||
| def test_cli_inspect_different_file_types(tdf_v4_3_1_files, temp_credentials_file): | ||
| def test_cli_inspect_different_file_types_v4_2_2( | ||
| tdf_v4_2_2_files, temp_credentials_file | ||
| ): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test is very similar to test_cli_inspect_different_file_types_v4_3_1. You could refactor them into a single parameterized test using pytest.mark.parametrize to avoid code duplication. This would make the tests easier to maintain.
Example:
@pytest.mark.integration
@pytest.mark.parametrize(
"tdf_files_fixture",
[
pytest.param("tdf_v4_2_2_files", id="v4.2.2"),
pytest.param("tdf_v4_3_1_files", id="v4.3.1"),
],
)
def test_cli_inspect_different_file_types(
tdf_files_fixture, temp_credentials_file, request
):
"""
Test CLI inspect with different file types for different TDF versions.
"""
tdf_files = request.getfixturevalue(tdf_files_fixture)
# ... (rest of the test logic)| env=original_env, | ||
| ) | ||
|
|
||
| # If otdfctl encrypt fails, skip the test (might be server issues) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test function and others in this file are quite long and contain a lot of boilerplate for running subprocess commands. To improve readability and maintainability, consider extracting the logic for running otdfctl and the Python CLI into helper functions, similar to the _run_cli_decrypt and _run_cli_inspect helpers in the new test files. This would make the test logic more focused and easier to follow.
808727c to
d3d1eb4
Compare
|
/gemini review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces a range of valuable improvements, primarily focusing on code style consistency and enhancing the test suite. The adoption of isort via ruff has standardized import ordering across the project, which is a great step for maintainability. The test suite has been significantly refactored with better organization, and the addition of tests against different TDF versions (--target-mode) improves compatibility validation. The error handling in integration tests has also been made more robust by failing fast instead of skipping tests. My review includes a few suggestions to improve type hint accuracy for better API flexibility and to reduce code duplication in the new tests.
| payload: bytes | BinaryIO, | ||
| config: TDFConfig, | ||
| output_stream: BinaryIO | None = None, | ||
| output_stream: io.BytesIO | None = None, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The type hint for output_stream has been changed from BinaryIO to io.BytesIO. This is overly restrictive and prevents passing other file-like objects, such as those returned by open('file.tdf', 'wb'). To maintain flexibility and support writing directly to files, it's better to use the more general typing.BinaryIO type hint.
| output_stream: io.BytesIO | None = None, | |
| output_stream: BinaryIO | None = None, |
| def load_tdf( | ||
| self, tdf_data: bytes | BinaryIO, config: TDFReaderConfig | ||
| self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig | ||
| ) -> TDFReader: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The type hint for tdf_data has been changed from BinaryIO to io.BytesIO. This is too restrictive as it prevents passing other binary file-like objects (e.g., from open()). The implementation correctly handles any BinaryIO object, so the type hint should reflect that by using the more general typing.BinaryIO.
| self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig | |
| self, tdf_data: bytes | BinaryIO, config: TDFReaderConfig |
| @pytest.mark.integration | ||
| def test_cli_decrypt_different_file_types_v4_3_1( | ||
| tdf_v4_3_1_files, temp_credentials_file | ||
| ): | ||
| """ | ||
| Test CLI decrypt with different file types. | ||
| """ | ||
|
|
||
| file_types_to_test = [ | ||
| "text", | ||
| "binary", | ||
| "with_attributes", | ||
| ] # TODO: Consider adding "empty" file type as well | ||
|
|
||
| for file_type in file_types_to_test: | ||
| tdf_path = tdf_v4_3_1_files[file_type] | ||
|
|
||
| # Decrypt the TDF | ||
| output_file = _run_cli_decrypt(tdf_path, temp_credentials_file) | ||
|
|
||
| assert output_file is not None, f"Failed to decrypt {file_type} TDF" | ||
| assert output_file.exists(), f"{file_type} TDF decrypt output file not created" | ||
|
|
||
| # Check file-type specific expectations | ||
| if file_type == "empty": | ||
| # Empty files should produce empty output files | ||
| assert output_file.stat().st_size == 0, ( | ||
| f"{file_type} TDF should produce empty output" | ||
| ) | ||
| else: | ||
| # Non-empty files should produce non-empty output | ||
| assert output_file.stat().st_size > 0, ( | ||
| f"{file_type} TDF produced empty decrypt output" | ||
| ) | ||
|
|
||
| # For attributed files, just ensure they decrypt successfully | ||
| if file_type == "with_attributes": | ||
| logger.info( | ||
| f"Successfully decrypted attributed TDF, output size: {output_file.stat().st_size}" | ||
| ) | ||
|
|
||
| # For text files, verify the content is readable | ||
| if file_type == "text": | ||
| try: | ||
| content = output_file.read_text() | ||
| assert len(content) > 0, "Text file should have readable content" | ||
| logger.info(f"Text content preview: {content[:100]}...") | ||
| except UnicodeDecodeError: | ||
| pytest.fail(f"Decrypted {file_type} file should be valid text") | ||
|
|
||
| # Clean up output file | ||
| output_file.unlink() | ||
|
|
||
|
|
||
| def _run_cli_decrypt(tdf_path: Path, creds_file: Path) -> Path | None: | ||
| """ | ||
| Helper function to run Python CLI decrypt command and return the output file path. | ||
| Returns the Path to the decrypted output file if successful, None if failed. | ||
| """ | ||
| # Determine platform flags | ||
| platform_url = CONFIG_TDF.OPENTDF_PLATFORM_URL | ||
| cli_flags = get_cli_flags() | ||
|
|
||
| # Create a temporary output file | ||
| with tempfile.NamedTemporaryFile(delete=False, suffix=".decrypted") as temp_file: | ||
| output_path = Path(temp_file.name) | ||
|
|
||
| try: | ||
| # Build CLI command | ||
| cmd = [ | ||
| sys.executable, | ||
| "-m", | ||
| "otdf_python.cli", | ||
| "--platform-url", | ||
| platform_url, | ||
| "--with-client-creds-file", | ||
| str(creds_file), | ||
| *cli_flags, | ||
| "decrypt", | ||
| str(tdf_path), | ||
| "-o", | ||
| str(output_path), | ||
| ] | ||
|
|
||
| # Run the CLI command | ||
| result = subprocess.run( | ||
| cmd, | ||
| capture_output=True, | ||
| text=True, | ||
| check=True, | ||
| cwd=Path(__file__).parent.parent.parent, # Project root | ||
| ) | ||
|
|
||
| logger.debug(f"CLI decrypt succeeded for {tdf_path}") | ||
| if result.stdout: | ||
| logger.debug(f"CLI stdout: {result.stdout}") | ||
|
|
||
| return output_path | ||
|
|
||
| except subprocess.CalledProcessError as e: | ||
| logger.error(f"CLI decrypt failed for {tdf_path}: {e}") | ||
| logger.error(f"CLI stderr: {e.stderr}") | ||
| logger.error(f"CLI stdout: {e.stdout}") | ||
|
|
||
| # Clean up the output file if it was created but command failed | ||
| if output_path.exists(): | ||
| output_path.unlink() | ||
|
|
||
| raise Exception(f"Failed to decrypt TDF {tdf_path}: {e}") from e | ||
|
|
||
|
|
||
| @pytest.mark.integration | ||
| def test_cli_decrypt_different_file_types_v4_2_2( | ||
| tdf_v4_2_2_files, temp_credentials_file | ||
| ): | ||
| """ | ||
| Test CLI decrypt with different file types. | ||
| """ | ||
|
|
||
| file_types_to_test = [ | ||
| "text", | ||
| "binary", | ||
| "with_attributes", | ||
| ] # TODO: Consider adding "empty" file type as well | ||
|
|
||
| for file_type in file_types_to_test: | ||
| tdf_path = tdf_v4_2_2_files[file_type] | ||
|
|
||
| # Decrypt the TDF | ||
| output_file = _run_cli_decrypt(tdf_path, temp_credentials_file) | ||
|
|
||
| assert output_file is not None, f"Failed to decrypt {file_type} TDF" | ||
| assert output_file.exists(), f"{file_type} TDF decrypt output file not created" | ||
|
|
||
| # Check file-type specific expectations | ||
| if file_type == "empty": | ||
| # Empty files should produce empty output files | ||
| assert output_file.stat().st_size == 0, ( | ||
| f"{file_type} TDF should produce empty output" | ||
| ) | ||
| else: | ||
| # Non-empty files should produce non-empty output | ||
| assert output_file.stat().st_size > 0, ( | ||
| f"{file_type} TDF produced empty decrypt output" | ||
| ) | ||
|
|
||
| # For attributed files, just ensure they decrypt successfully | ||
| if file_type == "with_attributes": | ||
| logger.info( | ||
| f"Successfully decrypted attributed TDF, output size: {output_file.stat().st_size}" | ||
| ) | ||
|
|
||
| # For text files, verify the content is readable | ||
| if file_type == "text": | ||
| try: | ||
| content = output_file.read_text() | ||
| assert len(content) > 0, "Text file should have readable content" | ||
| logger.info(f"Text content preview: {content[:100]}...") | ||
| except UnicodeDecodeError: | ||
| pytest.fail(f"Decrypted {file_type} file should be valid text") | ||
|
|
||
| # Clean up output file | ||
| output_file.unlink() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The test functions test_cli_decrypt_different_file_types_v4_3_1 and test_cli_decrypt_different_file_types_v4_2_2 are nearly identical. To improve maintainability and reduce code duplication, they can be combined into a single test function parameterized with the TDF version.
For example:
@pytest.mark.integration
@pytest.mark.parametrize(
"tdf_files_fixture",
[
"tdf_v4_3_1_files",
"tdf_v4_2_2_files",
],
)
def test_cli_decrypt_different_file_types(
tdf_files_fixture, temp_credentials_file, request
):
tdf_files = request.getfixturevalue(tdf_files_fixture)
# ... rest of the test logic ...|
/gemini review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces a number of positive changes, primarily focused on improving code style by enabling and applying isort rules via ruff. This has resulted in standardized import ordering across the codebase, which is a great enhancement for maintainability. Additionally, the integration testing suite has been significantly improved with new tests for CLI decryption, restructuring of existing tests, and making them more robust for CI environments by replacing pytest.skip with explicit failures. My review identified a couple of areas for improvement in src/otdf_python/tdf.py where type hints have become overly restrictive, potentially limiting the flexibility of the API. Overall, this is a solid pull request that improves code quality and test coverage.
| payload: bytes | BinaryIO, | ||
| config: TDFConfig, | ||
| output_stream: BinaryIO | None = None, | ||
| output_stream: io.BytesIO | None = None, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The type hint for output_stream has been changed from BinaryIO to io.BytesIO. While TDFWriter currently expects io.BytesIO, this change makes the public API of create_tdf more restrictive. Users may want to stream the output directly to a file on disk (e.g., open('file.tdf', 'wb')), which provides a BinaryIO object. To maintain flexibility, it would be better to use the more general BinaryIO type hint here and adjust TDFWriter if necessary.
| output_stream: io.BytesIO | None = None, | |
| output_stream: BinaryIO | None = None, |
| def load_tdf( | ||
| self, tdf_data: bytes | BinaryIO, config: TDFReaderConfig | ||
| self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig | ||
| ) -> TDFReader: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The type hint for tdf_data has been narrowed from bytes | BinaryIO to bytes | io.BytesIO. This reduces the flexibility of the load_tdf method. The implementation uses zipfile.ZipFile, which works with any file-like object supporting binary I/O. Users should be able to pass a file handle from open('file.tdf', 'rb'), which is a BinaryIO. Reverting to BinaryIO would make the API more versatile.
| self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig | |
| self, tdf_data: bytes | BinaryIO, config: TDFReaderConfig |
* chore: update pre-commit * fix: type annotations in tdf.py * chore: expand inspect tests * chore: cleanup tests * chore: organize imports * chore: require sorted imports * chore: add test_cli_decrypt.py * chore: organize integration tests * chore: organize integration tests * Tweak attributes * chore: cleanup tests * chore: cleanup tests
* fix: add test data * fix: improve target-version support * fix: add get_cli_flags function * fix: fix tests * fix: bug handling bytes | BinaryIO & tests * fix: update .gitignore * fix: remove invalid default KAS * fix: disable attrs for now * fix: DRY test fixtures * chore: cleanup * fix:target mode encryption (#86) * chore: update pre-commit * fix: type annotations in tdf.py * chore: expand inspect tests * chore: cleanup tests * chore: organize imports * chore: require sorted imports * chore: add test_cli_decrypt.py * chore: organize integration tests * chore: organize integration tests * Tweak attributes * chore: cleanup tests * chore: cleanup tests * chore: dry tests (#87) * chore: dry tests * chore: relocate run_cli_inspect * chore: fix type annotation * chore: note token isn't important * chore: cleanup args & typing * chore: extract 'get_platform_url' function * chore: extract 'support_otdfctl_args' module * chore: use '*get_cli_flags()' pattern * chore: DRY code * chore: DRY code * chore: extract 'get_testing_environ' function * chore: DRY code * chore: DRY code * chore: DRY code * chore: improve pre-commit config * fix: mirrored workflows for target-mode (#91) * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: remove otdf-python-proto from manifest
* Begin rewrite in pure Python * Organize: git mv src/otdf_python/test_*.py tests/ * Format according to 'ruff' * Fix static analysis * Cleanup and organize tests/test_validate_otdf_python.py * Remove 'TDFConfig' type from 'otdf_python.tdf' * Fix description & formatting * Add 'pydantic-settings' to dev & update dependencies * Correct version number * Cleanup and fix OIDC tests * Comment old style integration test * Execute majority of tests * Allow import from 'tests' * Fix string encryption test * Remove dead code * Adjust integration test * Remove old build scripts * Update README * Update GHA triggers * Fix endpoint URL and TLS verification * ✅ Significant update 143 out of 150 tests passing - When run with the proper .env file: 7 failed, 142 passed, 2 skipped, 1 warning - Critical naming fix - Update .proto files - Add script to update .proto files - Ditch HTTP impl - Improve manifest and encrypt test - Python CLI decrypt now works correctly with TDF files created by otdfctl * Run all tests, except integration * Update GHA configuration * Mark integration tests * Fix mocked tests/test_kas_client.py * Mark integration tests * Only build for 3.13 (temporary) * Update license * Enable and fix integration tests in CI Cleanup tests * Improve support for plaintext * Make log collection optional * Fix tests for plaintext * Fix docstrings * Fix docstrings * Extract Connect RPC class * Fix additional roundtrip testing * Fix tests after kas_client updates * Expand KAS client integration tests * Fix mimeType * Expand testing, fix compression bug * Auto-use check_for_otdfctl fixture * Expand static analysis, fix FURB188 * Use 'NULL_POLICY_UUID' for now * Update kas_client.py & tdf.py, expand tests * Expand & organize integration tests * Expand static analysis, fix PT018 * Use configurable attrs in testing * Use configurable attrs in testing * Examine entitlements in CI * Extract 'temp_credentials_file' fixture * Rename file * Modernize release workflows * Modernize release workflows * Update release workflow * Manage 'otdf-python-proto' as a sub-package * Update README * Manage 'otdf-python-proto' as a sub-package * Support Python 3.10+ * Fix version number * Fix Python version requirement * Bump version 0.3.0a4 -> 0.3.0a5 * Fix version extract command * Undo file name change * More support for PE flows, cleanup & improved typing (#70) * Cleanup & improved typing * Disable odd policy enforcement * Add ".env-docker" file for local testing * Add PE test support (GHA and docker) (#71) * Add docker start script * Gemini fixes * Update GHA configuration * Gemini fixes * Enable PE e2e test * Run 'pre-commit autoupdate' & fix lint issues * Extract '_get_sdk_builder' function * Cleanup & remove redundant function * Improve typing * Use patch() context manager, reduce imports * Remove unnecessary import * Combine 'yq' expressions * Point to commit SHA * Remove hallucination * Match version number * Bump 0.3.0a5 to 0.3.0a6 * Chore/update docs and release process (#72) * Cleanup docs * Refine workflows for release management and testing - Implement `release-please` workflow for automated releases. - Create `publish-test` and `publish` workflows to handle package builds and releases. - Introduce `test-suite` workflow to run tests before publishing. - Update configuration files for release management. * Add 'ruff' as dev dependency * Configure ruff to ignore generated files * Fail fast if linting fails * Document release process * Bump version to 0.3.0a7 * Publish new alpha * Allow replacing artifacts with the same name * Remove the duplicate integration-test job * Attempt alpha release * chore: improve pre-commit configuration * chore: revert 'rm CONNECT_RPC_MIGRATION.md' * chore: disable TestPyPIBuild unless workflow_dispatch * chore: bump version 0.3.0a7 -> 0.3.0a8 * chore: bump version 0.3.0a8 -> 0.3.0a9 * chore: target this branch * chore: target develop branch * chore: fix release-please config * chore: fix version number * chore: use standard 'workflow_call' * chore: clean up publishing * fix: fix publishing * chore: release 0.3.0a10 Release-As: 0.3.0a10 * fix: fix publishing * chore: release 0.3.0a11 Release-As: 0.3.0a11 * chore: release develop (#81) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * chore: align version numbers * chore: add 'otdf-python-proto/uv.lock' file * chore: add 'otdf-python-proto/uv.lock' file * fix: omit README from Github releases * chore: document legacy version * fix: address pre-commit (lint) issues * chore: verbose output for pypi uploads * fix: use correct 'extra-files' for uv.lock See also: googleapis/release-please#2561 * chore: release 0.3.1 Release-As: 0.3.1 * chore: release develop (#82) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * chore: organize docs * fix: remove unnecessary 'ncipollo/release-action' * chore: add developer doc * chore: CI improvements (#88) * chore: prevent TestPyPI publishing <= 0.3.2 * chore: update .pre-commit-config.yaml * chore: align versions * chore: ensure future version alignment * chore: comment unused GHA step * chore: simplify version parsing * chore: add tomli for Python < 3.11 * fix: get version dynamically in 'test_cli.py' * fix: guarantee target-version decrypt support (#84) * fix: add test data * fix: improve target-version support * fix: add get_cli_flags function * fix: fix tests * fix: bug handling bytes | BinaryIO & tests * fix: update .gitignore * fix: remove invalid default KAS * fix: disable attrs for now * fix: DRY test fixtures * chore: cleanup * fix:target mode encryption (#86) * chore: update pre-commit * fix: type annotations in tdf.py * chore: expand inspect tests * chore: cleanup tests * chore: organize imports * chore: require sorted imports * chore: add test_cli_decrypt.py * chore: organize integration tests * chore: organize integration tests * Tweak attributes * chore: cleanup tests * chore: cleanup tests * chore: dry tests (#87) * chore: dry tests * chore: relocate run_cli_inspect * chore: fix type annotation * chore: note token isn't important * chore: cleanup args & typing * chore: extract 'get_platform_url' function * chore: extract 'support_otdfctl_args' module * chore: use '*get_cli_flags()' pattern * chore: DRY code * chore: DRY code * chore: extract 'get_testing_environ' function * chore: DRY code * chore: DRY code * chore: DRY code * chore: improve pre-commit config * fix: mirrored workflows for target-mode (#91) * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: cleanup for mirrored workflows * chore: remove otdf-python-proto from manifest * chore: cleanup and release (#93) * fix: don't inspect without auth * fix: process otdf-python-proto/pyproject.toml correctly * chore: remove NanoTDF from README * chore: mention legacy version in main README * chore: set version to 0.3.1 * chore: fix release-please * fix: release-please configuration (#95) * fix: "jsonpath" in release-please-config.json * chore: remove invalid changelog entries * chore: cleanup branches used in release-please * chore: remove invalid changelog file * chore: reset version to 0.3.0 * chore: cleanup whitespace * chore: improve release process * chore: document release process * chore: delete invalid information * fix: update prerelease config for develop branch * chore(develop): release otdf-python 0.3.1 (#96) * chore(develop): release otdf-python 0.3.1 * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: b-long <[email protected]> * fix: fix .release-please-config.json file (#97) * fix: fix .release-please-config.json file * chore: align for version 0.3.1 * chore: use importlib for version * chore: manage .py files without relese-please * fix: allow for development version in CLI version test * Update src/otdf_python/cli.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * chore(develop): release otdf-python 0.3.2 (#98) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix: release configuration (#99) * chore: fix release-please config * chore: remove invalid changelog entries * chore: roll back to 0.3.0 * fix: add develop-specific release-please files and update workflow - Add .release-please-config-develop.json with prerelease: true - Add .release-please-manifest-develop.json with current version - Remove dynamic file creation from workflow - Files are now committed to repo instead of generated at runtime * chore(develop): release otdf-python 0.3.1 (#100) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
No description provided.