diff --git a/.github/workflows/ci_action.yml b/.github/workflows/ci_action.yml index b6fd22c7..0d012b74 100644 --- a/.github/workflows/ci_action.yml +++ b/.github/workflows/ci_action.yml @@ -113,19 +113,3 @@ jobs: files: coverage.xml fail_ci_if_error: true verbose: false - - mirror-to-gitlab: - if: github.event_name == 'push' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - name: Mirror + trigger CI - uses: SvanBoxel/gitlab-mirror-and-ci-action@master - with: - args: "https://git.sinergise.com/eo/code/eo-grow" - env: - GITLAB_HOSTNAME: "git.sinergise.com" - GITLAB_USERNAME: "github-action" - GITLAB_PASSWORD: ${{ secrets.GITLAB_PASSWORD }} - GITLAB_PROJECT_ID: "878" - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci_trigger.yml b/.github/workflows/ci_trigger.yml new file mode 100644 index 00000000..24a21073 --- /dev/null +++ b/.github/workflows/ci_trigger.yml @@ -0,0 +1,29 @@ +name: mirror_and_trigger + +on: + pull_request: + push: + branches: + - "master" + - "develop" + workflow_call: + release: + types: + - published + +jobs: + mirror-to-gitlab: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Mirror + trigger CI + uses: SvanBoxel/gitlab-mirror-and-ci-action@master + with: + args: "https://git.sinergise.com/eo/code/eo-grow" + env: + FOLLOW_TAGS: "true" + GITLAB_HOSTNAME: "git.sinergise.com" + GITLAB_USERNAME: "github-action" + GITLAB_PASSWORD: ${{ secrets.GITLAB_PASSWORD }} + GITLAB_PROJECT_ID: "878" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..9f2b3c0a --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,18 @@ +image: python:3.9 + +stages: + - build + +build_docker_image: + stage: build + needs: [] + rules: + - if: $CI_COMMIT_TAG # run only on releases + when: always + variables: + CUSTOM_RUN_TAG: auto # this will create images with the latest tag and the version tag + LAYER_NAME: dotai-eo + - when: manual + trigger: + project: eo/infra/docker + allow_failure: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ba2add9b..6ee9de27 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,13 +20,13 @@ repos: types_or: [json] - repo: https://github.com/psf/black - rev: 23.9.1 + rev: 23.10.1 hooks: - id: black language_version: python3 - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: "v0.0.292" + rev: "v0.1.4" hooks: - id: ruff diff --git a/CHANGELOG.md b/CHANGELOG.md index fbf0fa78..a5c3e754 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [Version 1.6.3] - 2023-11-07 + +- Pipelines can request specific type of worker when run on a ray cluster with the `ray_worker_type` field. +- Area managers now generate the patch lists more efficiently. +- Pipelines have option to fail when temporally-ill defined EOPatches are encountered with the `raise_on_temporal_mismatch` flag. + + ## [Version 1.6.2] - 2023-10-17 - Fixed a bug in `BatchDownloadPipeline` where the evalscript was not read correctly. diff --git a/eogrow/__init__.py b/eogrow/__init__.py index 9b8fb294..036d6d67 100644 --- a/eogrow/__init__.py +++ b/eogrow/__init__.py @@ -1,3 +1,3 @@ """The main module of the eo-grow package.""" -__version__ = "1.6.2" +__version__ = "1.6.3" diff --git a/eogrow/cli.py b/eogrow/cli.py index 1c56c89c..94f4538f 100644 --- a/eogrow/cli.py +++ b/eogrow/cli.py @@ -1,4 +1,5 @@ """Implements the command line interface for `eo-grow`.""" + import json import os import re diff --git a/eogrow/core/area/base.py b/eogrow/core/area/base.py index f4604592..76d4c3bf 100644 --- a/eogrow/core/area/base.py +++ b/eogrow/core/area/base.py @@ -1,8 +1,10 @@ """Implementation of the base AreaManager.""" + from __future__ import annotations import logging from abc import ABCMeta, abstractmethod +from functools import partial from typing import Literal, Optional import fiona @@ -131,10 +133,10 @@ def get_grid_cache_filename(self) -> str: def get_patch_list(self) -> PatchList: """Returns a list of eopatch names and appropriate BBoxes.""" - named_bboxes = [] + named_bboxes: PatchList = [] for crs, grid in self.get_grid(filtered=True).items(): - for _, row in grid.iterrows(): - named_bboxes.append((row.eopatch_name, BBox(row.geometry.bounds, crs=crs))) + bounds = grid.geometry.bounds.apply(tuple, axis=1) + named_bboxes.extend(zip(grid[self.NAME_COLUMN], bounds.map(partial(BBox, crs=crs)))) return named_bboxes diff --git a/eogrow/core/area/batch.py b/eogrow/core/area/batch.py index 513be811..2b39a542 100644 --- a/eogrow/core/area/batch.py +++ b/eogrow/core/area/batch.py @@ -1,4 +1,5 @@ """Area manager implementation for Sentinel Hub batch grids.""" + from __future__ import annotations import logging diff --git a/eogrow/core/area/custom_grid.py b/eogrow/core/area/custom_grid.py index c3b0a816..dc53da4f 100644 --- a/eogrow/core/area/custom_grid.py +++ b/eogrow/core/area/custom_grid.py @@ -1,4 +1,5 @@ """Area manager implementation for custom grids.""" + from __future__ import annotations import logging diff --git a/eogrow/core/base.py b/eogrow/core/base.py index a5530c34..9b6d2bc3 100644 --- a/eogrow/core/base.py +++ b/eogrow/core/base.py @@ -1,4 +1,5 @@ """Base object from which all configurable eo-grow objects inherit.""" + from __future__ import annotations from typing import Any, TypeVar diff --git a/eogrow/core/config.py b/eogrow/core/config.py index 3250e7d3..7761046e 100644 --- a/eogrow/core/config.py +++ b/eogrow/core/config.py @@ -1,4 +1,5 @@ """Implements functions that transform raw dictionaries/JSON files according to the config language of eo-grow.""" + from __future__ import annotations import copy diff --git a/eogrow/core/logging.py b/eogrow/core/logging.py index 5c0e14d8..f63c6029 100644 --- a/eogrow/core/logging.py +++ b/eogrow/core/logging.py @@ -1,4 +1,5 @@ """Implementation of LoggingManager and different handlers used for logging.""" + from __future__ import annotations import contextlib diff --git a/eogrow/core/pipeline.py b/eogrow/core/pipeline.py index 4ab0a447..5e8a2583 100644 --- a/eogrow/core/pipeline.py +++ b/eogrow/core/pipeline.py @@ -1,4 +1,5 @@ """Implementation of the base Pipeline class.""" + from __future__ import annotations import logging @@ -197,7 +198,8 @@ def run_execution( filesystem=self.storage.filesystem, logs_filter=EOExecutionFilter(ignore_packages=self.logging_manager.config.eoexecution_ignore_packages), logs_handler_factory=EOExecutionHandler, - **extra_kwargs, # type: ignore[arg-type] + raise_on_temporal_mismatch=self.config.raise_on_temporal_mismatch, + **extra_kwargs, ) execution_results = executor.run(**executor_run_params) diff --git a/eogrow/core/schemas.py b/eogrow/core/schemas.py index 4fed3ac0..804caa4f 100644 --- a/eogrow/core/schemas.py +++ b/eogrow/core/schemas.py @@ -4,6 +4,7 @@ For each pipeline a separate schema has to be defined which inherits from PipelineSchema. Such schema should be placed as an internal class of the implemented pipeline class """ + from __future__ import annotations from inspect import isclass @@ -75,6 +76,9 @@ class PipelineSchema(BaseSchema): "must implement the `filter_patch_list` method." ), ) + raise_on_temporal_mismatch: bool = Field( + False, description="Whether to treat `TemporalDimensionWarning` as an exception during EOExecution." + ) def build_schema_template( diff --git a/eogrow/core/storage.py b/eogrow/core/storage.py index fb4c8655..ade608fc 100644 --- a/eogrow/core/storage.py +++ b/eogrow/core/storage.py @@ -1,4 +1,5 @@ """Implementation of the StorageManager class for handling project storage.""" + from __future__ import annotations from typing import Any, ClassVar, Dict, Literal, Optional diff --git a/eogrow/pipelines/batch_to_eopatch.py b/eogrow/pipelines/batch_to_eopatch.py index 307e4054..e6da9dfb 100644 --- a/eogrow/pipelines/batch_to_eopatch.py +++ b/eogrow/pipelines/batch_to_eopatch.py @@ -1,4 +1,5 @@ """Pipeline for conversion of batch results to EOPatches.""" + from __future__ import annotations from typing import Any, List, Optional @@ -174,9 +175,7 @@ def _get_tiff_mapping_node(self, mapping: FeatureMappingSchema, previous_node: E ), feature[1] import_task = ImportFromTiffTask( - tmp_timeless_feature, - folder=self._input_folder, - filesystem=self.storage.filesystem, + tmp_timeless_feature, self._input_folder, filesystem=self.storage.filesystem ) # Filename is written into the dependency name to be used later for execution arguments: import_node = EONode( diff --git a/eogrow/pipelines/byoc.py b/eogrow/pipelines/byoc.py index 2afa6089..64323e76 100644 --- a/eogrow/pipelines/byoc.py +++ b/eogrow/pipelines/byoc.py @@ -1,4 +1,5 @@ """Defines pipelines for ingesting and modifying BYOC collections.""" + from __future__ import annotations import datetime diff --git a/eogrow/pipelines/download.py b/eogrow/pipelines/download.py index df1da2a9..f97414bd 100644 --- a/eogrow/pipelines/download.py +++ b/eogrow/pipelines/download.py @@ -1,4 +1,5 @@ """Implements different customizeable pipelines for downloading data.""" + from __future__ import annotations import abc diff --git a/eogrow/pipelines/download_batch.py b/eogrow/pipelines/download_batch.py index 296ce415..cdd46801 100644 --- a/eogrow/pipelines/download_batch.py +++ b/eogrow/pipelines/download_batch.py @@ -1,4 +1,5 @@ """Download pipeline that works with Sentinel Hub batch service.""" + from __future__ import annotations import logging diff --git a/eogrow/pipelines/export_maps.py b/eogrow/pipelines/export_maps.py index 6bdb0ba9..c627edc5 100644 --- a/eogrow/pipelines/export_maps.py +++ b/eogrow/pipelines/export_maps.py @@ -1,4 +1,5 @@ """Implements a pipeline for exporting data to TIFF files, can be used to prepare BYOC tiles.""" + from __future__ import annotations import datetime as dt @@ -186,7 +187,7 @@ def build_workflow(self) -> EOWorkflow: export_to_tiff_task = ExportToTiffTask( self.config.feature, - folder=self.storage.get_folder(self.config.output_folder_key), + self.storage.get_folder(self.config.output_folder_key), filesystem=self.storage.filesystem, no_data_value=self.config.no_data_value, image_dtype=np.dtype(self.config.map_dtype), diff --git a/eogrow/pipelines/features.py b/eogrow/pipelines/features.py index 2d2ce909..147cb880 100644 --- a/eogrow/pipelines/features.py +++ b/eogrow/pipelines/features.py @@ -1,4 +1,5 @@ """Implements a pipeline to construct features for training/prediction.""" + from __future__ import annotations import logging diff --git a/eogrow/pipelines/import_tiff.py b/eogrow/pipelines/import_tiff.py index 8f93f5be..dabf88d0 100644 --- a/eogrow/pipelines/import_tiff.py +++ b/eogrow/pipelines/import_tiff.py @@ -1,4 +1,5 @@ """Implements a pipeline for importing reference data from a raster image.""" + from __future__ import annotations from typing import Optional @@ -54,10 +55,6 @@ class Schema(Pipeline.Schema): ) dtype: Optional[np.dtype] = Field(description="Custom dtype for the imported feature.") _parse_dtype = optional_field_validator("dtype", parse_dtype, pre=True) - use_vsi: bool = Field( - True, - description="Whether to use the VSI for reading. Enabled by default as a remote filesystem is assumed.", - ) resize: Optional[ResizeSchema] = Field( description="Settings for SpatialResizeTask applied at the end. When omitted resizing is not performed." ) @@ -84,7 +81,6 @@ def build_workflow(self) -> EOWorkflow: no_data_value=self.config.no_data_value, filesystem=self.storage.filesystem, image_dtype=self.config.dtype, - use_vsi=self.config.use_vsi, ) import_node = EONode(import_task, inputs=[create_eopatch_node]) diff --git a/eogrow/pipelines/import_vector.py b/eogrow/pipelines/import_vector.py index 9ccf8d92..a7b9055d 100644 --- a/eogrow/pipelines/import_vector.py +++ b/eogrow/pipelines/import_vector.py @@ -1,4 +1,5 @@ """Implements a pipeline for importing vector data from a file.""" + from __future__ import annotations import fs diff --git a/eogrow/pipelines/merge_samples.py b/eogrow/pipelines/merge_samples.py index 33d6fea4..c0b5da9c 100644 --- a/eogrow/pipelines/merge_samples.py +++ b/eogrow/pipelines/merge_samples.py @@ -1,4 +1,5 @@ """Implements a pipeline for merging sampled features into numpy arrays fit for training models.""" + from __future__ import annotations import logging diff --git a/eogrow/pipelines/prediction.py b/eogrow/pipelines/prediction.py index deeb3310..c665da34 100644 --- a/eogrow/pipelines/prediction.py +++ b/eogrow/pipelines/prediction.py @@ -1,4 +1,5 @@ """Implements a base prediction pipeline and a LGBM specialized classification and regression pipelines.""" + from __future__ import annotations import abc diff --git a/eogrow/pipelines/rasterize.py b/eogrow/pipelines/rasterize.py index 9131cbbc..88bff739 100644 --- a/eogrow/pipelines/rasterize.py +++ b/eogrow/pipelines/rasterize.py @@ -1,4 +1,5 @@ """Implements a pipeline for rasterizing vector datasets.""" + from __future__ import annotations import logging diff --git a/eogrow/pipelines/sampling.py b/eogrow/pipelines/sampling.py index 478bbdf9..f5f90f93 100644 --- a/eogrow/pipelines/sampling.py +++ b/eogrow/pipelines/sampling.py @@ -1,4 +1,5 @@ """Implements different pipelines for sampling from data.""" + from __future__ import annotations import abc diff --git a/eogrow/pipelines/split_grid.py b/eogrow/pipelines/split_grid.py index 7c038bff..b60e517d 100644 --- a/eogrow/pipelines/split_grid.py +++ b/eogrow/pipelines/split_grid.py @@ -1,4 +1,5 @@ """Implements a pipeline that creates a finer grid and splits EOPatches accordingly.""" + from __future__ import annotations import itertools as it diff --git a/eogrow/pipelines/testing.py b/eogrow/pipelines/testing.py index 3d34c65a..bd261b22 100644 --- a/eogrow/pipelines/testing.py +++ b/eogrow/pipelines/testing.py @@ -1,4 +1,5 @@ """Implements pipelines used for data preparation in testing.""" + from __future__ import annotations import logging diff --git a/eogrow/tasks/batch_to_eopatch.py b/eogrow/tasks/batch_to_eopatch.py index f6940c81..df8d3b7a 100644 --- a/eogrow/tasks/batch_to_eopatch.py +++ b/eogrow/tasks/batch_to_eopatch.py @@ -1,4 +1,5 @@ """Tasks used to transform Sentinel Hub Batch results into EOPatches.""" + from __future__ import annotations import concurrent.futures diff --git a/eogrow/tasks/common.py b/eogrow/tasks/common.py index 570d1ae4..7baf6869 100644 --- a/eogrow/tasks/common.py +++ b/eogrow/tasks/common.py @@ -1,4 +1,5 @@ """Common tasks shared between pipelines.""" + from __future__ import annotations from functools import partial diff --git a/eogrow/tasks/features.py b/eogrow/tasks/features.py index bcf29060..65baa9bf 100644 --- a/eogrow/tasks/features.py +++ b/eogrow/tasks/features.py @@ -1,4 +1,5 @@ """Implements tasks needed for calculating features in FeaturesPipeline.""" + from __future__ import annotations import abc diff --git a/eogrow/tasks/prediction.py b/eogrow/tasks/prediction.py index f943babe..dcbe2bdc 100644 --- a/eogrow/tasks/prediction.py +++ b/eogrow/tasks/prediction.py @@ -1,4 +1,5 @@ """Defines task needed in prediction pipelines.""" + from __future__ import annotations import abc diff --git a/eogrow/tasks/spatial.py b/eogrow/tasks/spatial.py index 35d928fa..0646662f 100644 --- a/eogrow/tasks/spatial.py +++ b/eogrow/tasks/spatial.py @@ -1,4 +1,5 @@ """Tasks for spatial operations on EOPatches, used in grid-switching.""" + from __future__ import annotations import numpy as np diff --git a/eogrow/tasks/testing.py b/eogrow/tasks/testing.py index db7aae1e..e425e7af 100644 --- a/eogrow/tasks/testing.py +++ b/eogrow/tasks/testing.py @@ -1,4 +1,5 @@ """Tasks used to generate test data.""" + from __future__ import annotations import datetime as dt diff --git a/eogrow/types.py b/eogrow/types.py index b6ed712d..0ae80d7f 100644 --- a/eogrow/types.py +++ b/eogrow/types.py @@ -1,5 +1,6 @@ """ Includes custom types used in schemas """ + import datetime import sys from enum import Enum diff --git a/eogrow/utils/batch.py b/eogrow/utils/batch.py index 850f7de9..be784cb2 100644 --- a/eogrow/utils/batch.py +++ b/eogrow/utils/batch.py @@ -1,6 +1,7 @@ """ A module with useful utilities related to batch processing """ + from __future__ import annotations diff --git a/eogrow/utils/filter.py b/eogrow/utils/filter.py index 4276bb81..bcdee236 100644 --- a/eogrow/utils/filter.py +++ b/eogrow/utils/filter.py @@ -1,6 +1,7 @@ """ Utilities for filtering eopatch lists """ + from __future__ import annotations from concurrent.futures import ThreadPoolExecutor diff --git a/eogrow/utils/fs.py b/eogrow/utils/fs.py index 6af8b6ff..bf64bf4b 100644 --- a/eogrow/utils/fs.py +++ b/eogrow/utils/fs.py @@ -1,6 +1,7 @@ """ Module containing utilities for working with filesystems """ + from __future__ import annotations import abc diff --git a/eogrow/utils/general.py b/eogrow/utils/general.py index 1f5ee32c..67610d41 100644 --- a/eogrow/utils/general.py +++ b/eogrow/utils/general.py @@ -1,6 +1,7 @@ """ A module containing general utilities that haven't been sorted in any other module """ + from __future__ import annotations import datetime as dt diff --git a/eogrow/utils/grid.py b/eogrow/utils/grid.py index 44bc3ab1..b9a64b00 100644 --- a/eogrow/utils/grid.py +++ b/eogrow/utils/grid.py @@ -1,6 +1,7 @@ """ Utilities for working with area grids """ + from __future__ import annotations import numpy as np diff --git a/eogrow/utils/logging.py b/eogrow/utils/logging.py index 99aa9d22..05f0a136 100644 --- a/eogrow/utils/logging.py +++ b/eogrow/utils/logging.py @@ -1,6 +1,7 @@ """ Utilities used for logging """ + from json.decoder import JSONDecodeError import requests diff --git a/eogrow/utils/map.py b/eogrow/utils/map.py index 8af13889..dab673f9 100644 --- a/eogrow/utils/map.py +++ b/eogrow/utils/map.py @@ -1,6 +1,7 @@ """ Module with utilities for creating maps """ + from __future__ import annotations import logging diff --git a/eogrow/utils/meta.py b/eogrow/utils/meta.py index 5018fbfe..633e15f0 100644 --- a/eogrow/utils/meta.py +++ b/eogrow/utils/meta.py @@ -1,6 +1,7 @@ """ Utilities for solving different problems in `eo-grow` package structure, which are mostly a pure Python magic. """ + from __future__ import annotations import importlib diff --git a/eogrow/utils/ray.py b/eogrow/utils/ray.py index 12d11d00..1a29f14a 100644 --- a/eogrow/utils/ray.py +++ b/eogrow/utils/ray.py @@ -1,6 +1,7 @@ """ Modules with Ray-related utilities """ + from __future__ import annotations import logging diff --git a/eogrow/utils/testing.py b/eogrow/utils/testing.py index 9d920ef1..436789b1 100644 --- a/eogrow/utils/testing.py +++ b/eogrow/utils/testing.py @@ -1,6 +1,7 @@ """ Module implementing utilities for unit testing pipeline results """ + from __future__ import annotations import json @@ -182,7 +183,7 @@ def _get_coords_sample(geom: Polygon | MultiPolygon | Any) -> list[tuple[float, "row_count": len(gdf), "crs": str(gdf.crs), "mean_area": _prepare_value(gdf.area.mean(), np.float64), - "total_bounds": list(gdf.total_bounds), + "total_bounds": [_prepare_value(x, dtype=np.float64) for x in gdf.total_bounds], } if len(gdf): diff --git a/eogrow/utils/validators.py b/eogrow/utils/validators.py index e37e1c13..4e050a27 100644 --- a/eogrow/utils/validators.py +++ b/eogrow/utils/validators.py @@ -1,6 +1,7 @@ """ Module defining common validators for schemas and validator wrappers """ + from __future__ import annotations import datetime as dt diff --git a/eogrow/utils/vector.py b/eogrow/utils/vector.py index a26c40c9..0563478d 100644 --- a/eogrow/utils/vector.py +++ b/eogrow/utils/vector.py @@ -1,6 +1,7 @@ """ Module containing utilities for working with vector data """ + from __future__ import annotations import geopandas as gpd diff --git a/tests/conftest.py b/tests/conftest.py index 24b2bee2..c27ae2a5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,7 @@ """ Module with global fixtures """ + import os import shutil from tempfile import TemporaryDirectory diff --git a/tests/core/area/test_batch.py b/tests/core/area/test_batch.py index 8a5cf70e..b5f63727 100644 --- a/tests/core/area/test_batch.py +++ b/tests/core/area/test_batch.py @@ -8,6 +8,7 @@ - Tiling grid request endpoints. - Mocking requests of iter_tiles would be too much effort, so the `_make_new_split` of the splitter is mocked instead. """ + from unittest.mock import patch import pytest diff --git a/tests/pipelines/test_byoc.py b/tests/pipelines/test_byoc.py index 1902bae2..4a54f854 100644 --- a/tests/pipelines/test_byoc.py +++ b/tests/pipelines/test_byoc.py @@ -11,6 +11,7 @@ so we mock it to prevent `rasterio.open` to fail. - Most request endpoints are mocked in the `requests_mock` fixture. """ + from unittest.mock import patch import pytest diff --git a/tests/pipelines/test_import_tiff.py b/tests/pipelines/test_import_tiff.py index cbabdc9d..3758f351 100644 --- a/tests/pipelines/test_import_tiff.py +++ b/tests/pipelines/test_import_tiff.py @@ -21,6 +21,7 @@ "import_tiff_resized_scale_factors", ], ) +@pytest.mark.filterwarnings("ignore::eolearn.core.exceptions.TemporalDimensionWarning") def test_import_tiff_pipeline(config_and_stats_paths, experiment_name): config_path, stats_path = config_and_stats_paths("import_tiff", experiment_name) diff --git a/tests/test_cli.py b/tests/test_cli.py index 812da6f2..221c81d9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,6 +1,7 @@ """ Module for testing command line interface """ + import subprocess import pytest diff --git a/tests/test_config_files/import_tiff/import_tiff_timeless.json b/tests/test_config_files/import_tiff/import_tiff_timeless.json index 5425c753..c22680d2 100644 --- a/tests/test_config_files/import_tiff/import_tiff_timeless.json +++ b/tests/test_config_files/import_tiff/import_tiff_timeless.json @@ -4,7 +4,6 @@ "output_folder_key": "temp", "output_feature": ["mask_timeless", "ImportedTimelessData"], "input_filename": "import_test.tiff", - "use_vsi": false, "dtype": "uint16", "no_data_value": 100 }