Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]

## [v0.21.0] - 2026-02-16

- Update vecorel-cli
- Make the library better usable as a Python library
- Add support for Python 3.14, remove support for Python 3.10
- Support HCAT mapping CSV files without crop_code
- Split Germany BB and NDS in block dataset and crop fields
Expand Down Expand Up @@ -463,7 +466,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

- First release

[Unreleased]: <https://github.com/fiboa/cli/compare/v0.20.3...main>
[Unreleased]: <https://github.com/fiboa/cli/compare/v0.21.0...main>
[v0.21.0]: <https://github.com/fiboa/cli/compare/v0.20.3...v0.21.0>
[v0.20.3]: <https://github.com/fiboa/cli/compare/v0.20.2...v0.20.3>
[v0.20.2]: <https://github.com/fiboa/cli/compare/v0.20.1...v0.20.2>
[v0.20.1]: <https://github.com/fiboa/cli/compare/v0.20.0...v0.20.1>
Expand Down
5 changes: 5 additions & 0 deletions fiboa_cli/convert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.convert import ConvertData as Base


class ConvertData(Base):
pass
5 changes: 5 additions & 0 deletions fiboa_cli/converters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.converters import Converters as Base


class Converters(Base):
pass
5 changes: 5 additions & 0 deletions fiboa_cli/create_geojson.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.create_geojson import CreateGeoJson as Base


class CreateGeoJson(Base):
pass
5 changes: 5 additions & 0 deletions fiboa_cli/create_geoparquet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.create_geoparquet import CreateGeoParquet as Base


class CreateGeoParquet(Base):
pass
5 changes: 5 additions & 0 deletions fiboa_cli/create_jsonschema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.create_jsonschema import CreateJsonSchema as Base


class CreateJsonSchema(Base):
pass
6 changes: 3 additions & 3 deletions fiboa_cli/create_stac.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import click
from geopandas import GeoDataFrame
from vecorel_cli.cli.options import JSON_INDENT, VECOREL_FILE_ARG, VECOREL_TARGET_CONSOLE
from vecorel_cli.create_stac import CreateStacCollection
from vecorel_cli.create_stac import CreateStacCollection as Base
from vecorel_cli.registry import VecorelRegistry
from vecorel_cli.vecorel.collection import Collection

from fiboa_cli.fiboa.version import get_versions


class CreateFiboaStacCollection(CreateStacCollection):
class CreateStacCollection(Base):
temporal_property = "determination:datetime"

@staticmethod
Expand All @@ -24,7 +24,7 @@ def get_cli_args():
type=click.STRING,
help="The temporal property to use for the temporal extent.",
show_default=True,
default=CreateFiboaStacCollection.temporal_property,
default=CreateStacCollection.temporal_property,
),
# todo: allow additional parameters for missing data in the collection?
# https://stackoverflow.com/questions/36513706/python-click-pass-unspecified-number-of-kwargs
Expand Down
6 changes: 3 additions & 3 deletions fiboa_cli/describe.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
from pathlib import Path
from typing import Union

from vecorel_cli.describe import DescribeFile
from vecorel_cli.describe import DescribeFile as Base
from vecorel_cli.vecorel.schemas import CollectionSchemas
from yarl import URL

from .fiboa.version import get_versions


class DescribeFiboaFile(DescribeFile):
class DescribeFile(Base):
@staticmethod
def get_cli_callback(cmd):
def callback(source, num, properties, verbose):
return DescribeFiboaFile(source).run(num=num, properties=properties, verbose=verbose)
return DescribeFile(source).run(num=num, properties=properties, verbose=verbose)

return callback

Expand Down
17 changes: 8 additions & 9 deletions fiboa_cli/improve.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,22 @@
from geopandas import GeoDataFrame
from vecorel_cli.basecommand import runnable
from vecorel_cli.encoding.auto import create_encoding
from vecorel_cli.improve import ImproveData
from vecorel_cli.improve import ImproveData as Base
from vecorel_cli.vecorel.collection import Collection
from vecorel_cli.vecorel.extensions import ADMIN_DIVISION
from vecorel_cli.vecorel.version import sdl_uri

from fiboa_cli.conversion.fiboa_converter import FiboaBaseConverter
from fiboa_cli.datasets.commons.ec import AddHCATMixin
from fiboa_cli.datasets.commons.hcat import CROP_EXTENSION, HCAT_EXTENSION
from fiboa_cli.registry import FIBOA_SPECIFICATION
from fiboa_cli.registry import Registry


class Improve(ImproveData):
class ImproveData(Base):
@staticmethod
def get_cli_args():
return {
**ImproveData.get_cli_args(),
**Base.get_cli_args(),
"add-hcat": click.option(
"--add-hcat",
"-hcat",
Expand Down Expand Up @@ -99,22 +99,21 @@ def migrate_fiboa_2(
return geodata, original

self.info(f"Migrating data from fiboa version {original['fiboa_version']}")
schemas = {"https://vecorel.org/specification/v0.1.0/schema.yaml", FIBOA_SPECIFICATION}
schemas = set()
for e in original.get("fiboa_extensions", []):
if e in EXTENSION_MAPPING:
schemas.add(EXTENSION_MAPPING[e])

base = {k: original[k] for k in ("title", "description", "attribution") if k in original}
collection_id = original.get("id") or file_name.split(".")[0]

collection = Collection(
{"schemas": {collection_id: list(schemas)}, "collection": collection_id} | base
)
collection = Collection(Registry.get_default_collection(collection_id, extensions=schemas))
collection.update(base)

# Migrate custom schemas
if "fiboa_custom_schemas" in original:
collection["schemas:custom"] = {
"$schema": "https://vecorel.org/sdl/v0.2.0/schema.json",
"$schema": sdl_uri,
"required": [],
"collection": {},
} | original["fiboa_custom_schemas"]
Expand Down
5 changes: 5 additions & 0 deletions fiboa_cli/merge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.merge import MergeDatasets as Base


class MergeDatasets(Base):
pass
10 changes: 5 additions & 5 deletions fiboa_cli/publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
import spdx_license_list
from vecorel_cli.basecommand import BaseCommand, runnable
from vecorel_cli.cli.options import VECOREL_TARGET
from vecorel_cli.convert import ConvertData
from vecorel_cli.converters import Converters
from vecorel_cli.encoding.auto import create_encoding
from vecorel_cli.validate import ValidateData

from .create_stac import CreateFiboaStacCollection
from .convert import ConvertData
from .converters import Converters
from .create_stac import CreateStacCollection
from .registry import Registry
from .validate import ValidateData

STAC_EXTENSION = "https://stac-extensions.github.io/web-map-links/v1.2.0/schema.json"
DESCRIPTIONS = {
Expand Down Expand Up @@ -364,7 +364,7 @@ def create_stac_collection(self, target, file_name, parquet_file, stac_file):

self.success(f"Creating STAC collection.json for {parquet_file}")
p_stac.parent.mkdir(exist_ok=True)
CreateFiboaStacCollection().create_cli(parquet_file, stac_file)
CreateStacCollection().create_cli(parquet_file, stac_file)

Path(target, "stac").mkdir(parents=True, exist_ok=True)
data = json.load(open(stac_file, "r"))
Expand Down
49 changes: 35 additions & 14 deletions fiboa_cli/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

from vecorel_cli.registry import Registry, VecorelRegistry

from fiboa_cli.fiboa.version import spec_pattern

FIBOA_SPECIFICATION = "https://fiboa.org/specification/v0.3.0/schema.yaml"
from fiboa_cli.fiboa.version import get_fiboa_uri, spec_pattern


class FiboaRegistry(VecorelRegistry):
Expand All @@ -27,19 +25,42 @@ class FiboaRegistry(VecorelRegistry):
ignored_datasets = VecorelRegistry.ignored_datasets + ["es.py"]

def register_commands(self):
super().register_commands()

from .create_stac import CreateFiboaStacCollection
from .describe import DescribeFiboaFile
from .improve import Improve
from .convert import ConvertData
from .converters import Converters
from .create_geojson import CreateGeoJson
from .create_geoparquet import CreateGeoParquet
from .create_jsonschema import CreateJsonSchema
from .create_stac import CreateStacCollection
from .describe import DescribeFile
from .improve import ImproveData
from .merge import MergeDatasets
from .publish import Publish
from .rename_extension import RenameFiboaExtension
from .rename_extension import RenameExtension
from .validate import ValidateData
from .validate_schema import ValidateSchema

commands = [
ConvertData,
Converters,
CreateGeoJson,
CreateGeoParquet,
CreateJsonSchema,
CreateStacCollection,
DescribeFile,
ImproveData,
MergeDatasets,
Publish,
RenameExtension,
ValidateData,
ValidateSchema,
]

for command in commands:
self.set_command(command)

self.set_command(CreateFiboaStacCollection)
self.set_command(DescribeFiboaFile)
self.set_command(RenameFiboaExtension)
self.set_command(Improve)
self.set_command(Publish)
def get_default_collection(self, id: str, extensions: set | list | None = None) -> dict:
extensions = {get_fiboa_uri()} | set(extensions)
return super().get_default_collection(id, extensions=extensions)


Registry.instance = FiboaRegistry()
6 changes: 3 additions & 3 deletions fiboa_cli/rename_extension.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from vecorel_cli.rename_extension import RenameExtension
from vecorel_cli.rename_extension import RenameExtension as Base


class RenameFiboaExtension(RenameExtension):
class RenameExtension(Base):
template_org: str = "fiboa"
template_domain: str = "fiboa.org"

@staticmethod
def get_cli_callback(cmd):
def callback(folder, title, slug, org, prefix):
return RenameFiboaExtension(title, slug, org, prefix).run(folder=folder)
return RenameExtension(title, slug, org, prefix).run(folder=folder)

return callback
5 changes: 5 additions & 0 deletions fiboa_cli/validate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.validate import ValidateData as Base


class ValidateData(Base):
pass
5 changes: 5 additions & 0 deletions fiboa_cli/validate_schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from vecorel_cli.validate_schema import ValidateSchema as Base


class ValidateSchema(Base):
pass
Loading
Loading