From 4a2b8e5ea48ef70988917a61e1943c33cbdd0b67 Mon Sep 17 00:00:00 2001 From: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Date: Fri, 5 Jul 2024 10:11:50 +0100 Subject: [PATCH 1/9] ci(datasets): pin `accelerate` (#751) pin accelerate Signed-off-by: Ankita Katiyar --- kedro-datasets/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/kedro-datasets/pyproject.toml b/kedro-datasets/pyproject.toml index d9eede037..b4507af2c 100644 --- a/kedro-datasets/pyproject.toml +++ b/kedro-datasets/pyproject.toml @@ -179,6 +179,7 @@ docs = [ # Test requirements test = [ + "accelerate<0.32", # Temporary pin "adlfs~=2023.1", "bandit>=1.6.2, <2.0", "behave==1.2.6", From e04b1ce6b9b3b258bbb5b285d2e194f5490cc4e5 Mon Sep 17 00:00:00 2001 From: ElenaKhaustova <157851531+ElenaKhaustova@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:17:42 +0100 Subject: [PATCH 2/9] feat(telemetry): Remove consent confirmation prompt for `kedro-telemetry` (#744) * Removed consent confirmation Signed-off-by: Elena Khaustova * Updated tests Signed-off-by: Elena Khaustova * Fixed ruff Signed-off-by: Elena Khaustova * Fixed docstring Signed-off-by: Elena Khaustova * Removed debug output Signed-off-by: Elena Khaustova * Dummy commit Signed-off-by: Elena Khaustova * Dummy commit Signed-off-by: Elena Khaustova * Updated huggingface-hub version Signed-off-by: Elena Khaustova * Updated huggingface-hub version Signed-off-by: Elena Khaustova * CI fix Signed-off-by: Elena Khaustova --------- Signed-off-by: Elena Khaustova --- kedro-telemetry/kedro_telemetry/plugin.py | 48 +++++------------------ kedro-telemetry/tests/test_plugin.py | 45 ++------------------- 2 files changed, 13 insertions(+), 80 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index f0b2485ee..c903411fd 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -13,7 +13,6 @@ from pathlib import Path from typing import Any -import click import requests import toml import yaml @@ -347,14 +346,17 @@ def _send_heap_event( def _check_for_telemetry_consent(project_path: Path) -> bool: + """ + Use telemetry consent from ".telemetry" file if it exists and has a valid format. + Telemetry is considered as opt-in otherwise. + """ telemetry_file_path = project_path / ".telemetry" - if not telemetry_file_path.exists(): - return _confirm_consent(telemetry_file_path) - with open(telemetry_file_path, encoding="utf-8") as telemetry_file: - telemetry = yaml.safe_load(telemetry_file) - if _is_valid_syntax(telemetry): - return telemetry["consent"] - return _confirm_consent(telemetry_file_path) + if telemetry_file_path.exists(): + with open(telemetry_file_path, encoding="utf-8") as telemetry_file: + telemetry = yaml.safe_load(telemetry_file) + if _is_valid_syntax(telemetry): + return telemetry["consent"] + return True def _is_valid_syntax(telemetry: Any) -> bool: @@ -363,35 +365,5 @@ def _is_valid_syntax(telemetry: Any) -> bool: ) -def _confirm_consent(telemetry_file_path: Path) -> bool: - try: - with telemetry_file_path.open("w") as telemetry_file: - confirm_msg = ( - "As an open-source project, we collect usage analytics. \n" - "We cannot see nor store information contained in " - "a Kedro project. \nYou can find out more by reading our " - "privacy notice: \n" - "https://github.com/kedro-org/kedro-plugins/tree/main/kedro-telemetry#" - "privacy-notice \n" - "Do you opt into usage analytics? " - ) - if click.confirm(confirm_msg): - yaml.dump({"consent": True}, telemetry_file) - click.secho("You have opted into product usage analytics.", fg="green") - return True - click.secho( - "You have opted out of product usage analytics, so none will be collected.", - fg="green", - ) - yaml.dump({"consent": False}, telemetry_file) - return False - except Exception as exc: - logger.warning( - "Failed to confirm consent. No data was sent to Heap. Exception: %s", - exc, - ) - return False - - cli_hooks = KedroTelemetryCLIHooks() project_hooks = KedroTelemetryProjectHooks() diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index 7348d63f4..f43718b70 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -17,7 +17,6 @@ KedroTelemetryCLIHooks, KedroTelemetryProjectHooks, _check_for_telemetry_consent, - _confirm_consent, _is_known_ci_env, ) @@ -371,8 +370,6 @@ def test_check_for_telemetry_consent_given(self, mocker, fake_metadata): with open(telemetry_file_path, "w", encoding="utf-8") as telemetry_file: yaml.dump({"consent": True}, telemetry_file) - mock_create_file = mocker.patch("kedro_telemetry.plugin._confirm_consent") - mock_create_file.assert_not_called() assert _check_for_telemetry_consent(fake_metadata.project_path) def test_check_for_telemetry_consent_not_given(self, mocker, fake_metadata): @@ -381,29 +378,16 @@ def test_check_for_telemetry_consent_not_given(self, mocker, fake_metadata): with open(telemetry_file_path, "w", encoding="utf-8") as telemetry_file: yaml.dump({"consent": False}, telemetry_file) - mock_create_file = mocker.patch("kedro_telemetry.plugin._confirm_consent") - mock_create_file.assert_not_called() assert not _check_for_telemetry_consent(fake_metadata.project_path) def test_check_for_telemetry_consent_empty_file(self, mocker, fake_metadata): Path(fake_metadata.project_path, "conf").mkdir(parents=True) telemetry_file_path = fake_metadata.project_path / ".telemetry" - mock_create_file = mocker.patch( - "kedro_telemetry.plugin._confirm_consent", return_value=True - ) - - assert _check_for_telemetry_consent(fake_metadata.project_path) - mock_create_file.assert_called_once_with(telemetry_file_path) - def test_check_for_telemetry_no_consent_empty_file(self, mocker, fake_metadata): - Path(fake_metadata.project_path, "conf").mkdir(parents=True) - telemetry_file_path = fake_metadata.project_path / ".telemetry" - mock_create_file = mocker.patch( - "kedro_telemetry.plugin._confirm_consent", return_value=False - ) + with open(telemetry_file_path, "w", encoding="utf-8") as telemetry_file: + yaml.dump({}, telemetry_file) - assert not _check_for_telemetry_consent(fake_metadata.project_path) - mock_create_file.assert_called_once_with(telemetry_file_path) + assert _check_for_telemetry_consent(fake_metadata.project_path) def test_check_for_telemetry_consent_file_no_consent_field( self, mocker, fake_metadata @@ -413,37 +397,14 @@ def test_check_for_telemetry_consent_file_no_consent_field( with open(telemetry_file_path, "w", encoding="utf8") as telemetry_file: yaml.dump({"nonsense": "bla"}, telemetry_file) - mock_create_file = mocker.patch( - "kedro_telemetry.plugin._confirm_consent", return_value=True - ) - assert _check_for_telemetry_consent(fake_metadata.project_path) - mock_create_file.assert_called_once_with(telemetry_file_path) def test_check_for_telemetry_consent_file_invalid_yaml(self, mocker, fake_metadata): Path(fake_metadata.project_path, "conf").mkdir(parents=True) telemetry_file_path = fake_metadata.project_path / ".telemetry" telemetry_file_path.write_text("invalid_ yaml") - mock_create_file = mocker.patch( - "kedro_telemetry.plugin._confirm_consent", return_value=True - ) - assert _check_for_telemetry_consent(fake_metadata.project_path) - mock_create_file.assert_called_once_with(telemetry_file_path) - - def test_confirm_consent_yaml_dump_error(self, mocker, fake_metadata, caplog): - Path(fake_metadata.project_path, "conf").mkdir(parents=True) - telemetry_file_path = fake_metadata.project_path / ".telemetry" - mocker.patch("yaml.dump", side_efyfect=Exception) - - assert not _confirm_consent(telemetry_file_path) - - msg = ( - "Failed to confirm consent. No data was sent to Heap. Exception: " - "pytest: reading from stdin while output is captured! Consider using `-s`." - ) - assert msg in caplog.messages[-1] @mark.parametrize( "env_vars,result", From 5ab51af2ae17d7fdd9ef936b6a000ff90ab7f340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6lles?= Date: Fri, 5 Jul 2024 13:14:11 +0200 Subject: [PATCH 3/9] feat(datasets): Add rioxarray and RasterDataset (#355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(datasets): deprecate "DataSet" type names (#328) * refactor(datasets): deprecate "DataSet" type names (api) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (biosequence) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (dask) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (databricks) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (email) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (geopandas) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (holoviews) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (json) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (matplotlib) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (networkx) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.csv_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.deltatable_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.excel_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.feather_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.gbq_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.generic_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.hdf_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.json_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.parquet_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.sql_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pandas.xml_dataset) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pickle) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (pillow) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (plotly) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (polars) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (redis) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (snowflake) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (spark) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (svmlight) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (tensorflow) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (text) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (tracking) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (video) Signed-off-by: Deepyaman Datta * refactor(datasets): deprecate "DataSet" type names (yaml) Signed-off-by: Deepyaman Datta * chore(datasets): ignore TensorFlow coverage issues Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * added basic code for geotiff Signed-off-by: tgoelles * renamed to xarray Signed-off-by: tgoelles * renamed to xarray Signed-off-by: tgoelles * added load and self args Signed-off-by: tgoelles * only local files Signed-off-by: tgoelles * added empty test Signed-off-by: tgoelles * added test data Signed-off-by: tgoelles * added rioxarray requirements Signed-off-by: tgoelles * reformat with black Signed-off-by: tgoelles * rioxarray 0.14 Signed-off-by: tgoelles * rioxarray 0.15 Signed-off-by: tgoelles * rioxarray 0.12 Signed-off-by: tgoelles * rioxarray 0.9 Signed-off-by: tgoelles * fixed dataset typo Signed-off-by: tgoelles * fixed docstring for sphinx Signed-off-by: tgoelles * run black Signed-off-by: tgoelles * sort imports Signed-off-by: tgoelles * class docstring Signed-off-by: tgoelles * black Signed-off-by: tgoelles * fixed pylint Signed-off-by: tgoelles * added release notes Signed-off-by: tgoelles * added yaml example Signed-off-by: tgoelles * improve testing WIP Signed-off-by: tgoelles * basic test success Signed-off-by: tgoelles * test reloaded Signed-off-by: tgoelles * test exists Signed-off-by: tgoelles * added version Signed-off-by: tgoelles * basic test suite Signed-off-by: tgoelles * run black Signed-off-by: tgoelles * added example and test it Signed-off-by: tgoelles * deleted duplications Signed-off-by: tgoelles * fixed position of example Signed-off-by: tgoelles * black Signed-off-by: tgoelles * style: Introduce `ruff` for linting in all plugins. (#354) Signed-off-by: Merel Theisen * feat(datasets): create custom `DeprecationWarning` (#356) * feat(datasets): create custom `DeprecationWarning` Signed-off-by: Deepyaman Datta * feat(datasets): use the custom deprecation warning Signed-off-by: Deepyaman Datta * chore(datasets): show Kedro's deprecation warnings Signed-off-by: Deepyaman Datta * fix(datasets): remove unused imports in test files Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * docs(datasets): add note about DataSet deprecation (#357) Signed-off-by: tgoelles * test(datasets): skip `tensorflow` tests on Windows (#363) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * ci: Pin `tables` version (#370) * Pin tables version Signed-off-by: Ankita Katiyar * Also fix kedro-airflow Signed-off-by: Ankita Katiyar * Revert trying to fix airflow Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * build(datasets): Release `1.7.1` (#378) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * docs: Update CONTRIBUTING.md and add one for `kedro-datasets` (#379) Update CONTRIBUTING.md + add one for kedro-datasets Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * ci(datasets): Run tensorflow tests separately from other dataset tests (#377) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * feat: Kedro-Airflow convert all pipelines option (#335) * feat: kedro airflow convert --all option Signed-off-by: Simon Brugman * docs: release docs Signed-off-by: Simon Brugman --------- Signed-off-by: Simon Brugman Signed-off-by: tgoelles * docs(datasets): blacken code in rst literal blocks (#362) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * docs: cloudpickle is an interesting extension of the pickle functionality (#361) Signed-off-by: H. Felix Wittmann Signed-off-by: tgoelles * fix(datasets): Fix secret scan entropy error (#383) Fix secret scan entropy error Signed-off-by: Merel Theisen Signed-off-by: tgoelles * style: Rename mentions of `DataSet` to `Dataset` in `kedro-airflow` and `kedro-telemetry` (#384) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * feat(datasets): Migrated `PartitionedDataSet` and `IncrementalDataSet` from main repository to kedro-datasets (#253) Signed-off-by: Peter Bludau Co-authored-by: Merel Theisen * fix: backwards compatibility for `kedro-airflow` (#381) Signed-off-by: Simon Brugman Signed-off-by: tgoelles * added metadata Signed-off-by: tgoelles * after linting Signed-off-by: tgoelles * ignore ruff PLR0913 Signed-off-by: tgoelles * fix(datasets): Don't warn for SparkDataset on Databricks when using s3 (#341) Signed-off-by: Alistair McKelvie Signed-off-by: tgoelles * chore: Hot fix for RTD due to bad pip version (#396) fix RTD Signed-off-by: Nok Signed-off-by: tgoelles * chore: Pin pip version temporarily (#398) * Pin pip version temporarily Signed-off-by: Ankita Katiyar * Hive support failures Signed-off-by: Ankita Katiyar * Also pin pip on lint Signed-off-by: Ankita Katiyar * Temporary ignore databricks spark tests Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * perf(datasets): don't create connection until need (#281) * perf(datasets): delay `Engine` creation until need Signed-off-by: Deepyaman Datta * chore: don't check coverage in TYPE_CHECKING block Signed-off-by: Deepyaman Datta * perf(datasets): don't connect in `__init__` method Signed-off-by: Deepyaman Datta * test(datasets): fix tests to touch `create_engine` Signed-off-by: Deepyaman Datta * perf(datasets): don't connect in `__init__` method Signed-off-by: Deepyaman Datta * style(datasets): exec Ruff on sql_dataset.py :dog: Signed-off-by: Deepyaman Datta * Undo changes to `engines` values type (for Sphinx) Signed-off-by: Deepyaman Datta * Patch Sphinx build by removing `Engine` references * perf(datasets): don't connect in `__init__` method Signed-off-by: Deepyaman Datta * chore(datasets): don't require coverage for import * chore(datasets): del unused `TYPE_CHECKING` import * docs(datasets): document lazy connection in README * perf(datasets): remove create in `SQLQueryDataset` Signed-off-by: Deepyaman Datta * refactor(datasets): do not return the created conn Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta * chore: Drop Python 3.7 support for kedro-plugins (#392) * Remove references to Python 3.7 Signed-off-by: lrcouto * Revert kedro-dataset changes Signed-off-by: lrcouto * Revert kedro-dataset changes Signed-off-by: lrcouto * Add information to release docs Signed-off-by: lrcouto --------- Signed-off-by: lrcouto Signed-off-by: tgoelles * feat(datasets): support Polars lazy evaluation (#350) * feat(datasets) add PolarsDataset to support Polars's Lazy API Signed-off-by: Matthias Roels * Fix(datasets): rename PolarsDataSet to PolarsDataSet Add PolarsDataSet as an alias for PolarsDataset with deprecation warning. Signed-off-by: Matthias Roels * Fix(datasets): apply ruff linting rules Signed-off-by: Matthias Roels * Fix(datasets): Correct pattern matching when Raising exceptions Corrected PolarsDataSet to PolarsDataset in the pattern to match in test_load_missing_file Signed-off-by: Matthias Roels * fix(datasets): clean up PolarsDataset related code Remove reference to PolarsDataSet as this is not required for new dataset implementations. Signed-off-by: Matthias Roels * feat(datasets): Rename Polars Datasets to better describe their intent Signed-off-by: Matthias Roels * feat(datasets): clean up LazyPolarsDataset Signed-off-by: Matthias Roels * fix(datasets): increase test coverage for PolarsDataset classes Signed-off-by: Matthias Roels * docs(datasets): add renamed Polars datasets to docs Signed-off-by: Matthias Roels * docs(datasets): Add new polars datasets to release notes Signed-off-by: Matthias Roels * fix(datasets): load_args not properly passed to LazyPolarsDataset.load Signed-off-by: Matthias Roels * docs(datasets): fix spelling error in release notes Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Matthias Roels --------- Signed-off-by: Matthias Roels Signed-off-by: Matthias Roels Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Matthias Roels Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: tgoelles * build(datasets): Release `1.8.0` (#406) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * build(airflow): Release 0.7.0 (#407) * bump version Signed-off-by: Ankita Katiyar * Update release notes Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * build(telemetry): Release 0.3.0 (#408) Bump version Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * build(docker): Release 0.4.0 (#409) Bump version Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * style(airflow): blacken README.md of Kedro-Airflow (#418) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * fix(datasets): Fix missing jQuery (#414) Fix missing jQuery Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * fix(datasets): Fix Lazy Polars dataset to use the new-style base class (#413) * Fix Lazy Polars dataset to use the new-style base class Fix gh-412 Signed-off-by: Juan Luis Cano Rodríguez * Update release notes Signed-off-by: Ankita Katiyar * Revert "Update release notes" This reverts commit 92ceea6d8fa412abf3d8abd28a2f0a22353867ed. --------- Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Signed-off-by: Ankita Katiyar Co-authored-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Signed-off-by: tgoelles * chore(datasets): lazily load `partitions` classes (#411) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * docs(datasets): fix code blocks and `data_set` use (#417) * chore(datasets): lazily load `partitions` classes Signed-off-by: Deepyaman Datta * test(datasets): run doctests to check examples run Signed-off-by: Deepyaman Datta * test(datasets): keep running tests amidst failures Signed-off-by: Deepyaman Datta * docs(datasets): format ManagedTableDataset example Signed-off-by: Deepyaman Datta * chore(datasets): ignore breaking mods for doctests Signed-off-by: Deepyaman Datta * style(airflow): black code in Kedro-Airflow README Signed-off-by: Deepyaman Datta * docs(datasets): fix example syntax, and autoformat Signed-off-by: Deepyaman Datta * docs(datasets): remove `kedro.extras.datasets` ref Signed-off-by: Deepyaman Datta * docs(datasets): remove `>>> ` prefix for YAML code Signed-off-by: Deepyaman Datta * docs(datasets): remove `kedro.extras.datasets` ref Signed-off-by: Deepyaman Datta * docs(datasets): replace `data_set`s with `dataset`s Signed-off-by: Deepyaman Datta * chore(datasets): undo changes for running doctests Signed-off-by: Deepyaman Datta * revert(datasets): undo lazily load `partitions` classes Refs: 3fdc5a8efa034fa9a18b7683a942415915b42fb5 Signed-off-by: Deepyaman Datta * revert(airflow): undo black code in Kedro-Airflow README Refs: dc3476ea36bac98e2adcc0b52a11b0f90001e31d Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * fix: TF model load failure when model is saved as a TensorFlow Saved Model format (#410) * fixes TF model load failure when model is saved as a TensorFlow Saved Model format when a model is saved in the TensorFlow SavedModel format ("tf" default option in tf.save_model when using TF 2.x) via the catalog.xml file, the subsequent loading of that model for further use in a subsequent node fails. The issue is linked to the fact that the model files don't get copied into the temporary folder, presumably because the _fs.get function "thinks" that the provided path is a file and not a folder. Adding an terminating "/" to the path fixes the issue. Signed-off-by: Edouard59 <68538605+Edouard59@users.noreply.github.com> Signed-off-by: tgoelles * chore: Drop support for Python 3.7 on kedro-datasets (#419) * Drop support for Python 3.7 on kedro-datasets Signed-off-by: lrcouto * Remove redundant 3.8 markers Signed-off-by: lrcouto --------- Signed-off-by: lrcouto Signed-off-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> Signed-off-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Co-authored-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> * test(datasets): run doctests to check examples run (#416) * chore(datasets): lazily load `partitions` classes Signed-off-by: Deepyaman Datta * test(datasets): run doctests to check examples run Signed-off-by: Deepyaman Datta * test(datasets): keep running tests amidst failures Signed-off-by: Deepyaman Datta * docs(datasets): format ManagedTableDataset example Signed-off-by: Deepyaman Datta * chore(datasets): ignore breaking mods for doctests Signed-off-by: Deepyaman Datta * style(airflow): black code in Kedro-Airflow README Signed-off-by: Deepyaman Datta * docs(datasets): fix example syntax, and autoformat Signed-off-by: Deepyaman Datta * docs(datasets): remove `kedro.extras.datasets` ref Signed-off-by: Deepyaman Datta * docs(datasets): remove `>>> ` prefix for YAML code Signed-off-by: Deepyaman Datta * docs(datasets): remove `kedro.extras.datasets` ref Signed-off-by: Deepyaman Datta * docs(datasets): replace `data_set`s with `dataset`s Signed-off-by: Deepyaman Datta * refactor(datasets): run doctests separately Signed-off-by: Deepyaman Datta * separate dataset-doctests Signed-off-by: Nok * chore(datasets): ignore non-passing tests to make CI pass Signed-off-by: Deepyaman Datta * chore(datasets): fix comment location Signed-off-by: Deepyaman Datta * chore(datasets): fix .py.py Signed-off-by: Deepyaman Datta * chore(datasets): don't measure coverage on doctest run Signed-off-by: Deepyaman Datta * build(datasets): fix windows and snowflake stuff in Makefile Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: Nok Co-authored-by: Nok Signed-off-by: tgoelles * feat(datasets): Add support for `databricks-connect>=13.0` (#352) Signed-off-by: Miguel Rodriguez Gutierrez Signed-off-by: tgoelles * fix(telemetry): remove double execution by moving to after catalog created hook (#422) * remove double execution by moving to after catalog created hook Signed-off-by: Florian Roessler * update release notes Signed-off-by: Florian Roessler * fix tests Signed-off-by: Florian Roessler * remove unsued fixture Signed-off-by: Florian Roessler --------- Signed-off-by: Florian Roessler Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * docs: Add python version support policy to plugin `README.md`s (#425) * Add python version support policy to plugin readmes Signed-off-by: Merel Theisen * Temporarily pin connexion Signed-off-by: Merel Theisen --------- Signed-off-by: Merel Theisen Signed-off-by: tgoelles * docs(airflow): Use new docs link (#393) Use new docs link Signed-off-by: Juan Luis Cano Rodríguez Co-authored-by: Jo Stichbury Signed-off-by: tgoelles * style: Add shared CSS and meganav to datasets docs (#400) * Add shared CSS and meganav Signed-off-by: Jo Stichbury * Add end of file Signed-off-by: Jo Stichbury * Add new heap data source Signed-off-by: Jo Stichbury * adjust heap parameter Signed-off-by: Jo Stichbury * Remove nav_version next to Kedro logo in top left; add Kedro logo * Revise project name and author name Signed-off-by: Jo Stichbury * Use full kedro icon and type for logo * Add close btn to mobile nav Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> * Add css for mobile nav logo image Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> * Update close button for mobile nav Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> * Add open button to mobile nav Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> * Delete kedro-datasets/docs/source/kedro-horizontal-color-on-light.svg Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> * Update conf.py Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> * Update layout.html Add links to subprojects Signed-off-by: Jo Stichbury * Remove svg from docs -- not needed?? Signed-off-by: Jo Stichbury * linter error fix Signed-off-by: Jo Stichbury --------- Signed-off-by: Jo Stichbury Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> Co-authored-by: Tynan DeBold Co-authored-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> Signed-off-by: tgoelles * feat(datasets): Add Hugging Face datasets (#344) * Add HuggingFace datasets Co-authored-by: Danny Farah Co-authored-by: Kevin Koga Co-authored-by: Mate Scharnitzky Co-authored-by: Tomer Shor Co-authored-by: Pierre-Yves Mousset Co-authored-by: Bela Chupal Co-authored-by: Khangjrakpam Arjun Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: Juan Luis Cano Rodríguez * Apply suggestions from code review Signed-off-by: Juan Luis Cano Rodríguez Co-authored-by: Joel <35801847+datajoely@users.noreply.github.com> Co-authored-by: Nok Lam Chan * Typo Signed-off-by: Juan Luis Cano Rodríguez * Fix docstring Signed-off-by: Juan Luis Cano Rodríguez * Add docstring for HFTransformerPipelineDataset Signed-off-by: Juan Luis Cano Rodríguez * Use intersphinx for cross references in Hugging Face docstrings Signed-off-by: Juan Luis Cano Rodríguez * Add docstring for HFDataset Signed-off-by: Juan Luis Cano Rodríguez * Add missing test dependencies Signed-off-by: Juan Luis Cano Rodríguez * Add tests for huggingface datasets Signed-off-by: Juan Luis Cano Rodríguez * Fix HFDataset.save Signed-off-by: Juan Luis Cano Rodríguez * Add test for HFDataset.list_datasets Signed-off-by: Juan Luis Cano Rodríguez * Use new name Signed-off-by: Juan Luis Cano Rodríguez * Consolidate imports Signed-off-by: Juan Luis Cano Rodríguez --------- Signed-off-by: Juan Luis Cano Rodríguez Co-authored-by: Danny Farah Co-authored-by: Kevin Koga Co-authored-by: Mate Scharnitzky Co-authored-by: Tomer Shor Co-authored-by: Pierre-Yves Mousset Co-authored-by: Bela Chupal Co-authored-by: Khangjrakpam Arjun Co-authored-by: Joel <35801847+datajoely@users.noreply.github.com> Co-authored-by: Nok Lam Chan Signed-off-by: tgoelles * test(datasets): fix `dask.ParquetDataset` doctests (#439) * test(datasets): fix `dask.ParquetDataset` doctests Signed-off-by: Deepyaman Datta * test(datasets): use `tmp_path` fixture in doctests Signed-off-by: Deepyaman Datta * test(datasets): simplify by not passing the schema Signed-off-by: Deepyaman Datta * test(datasets): ignore conftest for doctests cover Signed-off-by: Deepyaman Datta * Create MANIFEST.in Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * refactor: Remove `DataSet` aliases and mentions (#440) Signed-off-by: Merel Theisen * chore(datasets): replace "Pyspark" with "PySpark" (#423) Consistently write "PySpark" rather than "Pyspark" Also, fix list formatting Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * test(datasets): make `api.APIDataset` doctests run (#448) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * chore(datasets): Fix `pandas.GenericDataset` doctest (#445) Fix pandas.GenericDataset doctest Signed-off-by: Merel Theisen Signed-off-by: tgoelles * feat(datasets): make datasets arguments keywords only (#358) * feat(datasets): make `APIDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `BioSequenceDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `ParquetDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `EmailMessageDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `GeoJSONDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `HoloviewsWriter.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `JSONDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `MatplotlibWriter.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `GMLDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `GraphMLDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make NetworkX `JSONDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `PickleDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `ImageDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make plotly `JSONDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `PlotlyDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make polars `CSVDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make polars `GenericDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make redis `PickleDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `SnowparkTableDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `SVMLightDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `TensorFlowModelDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `TextDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `YAMLDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `ManagedTableDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `VideoDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `CSVDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `DeltaTableDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `ExcelDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `FeatherDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `GBQTableDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `GenericDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make pandas `JSONDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make pandas `ParquerDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `SQLTableDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `XMLDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `HDFDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `DeltaTableDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `SparkDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `SparkHiveDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `SparkJDBCDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `SparkStreamingDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `IncrementalDataset.__init__` keyword only Signed-off-by: Felix Scherz * feat(datasets): make `LazyPolarsDataset.__init__` keyword only Signed-off-by: Felix Scherz * docs(datasets): update doctests for HoloviewsWriter Signed-off-by: Felix Scherz * Update release notes Signed-off-by: Merel Theisen --------- Signed-off-by: Felix Scherz Signed-off-by: Merel Theisen Co-authored-by: Felix Scherz Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Merel Theisen Signed-off-by: tgoelles * chore: Drop support for python 3.8 on kedro-datasets (#442) * Drop support for python 3.8 on kedro-datasets --------- Signed-off-by: Dmitry Sorokin Signed-off-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: tgoelles * test(datasets): add outputs to matplotlib doctests (#449) * test(datasets): add outputs to matplotlib doctests Signed-off-by: Deepyaman Datta * Update Makefile Signed-off-by: Deepyaman Datta * Reformat code example, line length is short enough * Update kedro-datasets/kedro_datasets/matplotlib/matplotlib_writer.py Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * chore(datasets): Fix more doctest issues (#451) Signed-off-by: Merel Theisen Co-authored-by: Deepyaman Datta Signed-off-by: tgoelles * test(datasets): fix failing doctests in Windows CI (#457) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * chore(datasets): fix accidental reference to NumPy (#450) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * chore(datasets): don't pollute dev env in doctests (#452) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * feat: Add tools to heap event (#430) * Add add-on data to heap event Signed-off-by: lrcouto * Move addons logic to _get_project_property Signed-off-by: Ankita Katiyar * Add condition for pyproject.toml Signed-off-by: Ankita Katiyar * Fix tests Signed-off-by: Ankita Katiyar * Fix tests Signed-off-by: Ankita Katiyar * add tools to mock Signed-off-by: lrcouto * lint Signed-off-by: lrcouto * Update tools test Signed-off-by: Ankita Katiyar * Add after_context_created tools test Signed-off-by: lrcouto * Update rename to tools Signed-off-by: Ankita Katiyar * Update kedro-telemetry/tests/test_plugin.py Co-authored-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> --------- Signed-off-by: lrcouto Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Ankita Katiyar Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Signed-off-by: tgoelles * ci(datasets): install deps in single `pip install` (#454) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * build(datasets): Bump s3fs (#463) * Use mocking for AWS responses Signed-off-by: Merel Theisen * Add change to release notes Signed-off-by: Merel Theisen * Update release notes Signed-off-by: Merel Theisen * Use pytest xfail instead of commenting out test Signed-off-by: Merel Theisen --------- Signed-off-by: Merel Theisen Signed-off-by: tgoelles * test(datasets): make SQL dataset examples runnable (#455) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * fix(datasets): correct pandas-gbq as py311 dependency (#460) * update pandas-gbq dependency declaration Signed-off-by: Onur Kuru * fix fmt Signed-off-by: Onur Kuru --------- Signed-off-by: Onur Kuru Co-authored-by: Ahdra Merali <90615669+AhdraMeraliQB@users.noreply.github.com> Signed-off-by: tgoelles * docs(datasets): Document `IncrementalDataset` (#468) Document IncrementalDataset Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * chore: Update datasets to be arguments keyword only (#466) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * chore: Clean up code for old dataset syntax compatibility (#465) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * chore: Update scikit-learn version (#469) Update scikit-learn version Signed-off-by: Nok Lam Chan Signed-off-by: tgoelles * feat(datasets): support versioning data partitions (#447) * feat(datasets): support versioning data partitions Signed-off-by: Deepyaman Datta * Remove unused import Signed-off-by: Deepyaman Datta * chore(datasets): use keyword arguments when needed Signed-off-by: Deepyaman Datta * Apply suggestions from code review Signed-off-by: Deepyaman Datta * Update kedro-datasets/kedro_datasets/partitions/partitioned_dataset.py Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * docs(datasets): Improve documentation index (#428) Rework documentation index Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * docs(datasets): update wrong docstring about `con` (#461) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * build(datasets): Release `2.0.0` (#472) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * ci(telemetry): Pin `PyYAML` (#474) Pin PyYaml Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * build(telemetry): Release 0.3.1 (#475) Signed-off-by: tgoelles * docs(datasets): Fix broken links in README (#477) Fix broken links in README Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * chore(datasets): replace more "data_set" instances (#476) Signed-off-by: Deepyaman Datta Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * chore(datasets): Fix doctests (#488) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * chore(datasets): Fix delta + incremental dataset docstrings (#489) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * chore(airflow): Post 0.19 cleanup (#478) * bump version Signed-off-by: Ankita Katiyar * Unbump version and clean test Signed-off-by: Ankita Katiyar * Update e2e tests Signed-off-by: Ankita Katiyar * Update e2e tests Signed-off-by: Ankita Katiyar * Update e2e tests Signed-off-by: Ankita Katiyar * Update e2e tests Signed-off-by: Ankita Katiyar * Split big test into smaller tests Signed-off-by: Ankita Katiyar * Update conftest Signed-off-by: Ankita Katiyar * Update conftest Signed-off-by: Ankita Katiyar * Fix coverage Signed-off-by: Ankita Katiyar * Try unpin airflow Signed-off-by: Ankita Katiyar * remove datacatalog step Signed-off-by: Ankita Katiyar * Change node Signed-off-by: Ankita Katiyar * update tasks test step Signed-off-by: Ankita Katiyar * Revert to older airflow and constraint pendulum Signed-off-by: Ankita Katiyar * Update template Signed-off-by: Ankita Katiyar * Update message in e2e step Signed-off-by: Ankita Katiyar * Final cleanup Signed-off-by: Ankita Katiyar * Update kedro-airflow/pyproject.toml Signed-off-by: Nok Lam Chan * Pin apache-airflow again Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: Nok Lam Chan Co-authored-by: Nok Lam Chan Signed-off-by: tgoelles * build(airflow): Release 0.8.0 (#491) Bump version Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * fix: telemetry metadata (#495) --------- Signed-off-by: Dmitry Sorokin Signed-off-by: tgoelles * fix: Update tests on kedro-docker for 0.5.0 release. (#496) * bump version to 0.5.0 Signed-off-by: lrcouto * bump version to 0.5.0 Signed-off-by: lrcouto * update e2e tests to use new starters Signed-off-by: lrcouto * Lint Signed-off-by: lrcouto * update e2e tests to use new starters Signed-off-by: lrcouto * fix test path for e2e tests Signed-off-by: lrcouto * fix requirements path on dockerfiles Signed-off-by: lrcouto * update tests to fit with current log format Signed-off-by: lrcouto * update tests to fit with current log format Signed-off-by: lrcouto * update tests to fit with current log format Signed-off-by: lrcouto * Remove redundant test Signed-off-by: lrcouto * Alter test for custom GID and UID Signed-off-by: lrcouto * Update release notes Signed-off-by: lrcouto * Revert version bump to put in in separate PR Signed-off-by: lrcouto --------- Signed-off-by: lrcouto Signed-off-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> Signed-off-by: tgoelles * build: Release kedro-docker 0.5.0 (#497) * bump version to 0.5.0 Signed-off-by: lrcouto * bump version to 0.5.0 Signed-off-by: lrcouto * update e2e tests to use new starters Signed-off-by: lrcouto * Lint Signed-off-by: lrcouto * update e2e tests to use new starters Signed-off-by: lrcouto * fix test path for e2e tests Signed-off-by: lrcouto * fix requirements path on dockerfiles Signed-off-by: lrcouto * update tests to fit with current log format Signed-off-by: lrcouto * update tests to fit with current log format Signed-off-by: lrcouto * update tests to fit with current log format Signed-off-by: lrcouto * Remove redundant test Signed-off-by: lrcouto * Alter test for custom GID and UID Signed-off-by: lrcouto * Update release notes Signed-off-by: lrcouto * Revert version bump to put in in separate PR Signed-off-by: lrcouto * Bump kedro-docker to 0.5.0 Signed-off-by: lrcouto * Add release notes Signed-off-by: lrcouto * Update kedro-docker/RELEASE.md Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> --------- Signed-off-by: lrcouto Signed-off-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: tgoelles * chore(datasets): Update partitioned dataset docstring (#502) Update partitioned dataset docstring Signed-off-by: Merel Theisen Signed-off-by: tgoelles * Fix GeotiffDataset import + casing Signed-off-by: Merel Theisen * Fix lint Signed-off-by: Merel Theisen Signed-off-by: tgoelles * fix(datasets): Relax pandas.HDFDataSet dependencies which are broken on Windows (#426) * Relax pandas.HDFDataSet dependencies which are broken on Window (#402) Signed-off-by: Yolan Honoré-Rougé * Update RELEASE.md Signed-off-by: Yolan Honoré-Rougé * Apply suggestions from code review Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> * Update kedro-datasets/setup.py Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> --------- Signed-off-by: Yolan Honoré-Rougé Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: tgoelles * fix: airflow metadata (#498) * Add example pipeline entry to metadata declaration Signed-off-by: Ahdra Merali * Fix entry Signed-off-by: Ahdra Merali * Make entries consistent Signed-off-by: Ahdra Merali * Add tools to config Signed-off-by: Ahdra Merali * fix: telemetry metadata (#495) --------- Signed-off-by: Dmitry Sorokin Signed-off-by: Ahdra Merali * Revert "Add tools to config" This reverts commit 14732d772a3c2f4787063071a68fdf1512c93488. Signed-off-by: Ahdra Merali * Quick fix Signed-off-by: Ahdra Merali * Lint Signed-off-by: Ahdra Merali * Remove outdated config key Signed-off-by: Ahdra Merali * Use kedro new instead of cookiecutter Signed-off-by: Ahdra Merali --------- Signed-off-by: Ahdra Merali Signed-off-by: Dmitry Sorokin Co-authored-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Signed-off-by: tgoelles * chore(airflow): Bump `apache-airflow` version (#511) * Bump apache airflow Signed-off-by: Ankita Katiyar * Change starter Signed-off-by: Ankita Katiyar * Update e2e test steps Signed-off-by: Ankita Katiyar * Update e2e test steps Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * ci(datasets): Unpin dask (#522) * Unpin dask Signed-off-by: Ankita Katiyar * Update doctest Signed-off-by: Ankita Katiyar * Update doctest Signed-off-by: Ankita Katiyar * Update kedro-datasets/setup.py Co-authored-by: Nok Lam Chan Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> --------- Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Nok Lam Chan Signed-off-by: tgoelles * feat(datasets): Add `MatlabDataset` to `kedro-datasets` (#515) * Refork and commit kedro matlab datasets Signed-off-by: samuelleeshemen * Fix lint, add to docs Signed-off-by: Ankita Katiyar * Try fixing docstring Signed-off-by: Ankita Katiyar * Try fixing save Signed-off-by: Ankita Katiyar * Try fix docstest Signed-off-by: Ankita Katiyar * Fix unit tests Signed-off-by: Ankita Katiyar * Update release notes: Signed-off-by: Ankita Katiyar * Not hardcode load mode Signed-off-by: Ankita Katiyar --------- Signed-off-by: samuelleeshemen Signed-off-by: Ankita Katiyar Co-authored-by: Ankita Katiyar Signed-off-by: tgoelles * ci(airflow): Pin `Flask-Session` version (#521) * Restrict pendulum version Signed-off-by: Ankita Katiyar * Update airflow init step Signed-off-by: Ankita Katiyar * Remove pendulum pin Signed-off-by: Ankita Katiyar * Update create connections step Signed-off-by: Ankita Katiyar * Pin flask session Signed-off-by: Ankita Katiyar * Add comment Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * feat: `kedro-airflow` group in memory nodes (#241) * feat: option to group in-memory nodes Signed-off-by: Simon Brugman * fix: MemoryDataset Signed-off-by: Simon Brugman * Update kedro-airflow/README.md Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/README.md Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/README.md Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/RELEASE.md Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/kedro_airflow/grouping.py Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/kedro_airflow/plugin.py Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/tests/test_node_grouping.py Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/tests/test_node_grouping.py Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/kedro_airflow/grouping.py Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Simon Brugman * Update kedro-airflow/kedro_airflow/grouping.py Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: Simon Brugman * fix: tests Signed-off-by: Simon Brugman * Bump minimum kedro version Signed-off-by: Simon Brugman * fixes Signed-off-by: Simon Brugman --------- Signed-off-by: Simon Brugman Signed-off-by: Simon Brugman Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * ci(datasets): Update pyproject.toml to pin Kedro 0.19 for kedro-datasets (#526) Update pyproject.toml Signed-off-by: Nok Lam Chan Signed-off-by: tgoelles * feat(airflow): include environment name in DAG filename (#492) * feat: include environment name in DAG file Signed-off-by: Simon Brugman * doc: add update to release notes Signed-off-by: Simon Brugman --------- Signed-off-by: Simon Brugman Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * feat(datasets): Enable search-as-you type on Kedro-datasets docs (#532) * done Signed-off-by: rashidakanchwala * fix lint Signed-off-by: rashidakanchwala --------- Signed-off-by: rashidakanchwala Signed-off-by: tgoelles * fix(datasets): Debug and fix `kedro-datasets` nightly build failures (#541) * pin deltalake * Update kedro-datasets/setup.py Signed-off-by: Juan Luis Cano Rodríguez * Update setup.py Signed-off-by: Juan Luis Cano Rodríguez * sort order and compare * Update setup.py * lint * pin deltalake * add comment to pin --------- Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: Juan Luis Cano Rodríguez Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * feat(datasets): Dataset Preview Refactor (#504) * test * done * change from _preview to preview * fix lint and tests * added docstrings * rtd fix * rtd fix * fix rtd Signed-off-by: rashidakanchwala * fix rtd Signed-off-by: rashidakanchwala * fix rtd - pls" Signed-off-by: rashidakanchwala * add nitpick ignore Signed-off-by: rashidakanchwala * test again Signed-off-by: rashidakanchwala * move tracking datasets to constant Signed-off-by: rashidakanchwala * remove comma Signed-off-by: rashidakanchwala * remove Newtype from json_dataset" Signed-off-by: rashidakanchwala * pls work Signed-off-by: rashidakanchwala * confirm rtd works locally Signed-off-by: rashidakanchwala * juanlu's fix Signed-off-by: rashidakanchwala * fix tests Signed-off-by: rashidakanchwala * remove unnecessary stuff from conf.py Signed-off-by: rashidakanchwala * fixes based on review Signed-off-by: rashidakanchwala * changes based on review Signed-off-by: rashidakanchwala * fix tests Signed-off-by: rashidakanchwala * add suffix Preview Signed-off-by: rashidakanchwala * change img return type to bytes Signed-off-by: rashidakanchwala * fix tests Signed-off-by: rashidakanchwala * update release note * fix lint --------- Signed-off-by: rashidakanchwala Co-authored-by: ravi-kumar-pilla Co-authored-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Signed-off-by: tgoelles * fix(datasets): Drop pyarrow constraint when using snowpark (#538) * Free pyarrow req Signed-off-by: Felipe Monroy * Free pyarrow req Signed-off-by: Felipe Monroy --------- Signed-off-by: Felipe Monroy Co-authored-by: Nok Lam Chan Signed-off-by: tgoelles * docs: Update kedro-telemetry docs on which data is collected (#546) * Update data being collected --------- Signed-off-by: Dmitry Sorokin Signed-off-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Co-authored-by: Jo Stichbury Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * ci(docker): Trying to fix e2e tests (#548) * Pin psutil Signed-off-by: Ankita Katiyar * Add no capture to test Signed-off-by: Ankita Katiyar * Update pip version Signed-off-by: Ankita Katiyar * Update call Signed-off-by: Ankita Katiyar * Update pip Signed-off-by: Ankita Katiyar * pip ruamel Signed-off-by: Ankita Katiyar * change pip v Signed-off-by: Ankita Katiyar * change pip v Signed-off-by: Ankita Katiyar * show stdout Signed-off-by: Ankita Katiyar * use no cache dir Signed-off-by: Ankita Katiyar * revert extra changes Signed-off-by: Ankita Katiyar * pin pip Signed-off-by: Ankita Katiyar * gitpod Signed-off-by: Ankita Katiyar * pip inside dockerfile Signed-off-by: Ankita Katiyar * pip pip inside dockerfile Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * chore: bump actions versions (#539) * Unpin pip and bump actions versions Signed-off-by: Ankita Katiyar * remove version Signed-off-by: Ankita Katiyar * Revert unpinning of pip Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * docs(telemetry): Direct readers to Kedro documentation for further information on telemetry (#555) * Direct readers to Kedro documentation for further information on telemetry Signed-off-by: Juan Luis Cano Rodríguez * Wording improvements Co-authored-by: Jo Stichbury Signed-off-by: Juan Luis Cano Rodríguez * Amend README section Signed-off-by: Juan Luis Cano Rodríguez --------- Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: Juan Luis Cano Rodríguez Co-authored-by: Jo Stichbury Signed-off-by: tgoelles * fix: kedro-telemetry masking (#552) * Fix masking Signed-off-by: Dmitry Sorokin * Change masking approach Signed-off-by: Dmitry Sorokin * Fix tests Signed-off-by: Dmitry Sorokin * Fix tests Signed-off-by: Dmitry Sorokin * Fix tests Signed-off-by: Dmitry Sorokin * Fix tests Signed-off-by: Dmitry Sorokin * Fix tests Signed-off-by: Dmitry Sorokin * Fix tests Signed-off-by: Dmitry Sorokin --------- Signed-off-by: Dmitry Sorokin Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * fix: telemetry data and add example_pipeline (#557) * Fix telemetry data and add example_pipeline --------- Signed-off-by: Dmitry Sorokin Signed-off-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * feat(airflow): make sure `kedro airflow create` is deterministic (#525) * sort dags dictionary Signed-off-by: Nok Lam Chan * update release note Signed-off-by: Nok Lam Chan --------- Signed-off-by: Nok Lam Chan Signed-off-by: tgoelles * feat(telemetry): Add is_ci_env environment to reported project telemetry (#565) * Add check for ci environment Signed-off-by: Ahdra Merali * Adjust existing tests Signed-off-by: Ahdra Merali * Lint Signed-off-by: Ahdra Merali * Add tests Signed-off-by: Ahdra Merali * Add changes to release notes Signed-off-by: Ahdra Merali * Address review comments Signed-off-by: Ankita Katiyar * Update tests Signed-off-by: Ankita Katiyar * Debug test Signed-off-by: Ankita Katiyar * Fix tests Signed-off-by: Ankita Katiyar * Linting Signed-off-by: Ankita Katiyar * Fix tests Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ahdra Merali Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: Ankita Katiyar Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Ankita Katiyar Signed-off-by: tgoelles * chore(datasets): Update setup.py moto dependency (#537) * Update setup.py moto dependency Signed-off-by: Nok Lam Chan * Update mock_s3 with mock_aws Signed-off-by: Merel Theisen * Try use same moto for all python versions Signed-off-by: Merel Theisen * Clean up moto deps Signed-off-by: Merel Theisen --------- Signed-off-by: Nok Lam Chan Co-authored-by: Merel Theisen Signed-off-by: tgoelles * feat(datasets): allow additional parameters for sqlalchemy engine when using sql dataset (#564) * allow additional sqlalchemy engine parameters Signed-off-by: Manuel Spierenburg Signed-off-by: tgoelles * build(datasets): Release `kedro-datasets` 2.1.0 (#575) * Bump versions kedro-datasets Signed-off-by: Ankita Katiyar * Update release notes Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * feat(datasets): Add NetCDFDataSet class (#360) * initialize template and early additions Signed-off-by: Riley Brady * add placeholder for remote file system load Signed-off-by: Riley Brady * switch to versioned dataset Signed-off-by: Riley Brady * add initial remote -> local get for S3 Signed-off-by: Riley Brady * further generalize remote retrieval Signed-off-by: Riley Brady * add in credentials Signed-off-by: Riley Brady * make temppath optional for remote datasets Signed-off-by: Riley Brady * add initial idea for multifile glob Signed-off-by: Riley Brady * style: Introduce `ruff` for linting in all plugins. (#354) Signed-off-by: Merel Theisen Signed-off-by: Riley Brady * add suggested style changes Signed-off-by: Riley Brady * add temppath to attributes Signed-off-by: Riley Brady * more temppath fixes Signed-off-by: Riley Brady * more temppath updates Signed-off-by: Riley Brady * add better tempfile deletion and work on saving files Signed-off-by: Riley Brady * make __del__ flexible Signed-off-by: Riley Brady * formatting Signed-off-by: Riley Brady * feat(datasets): create custom `DeprecationWarning` (#356) * feat(datasets): create custom `DeprecationWarning` Signed-off-by: Deepyaman Datta * feat(datasets): use the custom deprecation warning Signed-off-by: Deepyaman Datta * chore(datasets): show Kedro's deprecation warnings Signed-off-by: Deepyaman Datta * fix(datasets): remove unused imports in test files Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: Riley Brady * docs(datasets): add note about DataSet deprecation (#357) Signed-off-by: Riley Brady * test(datasets): skip `tensorflow` tests on Windows (#363) Signed-off-by: Deepyaman Datta Signed-off-by: Riley Brady * ci: Pin `tables` version (#370) * Pin tables version Signed-off-by: Ankita Katiyar * Also fix kedro-airflow Signed-off-by: Ankita Katiyar * Revert trying to fix airflow Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: Riley Brady * build(datasets): Release `1.7.1` (#378) Signed-off-by: Merel Theisen Signed-off-by: Riley Brady * docs: Update CONTRIBUTING.md and add one for `kedro-datasets` (#379) Update CONTRIBUTING.md + add one for kedro-datasets Signed-off-by: Ankita Katiyar Signed-off-by: Riley Brady * ci(datasets): Run tensorflow tests separately from other dataset tests (#377) Signed-off-by: Merel Theisen Signed-off-by: Riley Brady * feat: Kedro-Airflow convert all pipelines option (#335) * feat: kedro airflow convert --all option Signed-off-by: Simon Brugman * docs: release docs Signed-off-by: Simon Brugman --------- Signed-off-by: Simon Brugman Signed-off-by: Riley Brady * docs(datasets): blacken code in rst literal blocks (#362) Signed-off-by: Deepyaman Datta Signed-off-by: Riley Brady * docs: cloudpickle is an interesting extension of the pickle functionality (#361) Signed-off-by: H. Felix Wittmann Signed-off-by: Riley Brady * fix(datasets): Fix secret scan entropy error (#383) Fix secret scan entropy error Signed-off-by: Merel Theisen Signed-off-by: Riley Brady * style: Rename mentions of `DataSet` to `Dataset` in `kedro-airflow` and `kedro-telemetry` (#384) Signed-off-by: Merel Theisen Signed-off-by: Riley Brady * feat(datasets): Migrated `PartitionedDataSet` and `IncrementalDataSet` from main repository to kedro-datasets (#253) Signed-off-by: Peter Bludau Co-authored-by: Merel Theisen Signed-off-by: Riley Brady * fix: backwards compatibility for `kedro-airflow` (#381) Signed-off-by: Simon Brugman Signed-off-by: Riley Brady * fix(datasets): Don't warn for SparkDataset on Databricks when using s3 (#341) Signed-off-by: Alistair McKelvie Signed-off-by: Riley Brady * update docs API and release notes Signed-off-by: Riley Brady * add netcdf requirements to setup Signed-off-by: Riley Brady * lint Signed-off-by: Riley Brady * add initial tests Signed-off-by: Riley Brady * update dataset exists for multifile Signed-off-by: Riley Brady * Add full test suite for NetCDFDataSet Signed-off-by: Riley Brady * Add docstring examples Signed-off-by: Riley Brady * change xarray version req Signed-off-by: Riley Brady * update dask req Signed-off-by: Riley Brady * rename DataSet -> Dataset Signed-off-by: Riley Brady * Update xarray reqs for earlier python versions Signed-off-by: Riley Brady * fix setup Signed-off-by: Riley Brady * update test coverage Signed-off-by: Riley Brady * exclude init from test coverage Signed-off-by: Riley Brady * Sub in pathlib for os.remove Signed-off-by: Riley Brady * add metadata to dataset Signed-off-by: Riley Brady * add doctest for the new datasets Signed-off-by: Nok * add patch for supporting http/https Signed-off-by: Riley Brady * Small fixes post-merge Signed-off-by: Juan Luis Cano Rodríguez * Lint Signed-off-by: Juan Luis Cano Rodríguez * Fix import Signed-off-by: Juan Luis Cano Rodríguez * Un-ignore NetCDF doctest Signed-off-by: Juan Luis Cano Rodríguez * Add fixture Signed-off-by: Ankita Katiyar * Mark problematic test as xfail Signed-off-by: Juan Luis Cano Rodríguez * Skip problematic test instead of making it fail Signed-off-by: Juan Luis Cano Rodríguez * Skip problematic tests and fix failing tests Signed-off-by: Ankita Katiyar * Remove comment Signed-off-by: Ankita Katiyar --------- Signed-off-by: Riley Brady Signed-off-by: Merel Theisen Signed-off-by: Deepyaman Datta Signed-off-by: Ankita Katiyar Signed-off-by: Simon Brugman Signed-off-by: H. Felix Wittmann Signed-off-by: Peter Bludau Signed-off-by: Alistair McKelvie Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Nok Lam Chan Signed-off-by: Nok Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Deepyaman Datta Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Simon Brugman Co-authored-by: Felix Wittmann Co-authored-by: PtrBld <7523956+PtrBld@users.noreply.github.com> Co-authored-by: Merel Theisen Co-authored-by: Alistair McKelvie Co-authored-by: Nok Lam Chan Co-authored-by: Juan Luis Cano Rodríguez Co-authored-by: Ankita Katiyar Signed-off-by: tgoelles * Fix Geotiff dataset docstring Signed-off-by: Merel Theisen Signed-off-by: tgoelles * Improve test coverage Signed-off-by: Merel Theisen Signed-off-by: tgoelles * build(telemetry): Release 0.3.2 (#588) Bump version Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * chore(datasets): Normalise optional requirements names and move them to `pyproject.toml` (#570) * Normalise and move extras dependencies to pyproject.toml Signed-off-by: Ankita Katiyar * Update kedro-datasets/pyproject.toml Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> * Update pyproject and release notes Signed-off-by: Ankita Katiyar * Update pyproject and release notes Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> * ci(datasets): Accelerate CI using `uv` (#569) * Rename ill-named CI check for docs Signed-off-by: Juan Luis Cano Rodríguez * Use uv to accelerate dependency installation on CI Signed-off-by: Juan Luis Cano Rodríguez * Use smaller dataset for Hugging Face doctest Signed-off-by: Juan Luis Cano Rodríguez * Fix pytest invokation on Windows See https://github.com/astral-sh/uv/issues/1988 Signed-off-by: Juan Luis Cano Rodríguez * Definitive fix to Hugging Face doctest Signed-off-by: Juan Luis Cano Rodríguez * Trigger CI Signed-off-by: Juan Luis Cano Rodríguez * Debug Signed-off-by: Juan Luis Cano Rodríguez * Bump to next uv version * Restore pytest invokation * Upgrade to latest version of uv * Fix pyproject.toml * Make docs check plugin-specific Signed-off-by: Juan Luis Cano Rodríguez --------- Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * ci(docker): Only run one pipeline with the `ParallelRunner` in the e2e test (#591) Fix e2e test Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * fix(datasets): sql_dataset load_args:params must be a tuple (MSSQL only) (#556) * fix(datasets): sql_dataset load_args:params must be a tuple (MSSQL only) Signed-off-by: Andrew Cao * Fix mssql test Signed-off-by: Merel Theisen * Update release notes + lint Signed-off-by: Merel Theisen --------- Signed-off-by: Andrew Cao Signed-off-by: Merel Theisen Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Merel Theisen Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * build(datasets): fix typos in definition of extras (#593) * build(datasets): fix typos in definition of extras Signed-off-by: Deepyaman Datta * build(datasets): separate pandas-sqldataset and pandas-gbqdataset Signed-off-by: Ankita Katiyar --------- Signed-off-by: Deepyaman Datta Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * fix(airflow): Fix incorrect node names (#594) * Fix incorrect node names + switch e2e tests to spaceflights-pandas Signed-off-by: Ankita Katiyar * Not switch e2e tests starters for now Signed-off-by: Ankita Katiyar * Revert changes to e2e tests Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * fix(datasets): Various fixes (#608) * Try to use uv on Read the Docs Signed-off-by: Juan Luis Cano Rodríguez * Pin dask test requirement as latest introduced installation issues Signed-off-by: Merel Theisen * Try pinning Dask in main requirements too Signed-off-by: Juan Luis Cano Rodríguez * Use smaller model for Hugging Face doctest Signed-off-by: Juan Luis Cano Rodríguez * Install PyTorch with transformers for testing Signed-off-by: Juan Luis Cano Rodríguez * More robust doctest for Hugging Face transformer Signed-off-by: Juan Luis Cano Rodríguez * Whitespace fix Signed-off-by: Juan Luis Cano Rodríguez * Fix Tensorflow dataset for modern versions of Keras Signed-off-by: Juan Luis Cano Rodríguez * Fix TensorFlow model loading and saving Signed-off-by: Juan Luis Cano Rodríguez * Fix TensorFlow tests Signed-off-by: Juan Luis Cano Rodríguez --------- Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: Merel Theisen Co-authored-by: Merel Theisen Signed-off-by: tgoelles * feat(datasets): Add kwargs for huggingface.HFDataset (#580) * issue #574 * Chance to #574 issue Signed-off-by: Eduardo * lint tool implementation fixes Signed-off-by: eduardo * lint tool implementation fixes Signed-off-by: eduardo * lint tool implementation fixes for the second time Signed-off-by: eduardo * Fixed attribute name typo in HFDataset's _load() method, now correctly accessing self._dataset_kwargs instead of self._pipeline_kwargs. * corrections after applying the `make plugin=kedro-datasets lint` Signed-off-by: eduardo * Update RELEASE.md I add myself as as contributor. Signed-off-by: Eduardo <144208874+eromerobilbomatica@users.noreply.github.com> * Update RELEASE.md Add note about the fixed bug. Signed-off-by: Eduardo <144208874+eromerobilbomatica@users.noreply.github.com> * Update RELEASE.md Fixed my comments and its position in the section. Signed-off-by: Eduardo <144208874+eromerobilbomatica@users.noreply.github.com> * Update RELEASE.md Changed my name to community contributions in the "Upcoming Release" section Signed-off-by: Eduardo <144208874+eromerobilbomatica@users.noreply.github.com> --------- Signed-off-by: Eduardo Signed-off-by: eduardo Signed-off-by: Eduardo <144208874+eromerobilbomatica@users.noreply.github.com> Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: eduardo Co-authored-by: Nok Lam Chan Co-authored-by: Juan Luis Cano Rodríguez Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: tgoelles * feat(telemetry): Unique User IDs in kedro-telemetry - merge only for kedro-telemetry release 0.4.0 (#596) * Change to unique uuid Signed-off-by: Dmitry Sorokin * Fix tests Signed-off-by: Dmitry Sorokin * fix tests and empty value Signed-off-by: Dmitry Sorokin * fix lint Signed-off-by: Dmitry Sorokin * Reformat _get_or_create_uuid to not be entirely inside the try block Signed-off-by: lrcouto * Reformat _get_or_create_uuid to not be entirely inside the try block Signed-off-by: lrcouto * Remove incorrectly sent file Signed-off-by: lrcouto * Update RELEASE.md Signed-off-by: lrcouto * Return empty ID if the existing ID cannot be read Signed-off-by: lrcouto * Extract new uuid generation to its own function Signed-off-by: lrcouto * Convert .conf file to .toml Signed-off-by: lrcouto * Lint Signed-off-by: lrcouto * Remove redundant try/except block Signed-off-by: lrcouto * Add type hints, change variable names to be more descriptive Signed-off-by: lrcouto * Small fixes Signed-off-by: lrcouto * Make release note more explicit Signed-off-by: lrcouto --------- Signed-off-by: Dmitry Sorokin Signed-off-by: lrcouto Co-authored-by: lrcouto Co-authored-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> Signed-off-by: tgoelles * build(telemetry): Add python 3.12 support (#615) * Add python 3.12 support for kedro-telemetry Signed-off-by: Ankita Katiyar * Increase timeout UV Signed-off-by: Ankita Katiyar * Increase timeout for docs build Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * feat(airflow): add --tags option for node filtering in airflow create (#607) * Add tags filter to airflow create --------- Signed-off-by: Dmitry Sorokin Signed-off-by: tgoelles * fix(datasets): make connection_args optional (#586) * Make `connection_args` optional when calling `create_connection()` in `sql_dataset.py`. --------- Signed-off-by: Jerome Asselin Signed-off-by: tgoelles * chore(telemetry): Remove dummy e2e test (#622) Remove dummy e2e test Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * refactor(airflow): Remove `bootstrap_project` (#599) * Remove bootstrap_project Signed-off-by: Ankita Katiyar * Refactor Signed-off-by: Ankita Katiyar * Fix tests Signed-off-by: Ankita Katiyar * Print for debugging Signed-off-by: Ankita Katiyar * add resolve Signed-off-by: Ankita Katiyar * Update tests Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * build(datasets): Add Python 3.12 support (#617) * Add support for Python 3.12 Signed-off-by: Ankita Katiyar * Bump pyodbc Signed-off-by: Ankita Katiyar * Update gitpod Signed-off-by: Ankita Katiyar * Unpin reqs Signed-off-by: Ankita Katiyar * pin pandas again Signed-off-by: Ankita Katiyar * unpin some more Signed-off-by: Ankita Katiyar * unpin pyarrow Signed-off-by: Ankita Katiyar * unpin pyarrow Signed-off-by: Ankita Katiyar * Update uv Signed-off-by: Ankita Katiyar * Bump pyarrow Signed-off-by: Ankita Katiyar * temporarily disable docs tests Signed-off-by: Ankita Katiyar * unpin deltalake Signed-off-by: Ankita Katiyar * unpin pandas-gbq Signed-off-by: Ankita Katiyar * Update tests Signed-off-by: Ankita Katiyar * remove doctest again Signed-off-by: Ankita Katiyar * unpin sqlalchemy Signed-off-by: Ankita Katiyar * bump uv and cleanup pyproject.toml Signed-off-by: Ankita Katiyar * Revert bump of pyarrow Signed-off-by: Ankita Katiyar * Revert unpinning of uv Signed-off-by: Ankita Katiyar * Bump uv timeouts Signed-off-by: Ankita Katiyar * Apply suggestions from code review Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> --------- Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * feat(datasets): Extend preview mechanism (#595) * Extend preview to Parquet * Update sql_dataset.py * Update sql_dataset.py * update preview method for parquetdataset * Update sql_dataset.py * extend preview to JSONDataset * add json preview * add preview for pickledataset * Update json_dataset.py * lint * add tests for parquet and json * lint * rem pickle fix docstring * Fix parquet test * fix pandas.json tests * add coverage for sqldataset * lint * coverage for sanitisation of sql * changes based on review * use pyarrow for parquet preview * align jsondataset with spike * Update json_dataset.py * Update json_dataset.py * pass lines=true and nrows * update docstring * Update test_json_dataset.py * revert change * use sqlalchemy instead of query * fix sql tests Signed-off-by: tgoelles * fix: Add `--telemetry` flag to to kedro-telemetry CLI masking tests. (#637) add telemetry flag to kedro new cli structure tests Signed-off-by: lrcouto Signed-off-by: tgoelles * fix: Drop support for `pandas < 2.0`, `pyspark < 3.0` on `kedro-datasets` (#643) * Drop support for pandas < 2.0 Signed-off-by: lrcouto * Drop support for pyspark < 3.0 Signed-off-by: lrcouto * Lift Dask version cap Signed-off-by: Juan Luis Cano Rodríguez * Add changes to release notes Signed-off-by: lrcouto --------- Signed-off-by: lrcouto Signed-off-by: Juan Luis Cano Rodríguez Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * feat(datasets): add dataset to load/save with Ibis (#560) * feat(datasets): add dataset to load/save with Ibis Signed-off-by: Deepyaman Datta * build(datasets): fix typos in definition of extras Signed-off-by: Deepyaman Datta * build(datasets): include Ibis backend requirements Signed-off-by: Deepyaman Datta * test(datasets): implement save and reload for Ibis Signed-off-by: Deepyaman Datta * test(datasets): check `ibis.TableDataset.exists()` Signed-off-by: Deepyaman Datta * test(datasets): test extra load and save args work Signed-off-by: Deepyaman Datta * test(datasets): verify config and materializations Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * fix(datasets): Restore support for pandas 1 and PySpark 2 (#646) * Restore support for pandas 1 and PySpark 2 Signed-off-by: Juan Luis Cano Rodríguez * Update release notes Signed-off-by: Juan Luis Cano Rodríguez --------- Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * feat: Release kedro-datasets version 3.0.0 (#644) * bump up kedro-datasets version to 3.0.0 Signed-off-by: lrcouto * Reformatted release notes Signed-off-by: Elena Khaustova * Fixed typo Signed-off-by: Elena Khaustova --------- Signed-off-by: lrcouto Signed-off-by: Elena Khaustova Signed-off-by: Elena Khaustova Co-authored-by: Elena Khaustova Co-authored-by: Elena Khaustova Signed-off-by: tgoelles * docs: Add `experimental` directory (#635) Signed-off-by: Merel Theisen Signed-off-by: tgoelles * docs: Add description of experimental and core datasets to contribution guide (#642) Signed-off-by: Merel Theisen Co-authored-by: Juan Luis Cano Rodríguez Co-authored-by: Deepyaman Datta Signed-off-by: tgoelles * build(airflow): Add python 3.12 support (#614) * Add python 3.12 support for airflow Signed-off-by: Ankita Katiyar * temp: update gitpod Signed-off-by: Ankita Katiyar * Update gitpod Signed-off-by: Ankita Katiyar * Update gitpod Signed-off-by: Ankita Katiyar * Resolve path Signed-off-by: Ankita Katiyar * remove pins Signed-off-by: Ankita Katiyar * Try bump apache Signed-off-by: Ankita Katiyar * Try bump apache Signed-off-by: Ankita Katiyar * Revert airflow pin Signed-off-by: Ankita Katiyar * Revert extra changes Signed-off-by: Ankita Katiyar * update install kedro-datasets step Signed-off-by: Ankita Katiyar * try remove install kedro-datasets step Signed-off-by: Ankita Katiyar * Install kedro from main Signed-off-by: Ankita Katiyar * Revert changes Signed-off-by: Ankita Katiyar * Use 3.12 gitpod Signed-off-by: Ankita Katiyar * Update .gitpod.yml Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> --------- Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * build(docker): Add Python 3.12 support (#616) * Add 3.12 support kedro-docker Signed-off-by: Ankita Katiyar * Update cli steps: Signed-off-by: Ankita Katiyar * Resolve tempdir path Signed-off-by: Ankita Katiyar * Show error Signed-off-by: Ankita Katiyar * comment Signed-off-by: Ankita Katiyar * install kedro from main Signed-off-by: Ankita Katiyar * Add kedro to test deps Signed-off-by: Ankita Katiyar * Add kedro to test deps Signed-off-by: Ankita Katiyar * Add kedro to test deps Signed-off-by: Ankita Katiyar * install kedro from main Signed-off-by: Ankita Katiyar * install kedro from main Signed-off-by: Ankita Katiyar * change docker image Signed-off-by: Ankita Katiyar * Update .gitpod.yml Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> * Cleanup Signed-off-by: Ankita Katiyar * Update kedro-docker/features/steps/cli_steps.py Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> --------- Signed-off-by: Ankita Katiyar Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: tgoelles * chore: Add `mypy` setup to Makefile (#638) * Add mypy setup to makefile Signed-off-by: Ankita Katiyar * Add mypy to test reqs Signed-off-by: Ankita Katiyar * chore: Fix `mypy` issues on `kedro-docker` (#640) Fix mypy issues on docker Signed-off-by: Ankita Katiyar * chore: Fix `mypy` issues with `kedro-telemetry` (#641) Fix mypy issues with kedro-telemetry Signed-off-by: Ankita Katiyar * Fix errors docker Signed-off-by: Ankita Katiyar * Import annotations Signed-off-by: Ankita Katiyar * Import annotations Signed-off-by: Ankita Katiyar * Remove mypy check for datasets for now and fix airflow errors Signed-off-by: Ankita Katiyar * Add mypy confg file Signed-off-by: Ankita Katiyar * Update mypy command and move config to pyproject.toml Signed-off-by: Ankita Katiyar * Move back to top level config Signed-off-by: Ankita Katiyar * Get rid of config for flag Signed-off-by: Ankita Katiyar * add mypy type stubs to test reqs Signed-off-by: Ankita Katiyar * Update telemetry reqs Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * build(telemetry): Release 0.4.0 (#648) Bump version Signed-off-by: Dmitry Sorokin Co-authored-by: Nok Lam Chan Signed-off-by: tgoelles * build(docker): Release 0.6.0 (#659) Bump version Signed-off-by: Ankita Katiyar Signed-off-by: tgoelles * docs(datasets): add `ibis.TableDataset` to toctree (#657) * docs(datasets): include `ibis.TableDatset` in docs Signed-off-by: Deepyaman Datta * docs(datasets): upgrade `sphinx-autodoc-typehints` Signed-off-by: Deepyaman Datta * revert(datasets): remove the `TYPE_CHECKING` guard This reverts commit fd3addd2ccf8111509a8907afc788fefbe5e36f9. Signed-off-by: Deepyaman Datta * docs(datasets): add `BaseBackend` to Sphinx config Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * chore(datasets): add `mypy` setup for datasets (#647) * add mypy setup for datasets Signed-off-by: Ankita Katiyar * Minor fixes and add config file Signed-off-by: Ankita Katiyar * Move mypy config to toml file Signed-off-by: Ahdra Merali * Move mypy config Signed-off-by: Ahdra Merali * First pass ManagedTableDataset Signed-off-by: Ahdra Merali * First pass pandas/CSVDataset Signed-off-by: Ahdra Merali * First pass pandas/ExcelDataset Signed-off-by: Ahdra Merali * First pass pandas/FeatherDataset Signed-off-by: Ahdra Merali * First pass pandas/GBQDataset Signed-off-by: Ahdra Merali * First pass pandas/GenericDataset Signed-off-by: Ahdra Merali * First pass pandas/HDFDataset Signed-off-by: Ahdra Merali * First pass pandas/JSONDataset Signed-off-by: Ahdra Merali * First pass pandas/ParquetDataset Signed-off-by: Ahdra Merali * First pass pandas/SQLDataset Signed-off-by: Ahdra Merali * First pass pandas/XMLDataset Signed-off-by: Ahdra Merali * Address implicit optional Signed-off-by: Ahdra Merali * Rename mentions of Dict to dict Signed-off-by: Ahdra Merali * Revert to top level config Signed-off-by: Ankita Katiyar * revert changes to docker, fix link issue in apidataset Signed-off-by: Ankita Katiyar * fix optional errors Signed-off-by: Ankita Katiyar * Some more errors Signed-off-by: Ankita Katiyar * try fix unit tests Signed-off-by: Ankita Katiyar * More errors Signed-off-by: Ankita Katiyar * revert netcdf + fix managedtable & sparksteaming ds Signed-off-by: Ankita Katiyar * Add future import Signed-off-by: Ahdra Merali * Update mypy config Signed-off-by: Ahdra Merali * Update automated mypy check Signed-off-by: Ahdra Merali * Update automated mypy check 2 Signed-off-by: Ahdra Merali * Update makefile command Signed-off-by: Ankita Katiyar * some more changes Signed-off-by: Ankita Katiyar * Try fixng unit tests Signed-off-by: Ankita Katiyar * Fix tests Signed-off-by: Ankita Katiyar * More errors Signed-off-by: Ankita Katiyar * More fixes Signed-off-by: Ankita Katiyar * fix tests Signed-off-by: Ankita Katiyar * fix tests Signed-off-by: Ankita Katiyar * fix tests Signed-off-by: Ankita Katiyar * fix tests Signed-off-by: Ankita Katiyar * bump docs build Signed-off-by: Ankita Katiyar * bump docs build Signed-off-by: Ankita Katiyar * bump docs build Signed-off-by: Ankita Katiyar * unbump docs build Signed-off-by: Ankita Katiyar * Delete coverage.xml Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> * cleanup Signed-off-by: Ankita Katiyar * Get rid of union Signed-off-by: Ankita Katiyar * RTD build Signed-off-by: Ankita Katiyar * fix test Signed-off-by: Ankita Katiyar --------- Signed-off-by: Ankita Katiyar Signed-off-by: Ahdra Merali Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Ahdra Merali Co-authored-by: Ahdra Merali <90615669+AhdraMeraliQB@users.noreply.github.com> Signed-off-by: tgoelles * docs(datasets): update config for Ibis 9.0 changes (#667) * docs(datasets): add `ibis.base.BaseBackend` target Signed-off-by: Deepyaman Datta * docs(datasets): remove older type target reference Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * chore: delete accidentally-committed coverage file (#665) Signed-off-by: tgoelles * docs(datasets): Use `kedro-sphinx-theme` (#670) Signed-off-by: tgoelles * build: use new `exclude_also` over `exclude_lines` (#666) Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * fix(airflow): Fix nodes grouping (#664) * Update memory dataset checking Signed-off-by: Ankita Katiyar * Built adjacency matrix Signed-off-by: Elena Khaustova * Implemented connectivity components search Signed-off-by: Elena Khaustova * Replaced sort with topological order Signed-off-by: Elena Khaustova * Removed debug output Signed-off-by: Elena Khaustova * Fixed pre-commit errors Signed-off-by: Elena Khaustova * Updated unit tests for node grouping Signed-off-by: Elena Khaustova * Refactored grouping function Signed-off-by: Elena Khaustova * Added clarification comments Signed-off-by: Elena Khaustova * Updated unit test Signed-off-by: Elena Khaustova * Added missed return types Signed-off-by: Elena Khaustova * Linter errors fix Signed-off-by: Elena Khaustova * Fixed mypy errors Signed-off-by: Elena Khaustova * Fixing docs build Signed-off-by: Elena Khaustova * Fixing docs build Signed-off-by: Elena Khaustova * Renamed parent dictionary Signed-off-by: Elena Khaustova * Added comments to clarify the resulting order nodes Signed-off-by: Elena Khaustova * Renamed matrix -> list Signed-off-by: Elena Khaustova * Applied suggested change Signed-off-by: Elena Khaustova * Added missed renamings Signed-off-by: Elena Khaustova --------- Signed-off-by: Ankita Katiyar Signed-off-by: Elena Khaustova Co-authored-by: Ankita Katiyar Signed-off-by: tgoelles * build(datasets): remove arbitrary bound for `s3fs` (#668) * build(datasets): remove arbitrary bound for `s3fs` Signed-off-by: Deepyaman Datta * Update RELEASE.md Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles * build(datasets): Make sure experimental datasets are packaged as part of `kedro-datasets` (#654) * Make sure experimental datasets are packaged Signed-off-by: Merel Theisen * Rename experimental dir to kedro_datasets_experimental Signed-off-by: Merel Theisen * Update contributing guide to mention new dir name Signed-off-by: Merel Theisen --------- Signed-off-by: Merel Theisen Signed-off-by: tgoelles * docs(datasets): add the extra install instructions (#669) * docs(datasets): add the extra install instructions Signed-off-by: Deepyaman Datta * docs(datasets): apply suggestions from code review Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: Deepyaman Datta --------- Signed-off-by: Deepyaman Datta Co-authored-by: Juan Luis Cano Rodríguez Signed-off-by: tgoelles * Move geotiff dataset + tests to experimental Signed-off-by: Merel Theisen Signed-off-by: tgoelles * Fix pyproj.toml Signed-off-by: Merel Theisen Signed-off-by: tgoelles * Move experimental dataset to bottom of docs rst Signed-off-by: Merel Theisen Signed-off-by: tgoelles * Separate experimental API docs Signed-off-by: Merel Theisen Signed-off-by: tgoelles * Delete accidental __init__ file Signed-off-by: Merel Theisen Signed-off-by: tgoelles * build(docker): Unpin pip for `kedro-docker` (#680) Unpin pip for kedro-docker Signed-off-by: Merel Theisen Signed-off-by: tgoelles * docs(datasets): Add setup for building API docs for experimental datasets (#686) Add setup for building API docs for experimental datasets Signed-off-by: Merel Theisen * Fix lint Signed-off-by: Merel Theisen Signed-off-by: tgoelles * feat(datasets): `NetCDFDataset` support for `engine="h5netcdf"` [#620] (#631) * Change NetCDFDataset to use a temporary file for remote filesystems, to allow other to_netcdf engines * Update unit test to include save engine for NetCDFDataset * Fix unit-test error where folder was accessed before being created Signed-off-by: Charles Guan <3221512+charlesincharge@users.noreply.github.com> Signed-off-by: Merel Theisen Signed-off-by: tgoelles * docs(telemetry): Update badges (#690) * (telemetry) Update badges and remove support for python3.8 Signed-off-by: Nok Lam Chan * Update pyproject.toml Signed-off-by: Nok Lam Chan * Update pyproject.toml Signed-off-by: Nok Lam Chan * Update README.md Signed-off-by: Nok Lam Chan --------- Signed-off-by: Nok Lam Chan Signed-off-by: tgoelles * docs(airflow): update badge (#693) * Drop python 3.8 support and update badge Signed-off-by: Nok Lam Chan * Update pyproject.toml Signed-off-by: Nok Lam Chan * Update pyproject.toml Signed-off-by: Nok Lam Chan * Update README.md Signed-off-by: Nok Lam Chan --------- Signed-off-by: Nok Lam Chan Signed-off-by: tgoelles * build(datasets):Make sure experimental dependencies are installed for check builds step (#688) Make sure experimental dependencies are installed for check builds step Signed-off-by: Merel Theisen Signed-off-by: tgoelles * renaming to rioxarray and RasterDataset WIP * renaming to rioxarray and raster_dataset Signed-off-by: tgoelles * renaming WIP Signed-off-by: tgoelles * better docstring Signed-off-by: tgoelles * rewrite tests WIP Signed-off-by: tgoelles * check for existing CRS on load Signed-off-by: tgoelles * testing with geotiff only WIP Signed-off-by: tgoelles * Add sanity checks for data dimensions and coordinate reference system Signed-off-by: tgoelles * multiband support WIP Signed-off-by: tgoelles * better tests WIP Signed-off-by: tgoelles * test no crs Signed-off-by: tgoelles * test no band Signed-off-by: tgoelles * better no data handling Signed-off-by: tgoelles * checking for tif file format Signed-off-by: tgoelles * renamed to geotiff Signed-off-by: tgoelles * better docstring and deleted clutter Signed-off-by: tgoelles * formatted and docstring update Signed-off-by: tgoelles * build(datasets): Update badges for kedro-datasets (#689) * Update badges for kedro-datasets Signed-off-by: Nok Lam Chan * Update README.md Signed-off-by: Nok Lam Chan * Update pyproject.toml Signed-off-by: Nok Lam Chan * Update README.md Signed-off-by: Nok Lam Chan * Update pyproject.toml Signed-off-by: Nok Lam Chan --------- Signed-off-by: Nok Lam Chan Signed-off-by: tgoelles * fix(airflow): fix the link to correct deployment manual (#697) fix the link to correct deployment manual Signed-off-by: Dmitry Sorokin Signed-off-by: tgoelles * build(airflow): Release 0.9.0 (#698) Bump version Signed-off-by: Sajid Alam Signed-off-by: tgoelles * build(datasets): Release kedro-datasets 3.0.1 (#704) bump version Signed-off-by: Sajid Alam * feat(datasets): Add limited `langchain` support for Anthropic, Cohere, and OpenAI models (#434) * Add openai datasets. * Add anthropic and cohere Signed-off-by: Ian Whalen * Add python API examples to docstrings. Signed-off-by: Ian Whalen * Clean up python example. Signed-off-by: Ian Whalen * Remove setup.py and move lanchain reqs to pyproject.toml Signed-off-by: Merel Theisen * Move lanchain datasets to experimental Signed-off-by: Merel Theisen * Try get antrophic dataset running. Looks like API URL is not necessary? Signed-off-by: Merel Theisen * Update cohere package and imports Signed-off-by: Merel Theisen * Update openai dependency + allow for url in antrophic Signed-off-by: Merel Theisen * Improve Cohere dataset Signed-off-by: Merel Theisen * Make credentials consistent + fix openai examples Signed-off-by: Merel Theisen * Turn cohere dataset into chatcohere dataset Signed-off-by: Merel Theisen * Clean up cohere dataset Signed-off-by: Merel Theisen * Update release notes + init Signed-off-by: Merel Theisen * Apply suggestions from code review Co-authored-by: ElenaKhaustova <157851531+ElenaKhaustova@users.noreply.github.com> Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> * Add version pins for langchain dependencies Signed-off-by: Merel Theisen * Update kedro-datasets/kedro_datasets_experimental/langchain/_anthropic.py Co-authored-by: ElenaKhaustova <157851531+ElenaKhaustova@users.noreply.github.com> Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> * Try loosen pin on langchain-cohere Signed-off-by: Merel Theisen * Only pin dependencies of dataset def in pyproject.toml Signed-off-by: Merel Theisen --------- Signed-off-by: Ian Whalen Signed-off-by: Merel Theisen Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Merel Theisen Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: ElenaKhaustova <157851531+ElenaKhaustova@users.noreply.github.com> * docs(datasets): Add langchain datasets to API docs (#711) * Add lanchain datasets to API docs Signed-off-by: Merel Theisen * fix(telemetry): Single project identifier (#701) * Moved pyproject config name to constant Signed-off-by: Elena Khaustova * Implemented _get_or_create_project_uuid Signed-off-by: Elena Khaustova * Refactored _get_project_properties Signed-off-by: Elena Khaustova * Fixed tests from hanging Signed-off-by: Elena Khaustova * Fixed _is_known_ci_env Signed-off-by: Elena Khaustova * Fixed test_before_command_run Signed-off-by: Elena Khaustova * Fixed TestKedroTelemetryCLIHooks Signed-off-by: Elena Khaustova * Fixed TestKedroTelemetryProjectHooks Signed-off-by: Elena Khaustova * Fixed writing to pyproject.toml Signed-off-by: Elena Khaustova * Fixed write mock Signed-off-by: Elena Khaustova * Removed debug output Signed-off-by: Elena Khaustova * Refactored _add_tool_properties Signed-off-by: Elena Khaustova * Added debug message when pyproject_path does not exist Signed-off-by: Elena Khaustova * Updated release notes Signed-off-by: Elena Khaustova * Return None as project UUID in case of not generated Signed-off-by: Elena Khaustova * Fixed pre-commit errors Signed-off-by: Elena Khaustova * Updated the way project UUID is stored Signed-off-by: Elena Khaustova * Renamed project_uuid -> project_id Signed-off-by: Elena Khaustova * Check if pyproject file relates to kedro Signed-off-by: Elena Khaustova * Changed debug message as suggested Signed-off-by: Elena Khaustova * Added OSError handling Signed-off-by: Elena Khaustova * Fixed unit test Signed-off-by: Elena Khaustova --------- Signed-off-by: Elena Khaustova Signed-off-by: tgoelles * fixed more linting issues Signed-off-by: tgoelles * fixed naming Signed-off-by: tgoelles * end of line fix * added support for tags Signed-off-by: tgoelles * renamed to GeoTIFF * fixed confusing docstring Signed-off-by: tgoelles * deleted unused import Signed-off-by: tgoelles * fixed linting issues * added rioxarray requirements * run black * Update release notes properly Signed-off-by: Ankita Katiyar * Use get_filepath_str instead Signed-off-by: Nok * Revert "Use get_filepath_str instead" This reverts commit 959723ce199f1fce8a20309026aa2495f88fc530. * Empty Signed-off-by: Juan Luis Cano Rodríguez --------- Signed-off-by: Deepyaman Datta Signed-off-by: tgoelles Signed-off-by: Merel Theisen Signed-off-by: Ankita Katiyar Signed-off-by: Simon Brugman Signed-off-by: H. Felix Wittmann Signed-off-by: Peter Bludau Signed-off-by: Alistair McKelvie Signed-off-by: Nok Signed-off-by: lrcouto Signed-off-by: Matthias Roels Signed-off-by: Matthias Roels Signed-off-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Signed-off-by: Edouard59 <68538605+Edouard59@users.noreply.github.com> Signed-off-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> Signed-off-by: Miguel Rodriguez Gutierrez Signed-off-by: Florian Roessler Signed-off-by: Jo Stichbury Signed-off-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> Signed-off-by: Felix Scherz Signed-off-by: Dmitry Sorokin Signed-off-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Signed-off-by: Onur Kuru Signed-off-by: Nok Lam Chan Signed-off-by: Yolan Honoré-Rougé Signed-off-by: Ahdra Merali Signed-off-by: samuelleeshemen Signed-off-by: Simon Brugman Signed-off-by: rashidakanchwala Signed-off-by: Juan Luis Cano Rodríguez Signed-off-by: Felipe Monroy Signed-off-by: Manuel Spierenburg Signed-off-by: Riley Brady Signed-off-by: Andrew Cao Signed-off-by: Eduardo Signed-off-by: eduardo Signed-off-by: Eduardo <144208874+eromerobilbomatica@users.noreply.github.com> Signed-off-by: Jerome Asselin Signed-off-by: Elena Khaustova Signed-off-by: Elena Khaustova Signed-off-by: Charles Guan <3221512+charlesincharge@users.noreply.github.com> Signed-off-by: Sajid Alam Signed-off-by: Ian Whalen Signed-off-by: Thomas Gölles Co-authored-by: Deepyaman Datta Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> Co-authored-by: Simon Brugman Co-authored-by: Felix Wittmann Co-authored-by: PtrBld <7523956+PtrBld@users.noreply.github.com> Co-authored-by: Merel Theisen Co-authored-by: Alistair McKelvie Co-authored-by: Nok Lam Chan Co-authored-by: L. R. Couto <57910428+lrcouto@users.noreply.github.com> Co-authored-by: Matthias Roels Co-authored-by: Matthias Roels Co-authored-by: Juan Luis Cano Rodríguez Co-authored-by: Sajid Alam <90610031+SajidAlamQB@users.noreply.github.com> Co-authored-by: Edouard59 <68538605+Edouard59@users.noreply.github.com> Co-authored-by: Miguel Rodriguez Gutierrez Co-authored-by: froessler <11539266+fdroessler@users.noreply.github.com> Co-authored-by: Jo Stichbury Co-authored-by: Tynan DeBold Co-authored-by: vladimir-mck <106236933+vladimir-mck@users.noreply.github.com> Co-authored-by: Danny Farah Co-authored-by: Kevin Koga Co-authored-by: Mate Scharnitzky Co-authored-by: Tomer Shor Co-authored-by: Pierre-Yves Mousset Co-authored-by: Bela Chupal Co-authored-by: Khangjrakpam Arjun Co-authored-by: Joel <35801847+datajoely@users.noreply.github.com> Co-authored-by: felixscherz <62542827+felixscherz@users.noreply.github.com> Co-authored-by: Felix Scherz Co-authored-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Co-authored-by: Ankita Katiyar Co-authored-by: Onur Kuru Co-authored-by: Ahdra Merali <90615669+AhdraMeraliQB@users.noreply.github.com> Co-authored-by: Yolan Honoré-Rougé <29451317+Galileo-Galilei@users.noreply.github.com> Co-authored-by: samuel-lee-sj <143670400+samuel-lee-sj@users.noreply.github.com> Co-authored-by: rashidakanchwala <37628668+rashidakanchwala@users.noreply.github.com> Co-authored-by: ravi-kumar-pilla Co-authored-by: Felipe Monroy <53243319+felipemonroy@users.noreply.github.com> Co-authored-by: Manuel Spierenburg Co-authored-by: Riley Brady Co-authored-by: andrewcao1 <111729944+andrewcao1@users.noreply.github.com> Co-authored-by: Eduardo <144208874+eromerobilbomatica@users.noreply.github.com> Co-authored-by: eduardo Co-authored-by: lrcouto Co-authored-by: Jerome Asselin <93328446+jerome-asselin-buspatrol@users.noreply.github.com> Co-authored-by: Elena Khaustova Co-authored-by: Elena Khaustova Co-authored-by: Ahdra Merali Co-authored-by: ElenaKhaustova <157851531+ElenaKhaustova@users.noreply.github.com> Co-authored-by: charles <3221512+charlesbmi@users.noreply.github.com> Co-authored-by: Ian Whalen --- kedro-datasets/RELEASE.md | 6 + .../api/kedro_datasets_experimental.rst | 1 + .../rioxarray/__init__.py | 13 ++ .../rioxarray/geotiff_dataset.py | 209 ++++++++++++++++++ .../tests/rioxarray/__init__.py | 0 .../tests/rioxarray/cog.tif | Bin 0 -> 242256 bytes .../tests/rioxarray/test_geotiff_dataset.py | 181 +++++++++++++++ .../tests/rioxarray/test_multi1.tif | Bin 0 -> 948 bytes .../tests/rioxarray/test_multi2.tif | Bin 0 -> 842 bytes kedro-datasets/pyproject.toml | 5 + 10 files changed, 415 insertions(+) create mode 100644 kedro-datasets/kedro_datasets_experimental/rioxarray/__init__.py create mode 100644 kedro-datasets/kedro_datasets_experimental/rioxarray/geotiff_dataset.py create mode 100644 kedro-datasets/kedro_datasets_experimental/tests/rioxarray/__init__.py create mode 100644 kedro-datasets/kedro_datasets_experimental/tests/rioxarray/cog.tif create mode 100644 kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_geotiff_dataset.py create mode 100644 kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_multi1.tif create mode 100644 kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_multi2.tif diff --git a/kedro-datasets/RELEASE.md b/kedro-datasets/RELEASE.md index 9bd3cb0ff..48d607efd 100755 --- a/kedro-datasets/RELEASE.md +++ b/kedro-datasets/RELEASE.md @@ -9,10 +9,13 @@ | `langchain.ChatCohereDataset` | A dataset for loading a ChatCohere langchain model. | `kedro_datasets_experimental.langchain` | | `langchain.OpenAIEmbeddingsDataset` | A dataset for loading a OpenAIEmbeddings langchain model. | `kedro_datasets_experimental.langchain` | | `langchain.ChatOpenAIDataset` | A dataset for loading a ChatOpenAI langchain model. | `kedro_datasets_experimental.langchain` | +| `rioxarray.GeoTIFFDataset` | A dataset for loading and saving geotiff raster data | `kedro_datasets_experimental.rioxarray` | | `netcdf.NetCDFDataset` | A dataset for loading and saving "*.nc" files. | `kedro_datasets_experimental.netcdf` | + * `netcdf.NetCDFDataset` moved from `kedro_datasets` to `kedro_datasets_experimental`. * Added the following new core datasets: + | Type | Description | Location | |-------------------------------------|-----------------------------------------------------------|-----------------------------------------| | `dask.CSVDataset` | A dataset for loading a CSV files using `dask` | `kedro_datasets.dask` | @@ -22,6 +25,9 @@ ## Community contributions Many thanks to the following Kedroids for contributing PRs to this release: +* [Ian Whalen](https://github.com/ianwhale) +* [Charles Guan](https://github.com/charlesbmi) +* [Thomas Gölles](https://github.com/tgoelles) * [Lukas Innig](https://github.com/derluke) * [Michael Sexton](https://github.com/michaelsexton) diff --git a/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst b/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst index fbae09589..34cb3caf8 100644 --- a/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst +++ b/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst @@ -16,3 +16,4 @@ kedro_datasets_experimental kedro_datasets_experimental.langchain.ChatOpenAIDataset kedro_datasets_experimental.langchain.OpenAIEmbeddingsDataset kedro_datasets_experimental.netcdf.NetCDFDataset + kedro_datasets_experimental.rioxarray.GeoTIFFDataset diff --git a/kedro-datasets/kedro_datasets_experimental/rioxarray/__init__.py b/kedro-datasets/kedro_datasets_experimental/rioxarray/__init__.py new file mode 100644 index 000000000..b1f52ce01 --- /dev/null +++ b/kedro-datasets/kedro_datasets_experimental/rioxarray/__init__.py @@ -0,0 +1,13 @@ +"""``AbstractDataset`` implementation to load/save data from/to a geospatial raster files.""" +from __future__ import annotations + +from typing import Any + +import lazy_loader as lazy + +# https://github.com/pylint-dev/pylint/issues/4300#issuecomment-1043601901 +GeoTIFFDataset: Any + +__getattr__, __dir__, __all__ = lazy.attach( + __name__, submod_attrs={"geotiff_dataset": ["GeoTIFFDataset"]} +) diff --git a/kedro-datasets/kedro_datasets_experimental/rioxarray/geotiff_dataset.py b/kedro-datasets/kedro_datasets_experimental/rioxarray/geotiff_dataset.py new file mode 100644 index 000000000..b69dea574 --- /dev/null +++ b/kedro-datasets/kedro_datasets_experimental/rioxarray/geotiff_dataset.py @@ -0,0 +1,209 @@ +"""GeoTIFFDataset loads geospatial raster data and saves it to a local geoiff file. The +underlying functionality is supported by rioxarray and xarray. A read rasterdata file +returns a xarray.DataArray object. +""" +import logging +from copy import deepcopy +from pathlib import PurePosixPath +from typing import Any + +import fsspec +import rasterio +import rioxarray as rxr +import xarray +from kedro.io import AbstractVersionedDataset, DatasetError +from kedro.io.core import Version, get_filepath_str, get_protocol_and_path +from rasterio.crs import CRS +from rasterio.transform import from_bounds + +logger = logging.getLogger(__name__) + +SUPPORTED_DIMS = [("band", "x", "y"), ("x", "y")] +DEFAULT_NO_DATA_VALUE = -9999 +SUPPORTED_FILE_FORMATS = [".tif", ".tiff"] + + +class GeoTIFFDataset(AbstractVersionedDataset[xarray.DataArray, xarray.DataArray]): + """``GeoTIFFDataset`` loads and saves rasterdata files and reads them as xarray + DataArrays. The underlying functionality is supported by rioxarray, rasterio and xarray. + + Reading and writing of single and multiband GeoTIFFs data is supported. There are sanity checks to ensure that a coordinate reference system (CRS) is present. + Supported dimensions are ("band", "x", "y") and ("x", "y") and xarray.DataArray with other dimension can not be saved to a GeoTIFF file. + Have a look at netcdf if this is what you need. + + + .. code-block:: yaml + + sentinal_data: + type: rioxarray.GeoTIFFDataset + filepath: sentinal_data.tif + + Example usage for the + `Python API `_: + + .. code-block:: pycon + + >>> from kedro_datasets.rioxarray import GeoTIFFDataset + >>> import xarray as xr + >>> import numpy as np + >>> + >>> data = xr.DataArray( + ... np.random.randn(2, 3, 2), + ... dims=("band", "y", "x"), + ... coords={"band": [1, 2], "y": [0.5, 1.5, 2.5], "x": [0.5, 1.5]} + ... ) + >>> data_crs = data.rio.write_crs("epsg:4326") + >>> data_spatial_dims = data_crs.rio.set_spatial_dims("x", "y") + >>> dataset = GeoTIFFDataset(filepath="test.tif") + >>> dataset.save(data_spatial_dims) + >>> reloaded = dataset.load() + >>> xr.testing.assert_allclose(data_spatial_dims, reloaded, rtol=1e-5) + + """ + + DEFAULT_LOAD_ARGS: dict[str, Any] = {} + DEFAULT_SAVE_ARGS: dict[str, Any] = {} + + def __init__( # noqa: PLR0913 + self, + *, + filepath: str, + load_args: dict[str, Any] | None = None, + save_args: dict[str, Any] | None = None, + version: Version | None = None, + metadata: dict[str, Any] | None = None, + ): + """Creates a new instance of ``GeoTIFFDataset`` pointing to a concrete + geospatial raster data file. + + + Args: + filepath: Filepath in POSIX format to a rasterdata file. + The prefix should be any protocol supported by ``fsspec``. + load_args: rioxarray options for loading rasterdata files. + Here you can find all available arguments: + https://corteva.github.io/rioxarray/html/rioxarray.html#rioxarray-open-rasterio + All defaults are preserved. + save_args: options for rioxarray for data without the band dimension and rasterio otherwhise. + version: If specified, should be an instance of + ``kedro.io.core.Version``. If its ``load`` attribute is + None, the latest version will be loaded. If its ``save`` + attribute is None, save version will be autogenerated. + metadata: Any arbitrary metadata. + This is ignored by Kedro, but may be consumed by users or external plugins. + """ + protocol, path = get_protocol_and_path(filepath, version) + self._protocol = protocol + self._fs = fsspec.filesystem(self._protocol) + self.metadata = metadata + + super().__init__( + filepath=PurePosixPath(path), + version=version, + exists_function=self._fs.exists, + glob_function=self._fs.glob, + ) + + # Handle default load and save arguments + self._load_args = deepcopy(self.DEFAULT_LOAD_ARGS) + if load_args is not None: + self._load_args.update(load_args) + self._save_args = deepcopy(self.DEFAULT_SAVE_ARGS) + if save_args is not None: + self._save_args.update(save_args) + + def _describe(self) -> dict[str, Any]: + return { + "filepath": self._filepath, + "protocol": self._protocol, + "load_args": self._load_args, + "save_args": self._save_args, + "version": self._version, + } + + def _load(self) -> xarray.DataArray: + load_path = self._get_load_path().as_posix() + with rasterio.open(load_path) as data: + tags = data.tags() + data = rxr.open_rasterio(load_path, **self._load_args) + data.attrs.update(tags) + self._sanity_check(data) + logger.info(f"found coordinate rerence system {data.rio.crs}") + return data + + def _save(self, data: xarray.DataArray) -> None: + self._sanity_check(data) + save_path = get_filepath_str(self._get_save_path(), self._protocol) + if not save_path.endswith(tuple(SUPPORTED_FILE_FORMATS)): + raise ValueError( + f"Unsupported file format. Supported formats are: {SUPPORTED_FILE_FORMATS}" + ) + if "band" in data.dims: + self._save_multiband(data, save_path) + else: + data.rio.to_raster(save_path, **self._save_args) + self._fs.invalidate_cache(save_path) + + def _exists(self) -> bool: + try: + load_path = get_filepath_str(self._get_load_path(), self._protocol) + except DatasetError: + return False + + return self._fs.exists(load_path) + + def _release(self) -> None: + super()._release() + self._invalidate_cache() + + def _invalidate_cache(self) -> None: + """Invalidate underlying filesystem caches.""" + filepath = get_filepath_str(self._filepath, self._protocol) + self._fs.invalidate_cache(filepath) + + def _save_multiband(self, data: xarray.DataArray, save_path: str): + """Saving multiband raster data to a geotiff file.""" + bands_data = [data.sel(band=band) for band in data.band.values] + transform = from_bounds( + west=data.x.min(), + south=data.y.min(), + east=data.x.max(), + north=data.y.max(), + width=data[0].shape[1], + height=data[0].shape[0], + ) + + nodata_value = ( + data.rio.nodata if data.rio.nodata is not None else DEFAULT_NO_DATA_VALUE + ) + crs = data.rio.crs + + meta = { + "driver": "GTiff", + "height": bands_data[0].shape[0], + "width": bands_data[0].shape[1], + "count": len(bands_data), + "dtype": str(bands_data[0].dtype), + "crs": crs, + "transform": transform, + "nodata": nodata_value, + } + with rasterio.open(save_path, "w", **meta) as dst: + for idx, band in enumerate(bands_data, start=1): + dst.write(band.data, idx, **self._save_args) + + def _sanity_check(self, data: xarray.DataArray) -> None: + """Perform sanity checks on the data to ensure it meets the requirements.""" + if not isinstance(data, xarray.DataArray): + raise NotImplementedError( + "Currently only supporting xarray.DataArray while saving raster data." + ) + + if not isinstance(data.rio.crs, CRS): + raise ValueError("Dataset lacks a coordinate reference system.") + + if all(set(data.dims) != set(dims) for dims in SUPPORTED_DIMS): + raise ValueError( + f"Data has unsupported dimensions: {data.dims}. Supported dimensions are: {SUPPORTED_DIMS}" + ) diff --git a/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/__init__.py b/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/cog.tif b/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/cog.tif new file mode 100644 index 0000000000000000000000000000000000000000..e2bc24a1ccd901e8970584b2c76a8f0149b3416e GIT binary patch literal 242256 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

!h<+Kgv&ZI!v?M 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 literal 0 HcmV?d00001 diff --git a/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_geotiff_dataset.py b/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_geotiff_dataset.py new file mode 100644 index 000000000..7f217eee6 --- /dev/null +++ b/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_geotiff_dataset.py @@ -0,0 +1,181 @@ +from pathlib import Path + +import numpy as np +import pytest +import rasterio +import xarray as xr +from kedro.io import DatasetError +from rasterio.crs import CRS + +from kedro_datasets_experimental.rioxarray.geotiff_dataset import GeoTIFFDataset + + +@pytest.fixture +def cog_file_path() -> str: + cog_file_path = Path(__file__).parent / "cog.tif" + return cog_file_path.as_posix() + +@pytest.fixture +def multi1_file_path() -> str: + path = Path(__file__).parent / "test_multi1.tif" + return path.as_posix() + +@pytest.fixture +def multi2_file_path() -> str: + path = Path(__file__).parent / "test_multi2.tif" + return path.as_posix() + +@pytest.fixture +def synthetic_xarray(): + """Create a synthetic xarray.DataArray with CRS information.""" + data = xr.DataArray( + np.random.rand(100, 100), + dims=("y", "x"), + coords={"x": np.linspace(0, 100, 100), "y": np.linspace(0, 100, 100)} + ) + data.rio.write_crs("epsg:4326", inplace=True) + return data + +@pytest.fixture +def synthetic_xarray_multiband(): + """Create a synthetic xarray.DataArray with CRS information.""" + data = xr.DataArray( + np.random.rand(10, 100, 100), + dims=("band", "y", "x"), + coords={"x": np.linspace(0, 100, 100), "y": np.linspace(0, 100, 100)} + ) + data.rio.write_crs("epsg:4326", inplace=True) + return data + +@pytest.fixture +def synthetic_xarray_many_vars_no_band(): + """Create a synthetic xarray.DataArray with CRS information.""" + data = xr.DataArray( + np.random.rand(2,3,4, 100, 100), + dims=("var1","var2","var3","y", "x"), + coords={"x": np.linspace(0, 100, 100), "y": np.linspace(0, 100, 100)} + ) + data.rio.write_crs("epsg:4326", inplace=True) + return data + + +@pytest.fixture +def cog_geotiff_dataset(cog_file_path, save_args) -> GeoTIFFDataset: + return GeoTIFFDataset(filepath=cog_file_path, save_args=save_args) + + +def test_load_cog_geotiff(cog_geotiff_dataset): + """Test loading cloud optimised geotiff reloading the data set.""" + loaded_xr = cog_geotiff_dataset.load() + assert isinstance(loaded_xr.rio.crs, CRS) + assert isinstance(loaded_xr, xr.DataArray) + assert loaded_xr.shape == (1, 500, 500) + assert loaded_xr.dims == ("band", "y", "x") + +def test_load_save_cog(tmp_path,cog_file_path): + """Test loading a multiband raster file.""" + dataset = GeoTIFFDataset(filepath=cog_file_path) + loaded_xr = dataset.load() + band1_data = loaded_xr.sel(band=1) + target_file = tmp_path / "tmp22.tif" + dataset_to = GeoTIFFDataset(filepath=str(target_file)) + dataset_to.save(loaded_xr) + reloaded_xr = dataset_to.load() + assert target_file.exists() + assert isinstance(loaded_xr.rio.crs, CRS) + assert isinstance(loaded_xr, xr.DataArray) + assert len(loaded_xr.band) == 1 + assert loaded_xr.dims == ("band", "y", "x") + assert loaded_xr.shape == (1, 500, 500) + assert np.isclose(band1_data.values.std(), 4688.72624578268) + assert (loaded_xr.values == reloaded_xr.values).all() + + + +def test_load_save_multi1(tmp_path,multi1_file_path): + """Test loading a multiband raster file.""" + dataset = GeoTIFFDataset(filepath=multi1_file_path) + dataset_to = GeoTIFFDataset(filepath=str(tmp_path / "tmp.tif")) + loaded_xr = dataset.load() + band1_data = loaded_xr.sel(band=1) + assert isinstance(loaded_xr.rio.crs, CRS) + assert isinstance(loaded_xr, xr.DataArray) + BAND_COUNT = 2 + assert len(loaded_xr.band) == BAND_COUNT + assert loaded_xr.shape == (BAND_COUNT, 5, 5) + assert loaded_xr.dims == ("band", "y", "x") + assert np.isclose(band1_data.values.std(), 0.015918046) + dataset_to.save(loaded_xr) + reloaded_xr = dataset_to.load() + assert (loaded_xr.values == reloaded_xr.values).all() + +def test_load_geotiff_with_tags(tmp_path, synthetic_xarray): + filepath = tmp_path / "test_with_tags.tif" + tags = {"TAG_KEY": "TAG_VALUE", "ANOTHER_TAG": "ANOTHER_VALUE"} + with rasterio.open( + filepath, "w", driver="GTiff", height=100, width=100, count=1, dtype=str(synthetic_xarray.dtype), + crs="EPSG:4326" + ) as dst: + dst.write(synthetic_xarray.values, 1) + dst.update_tags(**tags) + + dataset = GeoTIFFDataset(filepath=str(filepath)) + loaded_xr = dataset.load() + + assert loaded_xr.attrs["TAG_KEY"] == "TAG_VALUE" + assert loaded_xr.attrs["ANOTHER_TAG"] == "ANOTHER_VALUE" + + assert isinstance(loaded_xr, xr.DataArray) + assert isinstance(loaded_xr.rio.crs, CRS) + assert loaded_xr.shape == (1, 100, 100) + +def test_load_no_crs(multi2_file_path): + """Test loading a multiband raster file.""" + dataset = GeoTIFFDataset(filepath=multi2_file_path) + with pytest.raises(DatasetError): + dataset.load() + +def test_load_not_tif(): + """Test loading a multiband raster file.""" + dataset = GeoTIFFDataset(filepath="whatever.nc") + with pytest.raises(DatasetError): + dataset.load() + + +def test_exists(tmp_path, synthetic_xarray): + """Test `exists` method invocation for both existing and + nonexistent data set.""" + dataset = GeoTIFFDataset(filepath=str(tmp_path / "tmp.tif")) + assert not dataset.exists() + dataset.save(synthetic_xarray) + assert dataset.exists() + +@pytest.mark.parametrize("xarray_fixture", [ + "synthetic_xarray_multiband", + "synthetic_xarray", +]) +def test_save_and_load_geotiff(tmp_path, request, xarray_fixture): + """Test saving and reloading the data set.""" + xarray_data = request.getfixturevalue(xarray_fixture) + dataset = GeoTIFFDataset(filepath=str(tmp_path / "tmp.tif")) + dataset.save(xarray_data) + assert dataset.exists() + reloaded_xr = dataset.load() + assert isinstance(reloaded_xr, xr.DataArray) + assert isinstance(reloaded_xr.rio.crs, CRS) + assert reloaded_xr.dims == ("band", "y", "x") + assert (xarray_data.values == reloaded_xr.values).all() + +def test_save_and_load_geotiff_no_band(tmp_path, synthetic_xarray_many_vars_no_band): + """this test should fail because the data array has no band dimension""" + dataset = GeoTIFFDataset(filepath=str(tmp_path / "tmp.tif")) + with pytest.raises(DatasetError): + dataset.save(synthetic_xarray_many_vars_no_band) + +def test_load_missing_file(tmp_path): + """Check the error when trying to load missing file.""" + dataset = GeoTIFFDataset(filepath=str(tmp_path / "tmp.tif")) + assert not dataset._exists(), "File unexpectedly exists" + pattern = r"Failed while loading data from data set GeoTIFFDataset\(.*\)" + with pytest.raises(DatasetError, match=pattern): + dataset.load() diff --git a/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_multi1.tif b/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_multi1.tif new file mode 100644 index 0000000000000000000000000000000000000000..bfc0c6a2c2799a421306efabeb85368d9a52b38c GIT binary patch literal 948 zcmebD)MBtnAWrNHVM^Yn$q&Eo42I&n3vO)Tofsn762S_q7oCD&f79IvRApH!8*S9kRT>>(j zfnj4i6N4O(9R_j`9GEyjm@pbHft8_fTGA0Dv1EBLmt*IRD9;{$tqM)x38se)^m7kZYU~J@90}-uZ zke9Kt&Hh-3As)@{vv+vKQFTh*Zbw$F`D+6X=ou~nY@%O+}1f$c`!JX`CJ?`@52 zENva7C)o1y%G<^?&9VI~)@t+gR=Ta7%@rH{%?h@U6bfzo?s(f8_?z3Vy1v!6p!cSY zVNts6?(IUh^Dpq)r60R%v$;{-cCVC(t>z9jTU8-l+xYH7wi)wkZ3}D8+h)cD*&d4X zv`bp1Y0I0*YR7Pn$99X{YTK{!UbZoIakd*|`)ow)Yi*6&cG>RxWNc><;c0v0qqm(P z(9@KsnG#^!5lS;BfMHHbn&AT`99WuB1F~UhCJe}irI~3!cHDZ literal 0 HcmV?d00001 diff --git a/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_multi2.tif b/kedro-datasets/kedro_datasets_experimental/tests/rioxarray/test_multi2.tif new file mode 100644 index 0000000000000000000000000000000000000000..6dfbedb6a41b04eece2600018091958a70ded342 GIT binary patch literal 842 zcmcJNJxCl;6oudH#x2Aj6pbiGY?WvsDx|n~Bc$0C{Y!U=Tuo8t7h809oh#r=FEBbye+7@c%`zd(hZwfXy~}#7+g9yUZ~8y~d%EkM{8ijw-*qfRz1i}0zjDj88}2<5 zIvrHropQsiNuk7q@=xe(*)b{~QvLwmJQwO8Q62*qTnddt?}EPq`oweP{Yf_*SrW=_ zSFV94^NY}GpYjfP?zfPO{sL}9|BDyO)!>qKA!$`!1cyEfeeO~|M$f%{p`%gdS?KSs zgkBCPZ-ZC<2*q9H*Wm97^o%OcfUBp39yKfHgMTaw^9>bF^EtfXG cep;@;w`nOrIELo}UUHuKLAj6QR6RkN8+Rh8hX4Qo literal 0 HcmV?d00001 diff --git a/kedro-datasets/pyproject.toml b/kedro-datasets/pyproject.toml index b4507af2c..f3012ea0d 100644 --- a/kedro-datasets/pyproject.toml +++ b/kedro-datasets/pyproject.toml @@ -167,9 +167,13 @@ langchain-openaiembeddingsdataset = ["langchain-openai~=0.1.7"] langchain-chatanthropicdataset = ["langchain-anthropic~=0.1.13", "langchain-community~=0.2.0"] langchain-chatcoheredataset = ["langchain-cohere~=0.1.5", "langchain-community~=0.2.0"] langchain = ["kedro-datasets[langchain-chatopenaidataset,langchain-openaiembeddingsdataset,langchain-chatanthropicdataset,langchain-chatcoheredataset ]"] + netcdf-netcdfdataset = ["h5netcdf>=1.2.0","netcdf4>=1.6.4","xarray>=2023.1.0"] netcdf = ["kedro-datasets[netcdf-netcdfdataset]"] +rioxarray-geotiffdataset = ["rioxarray>=0.15.0"] +rioxarray = ["kedro-datasets[rioxarray-geotiffdataset]"] + # Docs requirements docs = [ "kedro-sphinx-theme==2024.4.0", @@ -271,6 +275,7 @@ experimental = [ "h5netcdf>=1.2.0", "netcdf4>=1.6.4", "xarray>=2023.1.0", + "rioxarray", ] # All requirements From fca6b4504ea46d695cc8c7d98be91bdd88c1cbef Mon Sep 17 00:00:00 2001 From: Nok Lam Chan Date: Fri, 5 Jul 2024 14:40:49 +0100 Subject: [PATCH 4/9] build(datasets): 4.0.0 (#753) * bump 4.0.0 Signed-off-by: Nok * format Signed-off-by: Nok --------- Signed-off-by: Nok --- kedro-datasets/RELEASE.md | 17 +++++++++++++++-- kedro-datasets/kedro_datasets/__init__.py | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/kedro-datasets/RELEASE.md b/kedro-datasets/RELEASE.md index 48d607efd..a4931c1fa 100755 --- a/kedro-datasets/RELEASE.md +++ b/kedro-datasets/RELEASE.md @@ -1,5 +1,11 @@ # Upcoming Release ## Major features and improvements +## Bug fixes and other changes +## Breaking Changes +## Community contributions + +# Release 4.0.0 +## Major features and improvements * Added the following new **experimental** datasets: @@ -12,8 +18,6 @@ | `rioxarray.GeoTIFFDataset` | A dataset for loading and saving geotiff raster data | `kedro_datasets_experimental.rioxarray` | | `netcdf.NetCDFDataset` | A dataset for loading and saving "*.nc" files. | `kedro_datasets_experimental.netcdf` | -* `netcdf.NetCDFDataset` moved from `kedro_datasets` to `kedro_datasets_experimental`. - * Added the following new core datasets: | Type | Description | Location | @@ -22,6 +26,12 @@ * Extended preview feature to `yaml.YAMLDataset`. +## Bug fixes and other changes +* Added `metadata` parameter for a few datasets + +## Breaking Changes +* `netcdf.NetCDFDataset` moved from `kedro_datasets` to `kedro_datasets_experimental`. + ## Community contributions Many thanks to the following Kedroids for contributing PRs to this release: @@ -30,6 +40,9 @@ Many thanks to the following Kedroids for contributing PRs to this release: * [Thomas Gölles](https://github.com/tgoelles) * [Lukas Innig](https://github.com/derluke) * [Michael Sexton](https://github.com/michaelsexton) +* [michal-mmm](https://github.com/michal-mmm) + + # Release 3.0.1 diff --git a/kedro-datasets/kedro_datasets/__init__.py b/kedro-datasets/kedro_datasets/__init__.py index dc901c852..def06a600 100644 --- a/kedro-datasets/kedro_datasets/__init__.py +++ b/kedro-datasets/kedro_datasets/__init__.py @@ -1,7 +1,7 @@ """``kedro_datasets`` is where you can find all of Kedro's data connectors.""" __all__ = ["KedroDeprecationWarning"] -__version__ = "3.0.1" +__version__ = "4.0.0" import sys import warnings From be99fecf6cf5ac8f6a0a717c56b06dbc148b26eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Cano=20Rodr=C3=ADguez?= Date: Mon, 8 Jul 2024 12:57:02 +0200 Subject: [PATCH 5/9] ci: Upgrade `uv` to avoid timeouts (#749) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upgrade uv in CI Signed-off-by: Juan Luis Cano Rodríguez Co-authored-by: Ankita Katiyar <110245118+ankatiyar@users.noreply.github.com> --- .github/workflows/e2e-tests.yml | 4 +--- .github/workflows/kedro-datasets.yml | 4 +--- .github/workflows/lint.yml | 4 +--- .github/workflows/unit-tests.yml | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index d56e01c6b..8a36e5db6 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -12,8 +12,6 @@ on: jobs: e2e-tests: - env: - UV_HTTP_TIMEOUT: 1000 defaults: run: shell: bash @@ -33,7 +31,7 @@ jobs: restore-keys: ${{inputs.plugin}} - name: Install uv run: | - python -m pip install "uv==0.1.13" + python -m pip install "uv==0.2.21" - name: Install dependencies run: | cd ${{ inputs.plugin }} diff --git a/.github/workflows/kedro-datasets.yml b/.github/workflows/kedro-datasets.yml index e28cacc57..991a12731 100644 --- a/.github/workflows/kedro-datasets.yml +++ b/.github/workflows/kedro-datasets.yml @@ -38,8 +38,6 @@ jobs: check-docs: runs-on: ubuntu-latest - env: - UV_HTTP_TIMEOUT: 1000 steps: - name: Checkout code uses: actions/checkout@v4 @@ -55,7 +53,7 @@ jobs: restore-keys: kedro-datasets - name: Install uv run: | - python -m pip install "uv==0.1.13" + python -m pip install "uv==0.2.21" - name: Install dependencies run: | cd kedro-datasets diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 400fe994c..1594b493d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,8 +12,6 @@ on: jobs: lint: - env: - UV_HTTP_TIMEOUT: 1000 defaults: run: shell: bash @@ -33,7 +31,7 @@ jobs: restore-keys: ${{inputs.plugin}} - name: Install uv run: | - python -m pip install "uv==0.1.13" + python -m pip install "uv==0.2.21" - name: Install dependencies run: | cd ${{ inputs.plugin }} diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 27e437315..088a55d11 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -14,8 +14,6 @@ jobs: unit-tests: runs-on: ${{ inputs.os }} - env: - UV_HTTP_TIMEOUT: 1000 defaults: run: shell: bash @@ -45,7 +43,7 @@ jobs: uses: microsoft/setup-msbuild@v2 - name: Install uv run: | - python -m pip install "uv==0.1.13" + python -m pip install "uv==0.2.21" - name: Install dependencies run: | cd ${{ inputs.plugin }} From aaa6a4d108513a791c951b404f29d953b5b7f4ad Mon Sep 17 00:00:00 2001 From: ElenaKhaustova <157851531+ElenaKhaustova@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:11:10 +0100 Subject: [PATCH 6/9] fix(telemetry): Masking test (#764) Fix telemetry masking test Signed-off-by: Elena Khaustova --- kedro-telemetry/tests/test_masking.py | 1 + 1 file changed, 1 insertion(+) diff --git a/kedro-telemetry/tests/test_masking.py b/kedro-telemetry/tests/test_masking.py index edd7efe93..778e85a54 100644 --- a/kedro-telemetry/tests/test_masking.py +++ b/kedro-telemetry/tests/test_masking.py @@ -20,6 +20,7 @@ PACKAGE_NAME = "cli_tools_dummy_package" DEFAULT_KEDRO_COMMANDS = [ "catalog", + "info", "ipython", "jupyter", "micropkg", From 7299bf0449d94ca67e06cedbad15b70274589f0a Mon Sep 17 00:00:00 2001 From: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:56:36 +0100 Subject: [PATCH 7/9] feat(telemetry): Implement telemetry message notification (#760) * Implement telemetry message notification Signed-off-by: Dmitry Sorokin * Fix docs build Signed-off-by: Dmitry Sorokin --------- Signed-off-by: Dmitry Sorokin --- .../docs/source/api/kedro_datasets.rst | 106 +++++++++--------- .../api/kedro_datasets_experimental.rst | 12 +- kedro-telemetry/kedro_telemetry/__init__.py | 4 + kedro-telemetry/kedro_telemetry/plugin.py | 18 +-- kedro-telemetry/tests/test_plugin.py | 47 ++++++-- 5 files changed, 112 insertions(+), 75 deletions(-) diff --git a/kedro-datasets/docs/source/api/kedro_datasets.rst b/kedro-datasets/docs/source/api/kedro_datasets.rst index 0109ebefc..4a7868d38 100644 --- a/kedro-datasets/docs/source/api/kedro_datasets.rst +++ b/kedro-datasets/docs/source/api/kedro_datasets.rst @@ -11,56 +11,56 @@ kedro_datasets :toctree: :template: autosummary/class.rst - kedro_datasets.api.APIDataset - kedro_datasets.biosequence.BioSequenceDataset - kedro_datasets.dask.CSVDataset - kedro_datasets.dask.ParquetDataset - kedro_datasets.databricks.ManagedTableDataset - kedro_datasets.email.EmailMessageDataset - kedro_datasets.geopandas.GeoJSONDataset - kedro_datasets.holoviews.HoloviewsWriter - kedro_datasets.huggingface.HFDataset - kedro_datasets.huggingface.HFTransformerPipelineDataset - kedro_datasets.ibis.TableDataset - kedro_datasets.json.JSONDataset - kedro_datasets.matlab.MatlabDataset - kedro_datasets.matplotlib.MatplotlibWriter - kedro_datasets.networkx.GMLDataset - kedro_datasets.networkx.GraphMLDataset - kedro_datasets.networkx.JSONDataset - kedro_datasets.pandas.CSVDataset - kedro_datasets.pandas.DeltaTableDataset - kedro_datasets.pandas.ExcelDataset - kedro_datasets.pandas.FeatherDataset - kedro_datasets.pandas.GBQQueryDataset - kedro_datasets.pandas.GBQTableDataset - kedro_datasets.pandas.GenericDataset - kedro_datasets.pandas.HDFDataset - kedro_datasets.pandas.JSONDataset - kedro_datasets.pandas.ParquetDataset - kedro_datasets.pandas.SQLQueryDataset - kedro_datasets.pandas.SQLTableDataset - kedro_datasets.pandas.XMLDataset - kedro_datasets.partitions.IncrementalDataset - kedro_datasets.partitions.PartitionedDataset - kedro_datasets.pickle.PickleDataset - kedro_datasets.pillow.ImageDataset - kedro_datasets.plotly.JSONDataset - kedro_datasets.plotly.PlotlyDataset - kedro_datasets.polars.CSVDataset - kedro_datasets.polars.EagerPolarsDataset - kedro_datasets.polars.LazyPolarsDataset - kedro_datasets.redis.PickleDataset - kedro_datasets.snowflake.SnowparkTableDataset - kedro_datasets.spark.DeltaTableDataset - kedro_datasets.spark.SparkDataset - kedro_datasets.spark.SparkHiveDataset - kedro_datasets.spark.SparkJDBCDataset - kedro_datasets.spark.SparkStreamingDataset - kedro_datasets.svmlight.SVMLightDataset - kedro_datasets.tensorflow.TensorFlowModelDataset - kedro_datasets.text.TextDataset - kedro_datasets.tracking.JSONDataset - kedro_datasets.tracking.MetricsDataset - kedro_datasets.video.VideoDataset - kedro_datasets.yaml.YAMLDataset + api.APIDataset + biosequence.BioSequenceDataset + dask.CSVDataset + dask.ParquetDataset + databricks.ManagedTableDataset + email.EmailMessageDataset + geopandas.GeoJSONDataset + holoviews.HoloviewsWriter + huggingface.HFDataset + huggingface.HFTransformerPipelineDataset + ibis.TableDataset + json.JSONDataset + matlab.MatlabDataset + matplotlib.MatplotlibWriter + networkx.GMLDataset + networkx.GraphMLDataset + networkx.JSONDataset + pandas.CSVDataset + pandas.DeltaTableDataset + pandas.ExcelDataset + pandas.FeatherDataset + pandas.GBQQueryDataset + pandas.GBQTableDataset + pandas.GenericDataset + pandas.HDFDataset + pandas.JSONDataset + pandas.ParquetDataset + pandas.SQLQueryDataset + pandas.SQLTableDataset + pandas.XMLDataset + partitions.IncrementalDataset + partitions.PartitionedDataset + pickle.PickleDataset + pillow.ImageDataset + plotly.JSONDataset + plotly.PlotlyDataset + polars.CSVDataset + polars.EagerPolarsDataset + polars.LazyPolarsDataset + redis.PickleDataset + snowflake.SnowparkTableDataset + spark.DeltaTableDataset + spark.SparkDataset + spark.SparkHiveDataset + spark.SparkJDBCDataset + spark.SparkStreamingDataset + svmlight.SVMLightDataset + tensorflow.TensorFlowModelDataset + text.TextDataset + tracking.JSONDataset + tracking.MetricsDataset + video.VideoDataset + yaml.YAMLDataset diff --git a/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst b/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst index 34cb3caf8..c6e443564 100644 --- a/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst +++ b/kedro-datasets/docs/source/api/kedro_datasets_experimental.rst @@ -11,9 +11,9 @@ kedro_datasets_experimental :toctree: :template: autosummary/class.rst - kedro_datasets_experimental.langchain.ChatAnthropicDataset - kedro_datasets_experimental.langchain.ChatCohereDataset - kedro_datasets_experimental.langchain.ChatOpenAIDataset - kedro_datasets_experimental.langchain.OpenAIEmbeddingsDataset - kedro_datasets_experimental.netcdf.NetCDFDataset - kedro_datasets_experimental.rioxarray.GeoTIFFDataset + langchain.ChatAnthropicDataset + langchain.ChatCohereDataset + langchain.ChatOpenAIDataset + langchain.OpenAIEmbeddingsDataset + netcdf.NetCDFDataset + rioxarray.GeoTIFFDataset diff --git a/kedro-telemetry/kedro_telemetry/__init__.py b/kedro-telemetry/kedro_telemetry/__init__.py index 5c139beba..c8c39dd9b 100644 --- a/kedro-telemetry/kedro_telemetry/__init__.py +++ b/kedro-telemetry/kedro_telemetry/__init__.py @@ -1,3 +1,7 @@ """Kedro plugin for collecting Kedro usage data.""" __version__ = "0.5.0" + +import logging + +logging.getLogger(__name__).setLevel(logging.INFO) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index c903411fd..d430d0fce 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -163,12 +163,20 @@ def before_command_run( consent = _check_for_telemetry_consent(project_metadata.project_path) if not consent: - logger.debug( + logger.info( "Kedro-Telemetry is installed, but you have opted out of " "sharing usage analytics so none will be collected.", ) return + logger.info( + "Kedro is sending anonymous usage data with the sole purpose of improving the product. " + "No personal data or IP addresses are stored on our side. " + "If you want to opt out, set the `KEDRO_DISABLE_TELEMETRY` or `DO_NOT_TRACK` environment variables, " + "or create a `.telemetry` file in the current working directory with the contents `consent: false`. " + "Read more at https://docs.kedro.org/en/stable/configuration/telemetry.html" + ) + # get KedroCLI and its structure from actual project root cli = KedroCLI(project_path=project_metadata.project_path) cli_struct = _get_cli_structure(cli_obj=cli, get_help=False) @@ -177,7 +185,6 @@ def before_command_run( ) main_command = masked_command_args[0] if masked_command_args else "kedro" - logger.debug("You have opted into product usage analytics.") user_uuid = _get_or_create_uuid() project_properties = _get_project_properties( user_uuid, project_metadata.project_path / PYPROJECT_CONFIG_NAME @@ -219,15 +226,10 @@ def after_context_created(self, context): @hook_impl def after_catalog_created(self, catalog): + # The user notification message is sent only once per command during the before_command_run hook if not self.consent: - logger.debug( - "Kedro-Telemetry is installed, but you have opted out of " - "sharing usage analytics so none will be collected.", - ) return - logger.debug("You have opted into product usage analytics.") - default_pipeline = pipelines.get("__default__") # __default__ user_uuid = _get_or_create_uuid() diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index f43718b70..bfed862fa 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -1,3 +1,4 @@ +import logging import sys from pathlib import Path @@ -121,7 +122,7 @@ def fake_sub_pipeline(): class TestKedroTelemetryCLIHooks: - def test_before_command_run(self, mocker, fake_metadata): + def test_before_command_run(self, mocker, fake_metadata, caplog): mocker.patch( "kedro_telemetry.plugin._check_for_telemetry_consent", return_value=True ) @@ -139,9 +140,10 @@ def test_before_command_run(self, mocker, fake_metadata): ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") - telemetry_hook = KedroTelemetryCLIHooks() - command_args = ["--version"] - telemetry_hook.before_command_run(fake_metadata, command_args) + with caplog.at_level(logging.INFO): + telemetry_hook = KedroTelemetryCLIHooks() + command_args = ["--version"] + telemetry_hook.before_command_run(fake_metadata, command_args) expected_properties = { "username": "user_uuid", "project_id": "digested", @@ -170,6 +172,20 @@ def test_before_command_run(self, mocker, fake_metadata): ), ] assert mocked_heap_call.call_args_list == expected_calls + assert any( + "Kedro is sending anonymous usage data with the sole purpose of improving the product. " + "No personal data or IP addresses are stored on our side. " + "If you want to opt out, set the `KEDRO_DISABLE_TELEMETRY` or `DO_NOT_TRACK` environment variables, " + "or create a `.telemetry` file in the current working directory with the contents `consent: false`. " + "Read more at https://docs.kedro.org/en/stable/configuration/telemetry.html" + in record.message + for record in caplog.records + ) + assert not any( + "Kedro-Telemetry is installed, but you have opted out of " + "sharing usage analytics so none will be collected." in record.message + for record in caplog.records + ) def test_before_command_run_with_tools(self, mocker, fake_metadata): mocker.patch( @@ -276,17 +292,32 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): assert mocked_heap_call.call_args_list == expected_calls - def test_before_command_run_no_consent_given(self, mocker, fake_metadata): + def test_before_command_run_no_consent_given(self, mocker, fake_metadata, caplog): mocker.patch( "kedro_telemetry.plugin._check_for_telemetry_consent", return_value=False ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") - telemetry_hook = KedroTelemetryCLIHooks() - command_args = ["--version"] - telemetry_hook.before_command_run(fake_metadata, command_args) + with caplog.at_level(logging.INFO): + telemetry_hook = KedroTelemetryCLIHooks() + command_args = ["--version"] + telemetry_hook.before_command_run(fake_metadata, command_args) mocked_heap_call.assert_not_called() + assert not any( + "Kedro is sending anonymous usage data with the sole purpose of improving the product. " + "No personal data or IP addresses are stored on our side. " + "If you want to opt out, set the `KEDRO_DISABLE_TELEMETRY` or `DO_NOT_TRACK` environment variables, " + "or create a `.telemetry` file in the current working directory with the contents `consent: false`. " + "Read more at https://docs.kedro.org/en/latest/configuration/telemetry.html" + in record.message + for record in caplog.records + ) + assert any( + "Kedro-Telemetry is installed, but you have opted out of " + "sharing usage analytics so none will be collected." in record.message + for record in caplog.records + ) def test_before_command_run_connection_error(self, mocker, fake_metadata, caplog): mocker.patch( From 0ea4218418c52f94c4278044d7ab44ad3d42b749 Mon Sep 17 00:00:00 2001 From: Nok Lam Chan Date: Tue, 16 Jul 2024 16:17:27 +0100 Subject: [PATCH 8/9] feat(telemetry): Introduce `DO_NO_TRACK` and `KEDRO_DISABLE_TELEMETRY` (#762) * add env var to skip telemetry Signed-off-by: Nok Lam Chan * release note Signed-off-by: Nok Lam Chan * update README Signed-off-by: Nok Lam Chan * fix test Signed-off-by: Nok Lam Chan * Change constant to tuple to avoid random test error Signed-off-by: Nok Lam Chan * linting Signed-off-by: Nok Lam Chan * fix typo Signed-off-by: Nok --------- Signed-off-by: Nok Lam Chan Signed-off-by: Nok Co-authored-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> --- kedro-telemetry/README.md | 1 + kedro-telemetry/RELEASE.md | 1 + kedro-telemetry/kedro_telemetry/plugin.py | 8 ++++++++ kedro-telemetry/tests/test_plugin.py | 13 +++++++++++++ 4 files changed, 23 insertions(+) diff --git a/kedro-telemetry/README.md b/kedro-telemetry/README.md index 47584a3e4..c5ca2f816 100644 --- a/kedro-telemetry/README.md +++ b/kedro-telemetry/README.md @@ -45,6 +45,7 @@ To withdraw consent, you can change the `consent` variable to `false` in `.telem ```yaml consent: false ``` +You can also set `DO_NOT_TRACK` or `KEDRO_DISABLE_TELEMETRY` environment variable to `True`. Or you can uninstall the plugin: diff --git a/kedro-telemetry/RELEASE.md b/kedro-telemetry/RELEASE.md index f50ecaf7c..f92ddf548 100644 --- a/kedro-telemetry/RELEASE.md +++ b/kedro-telemetry/RELEASE.md @@ -1,4 +1,5 @@ # Upcoming release +* Added `DO_NOT_TRACK` and `KEDRO_DISABLE_TELEMETRY` environment variables to skip telemetry. # Release 0.5.0 * Updated the plugin to generate a unique project UUID for kedro project and store it in `pyproject.toml`. diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index d430d0fce..fc151cd9b 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -42,6 +42,10 @@ "TRAVIS", # https://docs.travis-ci.com/user/environment-variables/#default-environment-variables "BUILDKITE", # https://buildkite.com/docs/pipelines/environment-variables } +_SKIP_TELEMETRY_ENV_VAR_KEYS = ( + "DO_NOT_TRACK", + "KEDRO_DISABLE_TELEMETRY", +) TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" CONFIG_FILENAME = "telemetry.toml" PYPROJECT_CONFIG_NAME = "pyproject.toml" @@ -353,6 +357,10 @@ def _check_for_telemetry_consent(project_path: Path) -> bool: Telemetry is considered as opt-in otherwise. """ telemetry_file_path = project_path / ".telemetry" + + for env_var in _SKIP_TELEMETRY_ENV_VAR_KEYS: + if os.environ.get(env_var): + return False if telemetry_file_path.exists(): with open(telemetry_file_path, encoding="utf-8") as telemetry_file: telemetry = yaml.safe_load(telemetry_file) diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index bfed862fa..68ab01465 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -14,6 +14,7 @@ from kedro_telemetry import __version__ as TELEMETRY_VERSION from kedro_telemetry.plugin import ( + _SKIP_TELEMETRY_ENV_VAR_KEYS, KNOWN_CI_ENV_VAR_KEYS, KedroTelemetryCLIHooks, KedroTelemetryProjectHooks, @@ -411,6 +412,18 @@ def test_check_for_telemetry_consent_not_given(self, mocker, fake_metadata): assert not _check_for_telemetry_consent(fake_metadata.project_path) + @mark.parametrize("env_var", _SKIP_TELEMETRY_ENV_VAR_KEYS) + def test_check_for_telemetry_consent_skip_telemetry_with_env_var( + self, monkeypatch, fake_metadata, env_var + ): + monkeypatch.setenv(env_var, "True") + Path(fake_metadata.project_path, "conf").mkdir(parents=True) + telemetry_file_path = fake_metadata.project_path / ".telemetry" + with open(telemetry_file_path, "w", encoding="utf-8") as telemetry_file: + yaml.dump({"consent": True}, telemetry_file) + + assert not _check_for_telemetry_consent(fake_metadata.project_path) + def test_check_for_telemetry_consent_empty_file(self, mocker, fake_metadata): Path(fake_metadata.project_path, "conf").mkdir(parents=True) telemetry_file_path = fake_metadata.project_path / ".telemetry" From 142342d583a999517cfdaeda05a25fb76143503c Mon Sep 17 00:00:00 2001 From: Nok Lam Chan Date: Fri, 19 Jul 2024 17:05:36 +0100 Subject: [PATCH 9/9] feat(telemetry): Combine Telemetry hook to send heap event once (#766) --------- Signed-off-by: Nok Lam Chan Signed-off-by: Dmitry Sorokin <40151847+DimedS@users.noreply.github.com> Signed-off-by: Dmitry Sorokin --- kedro-telemetry/kedro_telemetry/plugin.py | 173 +++++++++++----------- kedro-telemetry/pyproject.toml | 4 +- kedro-telemetry/tests/test_plugin.py | 69 ++++----- 3 files changed, 115 insertions(+), 131 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index fc151cd9b..6afb3ef95 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -8,7 +8,6 @@ import os import sys import uuid -from copy import deepcopy from datetime import datetime from pathlib import Path from typing import Any @@ -153,103 +152,119 @@ def _generate_new_uuid(full_path: str) -> str: return "" -class KedroTelemetryCLIHooks: +class KedroTelemetryHook: """Hook to send CLI command data to Heap""" + def __init__(self): + self._consent = None + self._sent = False + self._event_properties = None + self._project_path = None + self._user_uuid = None + @cli_hook_impl def before_command_run( self, project_metadata: ProjectMetadata, command_args: list[str] ): """Hook implementation to send command run data to Heap""" - try: - if not project_metadata: # in package mode - return - - consent = _check_for_telemetry_consent(project_metadata.project_path) - if not consent: - logger.info( - "Kedro-Telemetry is installed, but you have opted out of " - "sharing usage analytics so none will be collected.", - ) - return - - logger.info( - "Kedro is sending anonymous usage data with the sole purpose of improving the product. " - "No personal data or IP addresses are stored on our side. " - "If you want to opt out, set the `KEDRO_DISABLE_TELEMETRY` or `DO_NOT_TRACK` environment variables, " - "or create a `.telemetry` file in the current working directory with the contents `consent: false`. " - "Read more at https://docs.kedro.org/en/stable/configuration/telemetry.html" - ) - # get KedroCLI and its structure from actual project root - cli = KedroCLI(project_path=project_metadata.project_path) - cli_struct = _get_cli_structure(cli_obj=cli, get_help=False) - masked_command_args = _mask_kedro_cli( - cli_struct=cli_struct, command_args=command_args - ) - main_command = masked_command_args[0] if masked_command_args else "kedro" + if not project_metadata: # in package mode + return - user_uuid = _get_or_create_uuid() - project_properties = _get_project_properties( - user_uuid, project_metadata.project_path / PYPROJECT_CONFIG_NAME - ) - cli_properties = _format_user_cli_data( - project_properties, masked_command_args - ) + self._consent = _check_for_telemetry_consent(project_metadata.project_path) + if not self._consent: + self._opt_out_notification() + return - _send_heap_event( - event_name=f"Command run: {main_command}", - identity=user_uuid, - properties=cli_properties, - ) + # get KedroCLI and its structure from actual project root + cli = KedroCLI(project_path=project_metadata.project_path) + cli_struct = _get_cli_structure(cli_obj=cli, get_help=False) + masked_command_args = _mask_kedro_cli( + cli_struct=cli_struct, command_args=command_args + ) - # send generic event too, so it's easier in data processing - generic_properties = deepcopy(cli_properties) - generic_properties["main_command"] = main_command - _send_heap_event( - event_name="CLI command", - identity=user_uuid, - properties=generic_properties, - ) - except Exception as exc: - logger.warning( - "Something went wrong in hook implementation to send command run data to Heap. " - "Exception: %s", - exc, - ) + self._user_uuid = _get_or_create_uuid() + event_properties = _get_project_properties( + self._user_uuid, project_metadata.project_path / PYPROJECT_CONFIG_NAME + ) + event_properties["command"] = ( + f"kedro {' '.join(masked_command_args)}" if masked_command_args else "kedro" + ) + event_properties["main_command"] = ( + masked_command_args[0] if masked_command_args else "kedro" + ) -class KedroTelemetryProjectHooks: - """Hook to send project statistics data to Heap""" + self._event_properties = event_properties + + @cli_hook_impl + def after_command_run(self): + if self._consent and not self._sent: + self._send_telemetry_heap_event("CLI command") @hook_impl def after_context_created(self, context): """Hook implementation to send project statistics data to Heap""" - self.consent = _check_for_telemetry_consent(context.project_path) - self.project_path = context.project_path + + if self._consent is None: + self._consent = _check_for_telemetry_consent(context.project_path) + if not self._consent: + self._opt_out_notification() + self._project_path = context.project_path @hook_impl def after_catalog_created(self, catalog): - # The user notification message is sent only once per command during the before_command_run hook - if not self.consent: + if self._consent is False: return default_pipeline = pipelines.get("__default__") # __default__ - user_uuid = _get_or_create_uuid() - project_properties = _get_project_properties( - user_uuid, self.project_path / PYPROJECT_CONFIG_NAME + if not self._user_uuid: + self._user_uuid = _get_or_create_uuid() + + if not self._event_properties: + self._event_properties = _get_project_properties( + self._user_uuid, self._project_path / PYPROJECT_CONFIG_NAME + ) + + project_properties = _format_project_statistics_data( + catalog, default_pipeline, pipelines ) + self._event_properties.update(project_properties) + + self._send_telemetry_heap_event("Kedro Project Statistics") - project_statistics_properties = _format_project_statistics_data( - project_properties, catalog, default_pipeline, pipelines + def _opt_out_notification(self): + logger.info( + "Kedro-Telemetry is installed, but you have opted out of " + "sharing usage analytics so none will be collected.", ) - _send_heap_event( - event_name="Kedro Project Statistics", - identity=user_uuid, - properties=project_statistics_properties, + + def _send_telemetry_heap_event(self, event_name: str): + """Hook implementation to send command run data to Heap""" + + logger.info( + "Kedro is sending anonymous usage data with the sole purpose of improving the product. " + "No personal data or IP addresses are stored on our side. " + "If you want to opt out, set the `KEDRO_DISABLE_TELEMETRY` or `DO_NOT_TRACK` environment variables, " + "or create a `.telemetry` file in the current working directory with the contents `consent: false`. " + "Read more at https://docs.kedro.org/en/stable/configuration/telemetry.html" ) + try: + _send_heap_event( + event_name=event_name, + identity=self._user_uuid, + properties=self._event_properties, + ) + self._sent = True + except Exception as exc: + logger.warning( + "Something went wrong in hook implementation to send command run data to Heap. " + "Exception: %s", + exc, + ) + def _is_known_ci_env(known_ci_env_var_keys: set[str]): # Most CI tools will set the CI environment variable to true @@ -281,33 +296,20 @@ def _get_project_properties(user_uuid: str, pyproject_path: Path) -> dict: return properties -def _format_user_cli_data( - properties: dict, - command_args: list[str], -): - """Add format CLI command data to send to Heap.""" - cli_properties = properties.copy() - cli_properties["command"] = ( - f"kedro {' '.join(command_args)}" if command_args else "kedro" - ) - return cli_properties - - def _format_project_statistics_data( - properties: dict, catalog: DataCatalog, default_pipeline: Pipeline, project_pipelines: dict, ): """Add project statistics to send to Heap.""" - project_statistics_properties = properties.copy() + project_statistics_properties = {} project_statistics_properties["number_of_datasets"] = sum( 1 for c in catalog.list() if not c.startswith("parameters") and not c.startswith("params:") ) project_statistics_properties["number_of_nodes"] = ( - len(default_pipeline.nodes) if default_pipeline else None + len(default_pipeline.nodes) if default_pipeline else None # type: ignore ) project_statistics_properties["number_of_pipelines"] = len(project_pipelines.keys()) return project_statistics_properties @@ -375,5 +377,4 @@ def _is_valid_syntax(telemetry: Any) -> bool: ) -cli_hooks = KedroTelemetryCLIHooks() -project_hooks = KedroTelemetryProjectHooks() +telemetry_hook = KedroTelemetryHook() diff --git a/kedro-telemetry/pyproject.toml b/kedro-telemetry/pyproject.toml index bda085e85..32fb3d0b8 100644 --- a/kedro-telemetry/pyproject.toml +++ b/kedro-telemetry/pyproject.toml @@ -43,10 +43,10 @@ test = [ ] [project.entry-points."kedro.cli_hooks"] -kedro-telemetry = "kedro_telemetry.plugin:cli_hooks" +kedro-telemetry = "kedro_telemetry.plugin:telemetry_hook" [project.entry-points."kedro.hooks"] -kedro-telemetry = "kedro_telemetry.plugin:project_hooks" +kedro-telemetry = "kedro_telemetry.plugin:telemetry_hook" [tool.setuptools] include-package-data = true diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index 68ab01465..9c2ba65fd 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -16,8 +16,7 @@ from kedro_telemetry.plugin import ( _SKIP_TELEMETRY_ENV_VAR_KEYS, KNOWN_CI_ENV_VAR_KEYS, - KedroTelemetryCLIHooks, - KedroTelemetryProjectHooks, + KedroTelemetryHook, _check_for_telemetry_consent, _is_known_ci_env, ) @@ -122,7 +121,7 @@ def fake_sub_pipeline(): return mock_sub_pipeline -class TestKedroTelemetryCLIHooks: +class TestKedroTelemetryHook: def test_before_command_run(self, mocker, fake_metadata, caplog): mocker.patch( "kedro_telemetry.plugin._check_for_telemetry_consent", return_value=True @@ -141,10 +140,12 @@ def test_before_command_run(self, mocker, fake_metadata, caplog): ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") + with caplog.at_level(logging.INFO): - telemetry_hook = KedroTelemetryCLIHooks() + telemetry_hook = KedroTelemetryHook() command_args = ["--version"] telemetry_hook.before_command_run(fake_metadata, command_args) + telemetry_hook.after_command_run() expected_properties = { "username": "user_uuid", "project_id": "digested", @@ -152,8 +153,8 @@ def test_before_command_run(self, mocker, fake_metadata, caplog): "telemetry_version": TELEMETRY_VERSION, "python_version": sys.version, "os": sys.platform, - "command": "kedro --version", "is_ci_env": True, + "command": "kedro --version", } generic_properties = { **expected_properties, @@ -161,11 +162,6 @@ def test_before_command_run(self, mocker, fake_metadata, caplog): } expected_calls = [ - mocker.call( - event_name="Command run: --version", - identity="user_uuid", - properties=expected_properties, - ), mocker.call( event_name="CLI command", identity="user_uuid", @@ -208,9 +204,10 @@ def test_before_command_run_with_tools(self, mocker, fake_metadata): mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") mocker.patch("builtins.open", mocker.mock_open(read_data=MOCK_PYPROJECT_TOOLS)) mocker.patch("pathlib.Path.exists", return_value=True) - telemetry_hook = KedroTelemetryCLIHooks() + telemetry_hook = KedroTelemetryHook() command_args = ["--version"] telemetry_hook.before_command_run(fake_metadata, command_args) + telemetry_hook.after_command_run() expected_properties = { "username": "user_uuid", "project_id": "digested", @@ -229,11 +226,6 @@ def test_before_command_run_with_tools(self, mocker, fake_metadata): } expected_calls = [ - mocker.call( - event_name="Command run: --version", - identity="user_uuid", - properties=expected_properties, - ), mocker.call( event_name="CLI command", identity="user_uuid", @@ -260,9 +252,10 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") - telemetry_hook = KedroTelemetryCLIHooks() + telemetry_hook = KedroTelemetryHook() command_args = [] telemetry_hook.before_command_run(fake_metadata, command_args) + telemetry_hook.after_command_run() expected_properties = { "username": "user_uuid", "project_id": "digested", @@ -279,11 +272,6 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): } expected_calls = [ - mocker.call( - event_name="Command run: kedro", - identity="user_uuid", - properties=expected_properties, - ), mocker.call( event_name="CLI command", identity="user_uuid", @@ -300,7 +288,7 @@ def test_before_command_run_no_consent_given(self, mocker, fake_metadata, caplog mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") with caplog.at_level(logging.INFO): - telemetry_hook = KedroTelemetryCLIHooks() + telemetry_hook = KedroTelemetryHook() command_args = ["--version"] telemetry_hook.before_command_run(fake_metadata, command_args) @@ -324,13 +312,14 @@ def test_before_command_run_connection_error(self, mocker, fake_metadata, caplog mocker.patch( "kedro_telemetry.plugin._check_for_telemetry_consent", return_value=True ) - telemetry_hook = KedroTelemetryCLIHooks() + telemetry_hook = KedroTelemetryHook() command_args = ["--version"] mocked_post_request = mocker.patch( "requests.post", side_effect=requests.exceptions.ConnectionError() ) telemetry_hook.before_command_run(fake_metadata, command_args) + telemetry_hook.after_command_run() msg = "Failed to send data to Heap. Exception of type 'ConnectionError' was raised." assert msg in caplog.messages[-1] mocked_post_request.assert_called() @@ -346,9 +335,10 @@ def test_before_command_run_anonymous(self, mocker, fake_metadata): mocker.patch("builtins.open", side_effect=OSError) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") - telemetry_hook = KedroTelemetryCLIHooks() + telemetry_hook = KedroTelemetryHook() command_args = ["--version"] telemetry_hook.before_command_run(fake_metadata, command_args) + telemetry_hook.after_command_run() expected_properties = { "username": "", "command": "kedro --version", @@ -365,11 +355,6 @@ def test_before_command_run_anonymous(self, mocker, fake_metadata): } expected_calls = [ - mocker.call( - event_name="Command run: --version", - identity="", - properties=expected_properties, - ), mocker.call( event_name="CLI command", identity="", @@ -385,10 +370,11 @@ def test_before_command_run_heap_call_error(self, mocker, fake_metadata, caplog) mocked_heap_call = mocker.patch( "kedro_telemetry.plugin._send_heap_event", side_effect=Exception ) - telemetry_hook = KedroTelemetryCLIHooks() + telemetry_hook = KedroTelemetryHook() command_args = ["--version"] telemetry_hook.before_command_run(fake_metadata, command_args) + telemetry_hook.after_command_run() msg = ( "Something went wrong in hook implementation to send command run data to" " Heap. Exception:" @@ -475,8 +461,6 @@ def test_check_is_known_ci_env(self, monkeypatch, env_vars, result): known_ci_vars.discard("GITHUB_ACTION") assert _is_known_ci_env(known_ci_vars) == result - -class TestKedroTelemetryProjectHooks: def test_after_context_created_without_kedro_run( # noqa: PLR0913 self, mocker, @@ -509,7 +493,7 @@ def test_after_context_created_without_kedro_run( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin.toml.dump") # Without CLI invoked - i.e. `session.run` in Jupyter/IPython - telemetry_hook = KedroTelemetryProjectHooks() + telemetry_hook = KedroTelemetryHook() telemetry_hook.after_context_created(fake_context) telemetry_hook.after_catalog_created(fake_catalog) @@ -567,12 +551,12 @@ def test_after_context_created_with_kedro_run( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin.toml.load") mocker.patch("kedro_telemetry.plugin.toml.dump") # CLI run first - telemetry_cli_hook = KedroTelemetryCLIHooks() + telemetry_cli_hook = KedroTelemetryHook() command_args = ["--version"] telemetry_cli_hook.before_command_run(fake_metadata, command_args) # Follow by project run - telemetry_hook = KedroTelemetryProjectHooks() + telemetry_hook = KedroTelemetryHook() telemetry_hook.after_context_created(fake_context) telemetry_hook.after_catalog_created(fake_catalog) @@ -598,8 +582,7 @@ def test_after_context_created_with_kedro_run( # noqa: PLR0913 properties=expected_properties, ) - # CLI hook makes the first 2 calls, the 3rd one is the Project hook - assert mocked_heap_call.call_args_list[2] == expected_call + assert mocked_heap_call.call_args_list[0] == expected_call def test_after_context_created_with_kedro_run_and_tools( # noqa: PLR0913 self, @@ -632,12 +615,12 @@ def test_after_context_created_with_kedro_run_and_tools( # noqa: PLR0913 mocker.patch("pathlib.Path.exists", return_value=True) # CLI run first - telemetry_cli_hook = KedroTelemetryCLIHooks() + telemetry_cli_hook = KedroTelemetryHook() command_args = ["--version"] telemetry_cli_hook.before_command_run(fake_metadata, command_args) # Follow by project run - telemetry_hook = KedroTelemetryProjectHooks() + telemetry_hook = KedroTelemetryHook() telemetry_hook.after_context_created(fake_context) telemetry_hook.after_catalog_created(fake_catalog) @@ -664,8 +647,8 @@ def test_after_context_created_with_kedro_run_and_tools( # noqa: PLR0913 identity="user_uuid", properties=expected_properties, ) - # CLI hook makes the first 2 calls, the 3rd one is the Project hook - assert mocked_heap_call.call_args_list[2] == expected_call + + assert mocked_heap_call.call_args_list[0] == expected_call def test_after_context_created_no_consent_given(self, mocker): fake_context = mocker.Mock() @@ -674,7 +657,7 @@ def test_after_context_created_no_consent_given(self, mocker): ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") - telemetry_hook = KedroTelemetryProjectHooks() + telemetry_hook = KedroTelemetryHook() telemetry_hook.after_context_created(fake_context) mocked_heap_call.assert_not_called()