Changelog

Release 1.2.0 (2026-09-22)

Features:

  • Reviewed concept pairs can be declared as accepted_similarity in idranges.toml. #387

  • voc-assistant gained --output for the report path and --hide-accepted to leave the accepted similarities out. #387

  • voc-assistant can gate a CI pipeline. A pair that still needs a decision makes the run error (exit 1) inside a GitHub Actions workflow. Pairs recorded as accepted_similarity never fail the run. compare is the subcommand for this, since it screens only what a submission adds. #387

  • voc-assistant duplicate detection runs without sentence-transformers. --definitions none scores no definitions, so voc-assistant check --method levenshtein --definitions none needs neither torch nor a model download. Levenshtein scores orthographic variants below the 0.98 default (for example co-precipitation/coprecipitation is 0.9677), so lower the threshold to reach them. #387

  • voc-assistant gained --threshold-labels-certain (default 0.98), the label score above which a pair is reported whatever its definitions say. #387

Fixes:

  • voc-assistant: Two concepts carrying the same skos:prefLabel are now reported whatever their definitions say. A pair had to pass the label and the definition threshold, so an exact label match with independently worded definitions was dropped. This hid a real duplicate in voc4cat. #387

  • voc-assistant: The concept links in a report now come from the new concept_url_template in idranges.toml, which replaces a hardcoded URL of the voc4cat development documentation. #387

  • voc-assistant compare reported nothing at all. An inverted condition skipped every concept, which made the subcommand useless. Alternate labels of added concepts were skipped by a second defect in the same place and are now screened too. #387

Changes:

  • voc-assistant: --threshold-defs now defaults to 0.5, down from 0.8. Two independently worded definitions of the same thing score low, so the old value filtered far more than it should: measured over the 600 concepts of voc4cat, it rejected every pair in the 0.90-0.98 label band, where the best definition score was 0.7907. At 0.5 the same run reports 19 pairs instead of 7. #387

  • The assistant extra is renamed sbert and no longer installs voc-assistant itself. levenshtein moved to the core dependencies (7 MB), so voc-assistant works with a plain pip install voc4cat, comparing text with the Levenshtein ratio. The extra now holds only sentence-transformers and torch, which the default --method sbert needs. Replace voc4cat[assistant] with voc4cat[sbert]; running --method sbert without it fails with a message naming both the extra and the flags that avoid it. #387

  • voc-assistant uses the logging setup of voc4cat instead of configuring the root logger itself when the module is imported. #387

  • Correct the instructions for syncing a vocabulary repository with voc4cat-template. The documented git fetch <url> tag v26.x copies the tags of the template into the vocabulary repository, where they are indistinguishable from its own release tags. #381

  • Correct the documentation on available SKOS relations (skos:related is not supported). #390

Release 1.1.1 (2026-08-30)

Features:

  • Add --modified-date DATE option for transform --prov-from-git. Concepts that differ from --diff-base get DATE as dct:modified, and concepts that have no commit yet get it as dct:created as well. The option is for repositories where CI generates the turtle files and commits them only afterwards, so that git cannot yet know about the change. #378

Fixes:

  • Strip whitespace around labels, definitions and the other fields of the xlsx template. A space at the end of a cell is invisible in Excel but made the label a different value, so searches for the label did not find the concept. #377

Release 1.1.0 (2026-08-28)

Changes:

  • New profile vp4cat-5.3, now the default. A concept may carry one skos:prefLabel per language, which vp4cat-5.2 rejected. It also drops the VocEdit SHACL UI shapes that made every label result appear twice. vp4cat-5.2 stays bundled for pinning. #366

  • The voc4cat package is now fully type-annotated and type-checked under a strict zuban configuration, enforced by a pre-commit hook. It ships a py.typed marker (PEP 561), so downstream consumers get the annotations when type-checking their own code against this package. #362

  • Add a version-neutral profile token vp4cat that always resolves to the current vp4cat profile. Use a versioned token such as vp4cat-5.3 to pin the version. #351, #352

  • The IRIs of the vp4cat profiles now match the redirects configured at w3id.org, so https://w3id.org/nfdi4cat/vp4cat is dereferenceable. #317

  • Development tooling moved from extras to PEP 735 dependency groups, so uv sync installs it by default and it no longer appears in the published package metadata. Only assistant remains an extra. Type checking moved from mypy to zuban. #361

  • Documentation brought in line with what the tool does: the recipe list of the voc4cat-template justfile, the transform --diff-base option, the mandatory VOCAB argument of voc4cat template, the environment variables that are actually read, the dct:isReplacedBy columns and vp4cat as the default profile. The quickstart now accounts for the example rows that voc4cat template writes. #365

  • Detect CI through GITHUB_ACTIONS instead of CI_RUN, which replaces that environment variable. The checks of check --ci-pre and --ci-post that are advisory locally and fatal in the pipeline consulted CI_RUN, which no repository set, so they stayed advisory everywhere: a stray file in the inbox and a missing GITHUB_ACTOR both passed CI. GitHub Actions always sets GITHUB_ACTIONS, so repositories need no configuration. #370

  • The inbox check now names the offending files instead of only restating the rule, and tells contributors who submitted a legacy .xls file to save it in the .xlsx format. Markdown documentation of any name is accepted, which the previous message described too narrowly as README.md. #370

  • Document that repositories using transform --prov-from-git must disable squash merging. Provenance dates are read from the author date of each commit touching a concept file, and squashing replaces those commits with one dated at merge time, so creation dates are lost and silently rewritten by the next submission. The project setup guide previously recommended keeping squash merging enabled. Merge commits and rebase merging are both safe. #371

Fixes:

  • Separate mapping IRIs by newline when writing xlsx, matching the separator expected when reading them back. Vocabularies with several mappings of the same kind did not survive a turtle -> xlsx -> turtle round-trip. #349

  • Do not report a missing numeric ID in the vocabulary IRI as an error. A vocabulary IRI carries no concept ID, so every conversion without a configured catalogue_pid logged a spurious error. #365

  • Return the exit code of git merge-file from voc4cat-merge instead of collapsing every failure to 1. The walrus operator binds less tightly than !=, so retcode := outp.returncode != 0 stored a boolean and discarded git’s count of unresolved conflicts. #364

  • Reject IRIs whose ID is outside the ID range(s) granted to the contributor. check --ci-post now validates the IDs added by the acting contributor (from GITHUB_ACTOR) against the ranges configured for that vocabulary. The check was lost with the removal of the 0.4.3 template code. ID ranges are now also looked up per vocabulary, so a range granted for one vocabulary no longer permits IDs in another. Only IRIs actually added are validated, so contributors who merely edit existing concepts need no ID range. #359, #369

  • Generate template example rows with IDs from the first configured ID range. Previously voc4cat template always suggested ex:0001001 and the non-numeric ex:collection001, which are outside the ID ranges of the shipped starter configuration. #359

  • Detect removal of ordered collections. check --ci-post only looked for skos:Concept and skos:Collection, so deleting a skos:OrderedCollection went unnoticed. #359

  • Match the vocabulary name case-insensitively when reading its allow_delete setting. A vocabulary file with uppercase letters in its name silently fell back to forbidding deletion. #359

  • Fail when voc4cat docs is asked for pyLODE documentation and pyLODE is missing. The command logged an error and returned successfully, so merge.yml and publish.yml would have gone green and published gh-pages without regenerated documentation if their pyLODE install step ever broke. #375

  • Compare against the previous version of a vocabulary stored in split form. check --ci-post joined the split directory but discarded the result, so no previous version was found: every IRI counted as newly added and removals went unnoticed. Repositories keeping their vocabulary split - as voc4cat-template does - therefore never had allow_delete enforced. #368

Release 1.0.4 (2026-02-23)

Features:

  • Add --diff-base REF option for transform --prov-from-git. Only concepts with actual content changes compared to the given git ref get updated dates; unchanged concepts keep their dates from the base version. #345

Release 1.0.3 (2026-02-14)

Fixes:

  • Reject IDs with wrong digit count during voc4cat convert. Previously, IDs with more digits than configured (e.g. 8 digits with id_length: 7) were silently accepted because the regex matched only the trailing digits. #341

Release 1.0.2 (2026-02-09)

Fixes:

  • Allow untracked .ttl files in --prov-from-git. Skip them with an info log instead of raising an error. #339

Release 1.0.1 (2026-01-06)

Fixes:

  • Fix git blame URLs to include partition subdirectory (e.g., IDs0000xxx/) matching the new partitioned storage structure. #335

Release 1.0.0 (2025-12-31)

Features:

  • Partitioned storage: The --split option now organizes concept files into subdirectories by ID range (1000 IDs per directory, e.g., IDs0001xxx/). This avoids GitHub UI limitations with large directories. The --join option supports both the new partitioned structure and the previous flat structure. #328

  • Namespace prefixes in RDF: The transform command now uses namespace bindings/prefixes in output (as convert already did). #327

  • Longturtle format: Turtle files are now written in longturtle format everywhere (this was not the case in rc1/2). #327

  • Improved --prov-from-git: Git history evaluation now follows file moves/renames. #329

Changes:

  • Improved migration guide and template update guide.

  • Fix BASE declaration in vp4cat profile; allow dct:provenance with IRI value (Req. 2.2.2). #325, #326

  • Fix reporting for check --redundant-hierarchies. #323

  • Fix openpyxl warning about worksheet selection.

  • Fix xlsx generation to mark only one sheet as selected.

Release 1.0.0 (RC2) (2025-12-27)

The following changes were made to RC1 based on testing it with the voc4cat vocabulary and Skosmos 3.0.

Features:

  • New transform option --prov-from-git: Adds dct:created and dct:modified dates to split turtle files based on git history. Created date is only added if missing; modified date is updated when different.

  • New check option --redundant-hierarchies: Detects redundant hierarchical relationships where a concept has skos:broader to both a parent and an ancestor of that parent.

  • Added dct:isReplacedBy columns to Concepts and Collections sheets for specifying replacement IRIs when deprecating concepts.

Changes:

  • Changed dct:identifier format: Now uses just the local numeric ID (e.g., 0000123 instead of voc4cat_0000123).

  • skos:historyNote solely for obsoletion: History notes are no longer generated from provenance data; they are now exclusively used for documenting concept obsoletion.

Release 1.0.0 (RC1) (2025-12-22)

Important

This is a major release with breaking changes. Vocabularies and xlsx-templates must be upgraded from xlsx template v0.43 to v1.0, see migration-to-v1.0.

Features:

  • New xlsx template v1.0 with pydantic-backed model for improved consistency and validation. Template generator creates files dynamically from the data model. It is no longer required to provide an xlsx-template (but still an option).

  • ConceptScheme metadata is now read from idranges.toml config.

  • New validation profile vp4cat-5.2 based on vocpub-5.2, now the default profile.

  • Custom profile support: Accept custom SHACL profile files for validation via CLI path or config.

  • Improved provenance support

    • Improved citation of the concept’s origin by properties prov:wasInfluencedBy, prov:hadPrimarySource and to reference its dct:license and the dct:rightsHolder. This allows referencing the source.

    • Git blame links: Provenance information links to git blame URLs for traceability.

    • Dynamic skos:historyNote: Auto-generated from PROV.wasInfluencedBy and source vocab references.

  • Deprecation handling: Support for owl:deprecated, replaced-by IRIs, and obsolete markers.

  • ID ranges sheet: New output sheet displaying ID range configuration.

  • Python 3.14 support added to test matrix.

  • Sphinx documentation including action to build and publish the docs to GitHub Pages.

  • Improved Skosmos support by aligning with its data model when possible.

Breaking changes:

  • New xlsx template format v1.0 replaces template v0.43. Migration required for existing vocabularies.

  • Removed CLI option voc4cat transform --make-ids.

  • Profile changes: Removed vocpub pre-3.0 profile; vp4cat-5.2 is now default.

Other Changes:

  • Code refactoring: eliminated duplication, split large modules, improved test coverage.

  • Removed all binary xlsx-files from the repository

  • Switch from codespell to typos spell checker.

Release 0.10.1 (2025-12-15)

This is the last release of the 0.x series.

Changes:

  • Removed extra code related to 1.0-series which was not used at all.

Release 0.10.0 (2025-11-29)

Important

Due to the change of hierarchy notation, it is not possible to use XLSX templates made for earlier versions.

Features:

  • BREAKING Hierarchy definition changed from ChildrenIRI to ParentIRI approach. Each concept specifies its parent concepts rather than its children concepts. (part of #300)

  • BREAKING Removed functionality to express concept-hierarchies by indentation in xlsx table cells. (part of #300)

Changes:

  • BREAKING Read template version number from Concept Scheme Sheet (cell B13) instead of Introduction sheet (part of #300 by @dalito)

  • Migrate codebase to pydantic2 by @dalito in #283

Release 0.9.2 (2025-04-24)

Feature:

  • Add a command/tool to help with reviewing (e.g. by performing sentence-transformer based similarity analysis) #279, #280

Bug fix:

  • Trailing comma in ChildrenIRI raises error #277, #278

Change:

  • Remove trailing and leading spaces from prefLabel and other xlsx table cells #281, #282

Release 0.9.1 (2025-03-19)

Bug fixes:

  • Fix writing to sheet “Additional Concept Features” (mappings could be lost) #270, #272

  • Stop filling source vocab URI column with concept URI hyperlink (bug introduced in Release 0.9.0) #269, #271

Release 0.9.0 (2025-02-04)

Features:

  • In xlsx-files IRIs will now be shown as https://example.org/001 (example 001) or (if a matching prefix exists) as ex:001 (example 001). The preferred label is used as qualifier of the IRI (in round brackets). #253, #258

  • Improve styling of generated xlsx. The style is now copied from the first data row to all following rows. The row height is auto-adjusted. #260, #264, #265

Breaking changes:

  • The sheet “Prefixes” is now read-only. Prefixes can now only be defined in idranges.config. #257, #263

  • Removed executable script merge_vocab #244, #259

Changes:

  • New, better styled default template src/voc4cat/blank_043.xlsx #265

Bug fixes:

  • Handling of prefixes for multiple vocabularies. #257, #263

  • Prefixes given in idranges.toml were ignored. #205 #257, #263

Release 0.8.8 (2025-01-27)

0.8.8 only contains a fix for a bug introduced in 0.8.6.

Bug fixes:

  • Fix jumping over every second row when writing concepts to xlsx (#254 fixed in #255)

Release 0.8.6 / 0.8.7 (2025-01-26)

0.8.7 only adds a missed commit with the CHANGENOTES and README updates.

Bug fixes:

  • Fix handling of mappings to external vocabularies/ontologies #242

New features:

  • Support Python 3.13 #234

Changes:

  • Write only concepts with mapping to “Additional Concept Features” sheet #246

  • Add alternate name voc4cat-merge for executable script merge_vocab by #243

  • Make pyLODE optional (remove from dependencies) #250

Release 0.8.5 (2024-03-09)

Bug fixes:

  • Fix creation of two ttl-files for sub-command “join” with “–outbox” option. #215, #216

Release 0.8.4 (2024-03-04)

Bug fixes:

  • Fix transform join subcommand to produce vocpub-4.7-conform turtle file. #213

Release 0.8.3 (2024-02-28)

Bug fixes:

  • Fix writing to wrong file location for sub-command “join” with “–outbox” option. #211, #212

  • Fix clearing of cells with hyperlinks in xlsx by openpyxl. #209, #210

Release 0.8.2 (2024-02-21)

Bug fixes:

  • Fix agent name type in turtle as required by vocpub profile 4.7. #206, #207

Release 0.8.1 (2024-02-20)

Bug fixes:

  • Add colorama as a main dependency. #204

Release 0.8.0 (2024-02-19)

New features:

  • Support for Python 3.12. #202

Changes:

  • Support current vocpub profile 4.7. #198, #199

Breaking changes:

  • Remove alternative documentation generation with ontospy. #200, #202

Release 0.7.10 (2024-02-11)

New features:

  • Add coverage summary as job output. #197

Changes:

  • Document which vocpub profile is used in 0.7.x series and move profiles to separate directory. #195, #196

Release 0.7.9 (2024-02-01)

Bug fixes:

  • Adjust validation of GitHub user names to allow uppercase. #193, #194

Release 0.7.8 (2023-10-30)

Bug fixes:

  • In CI, read modified date of concept scheme CS from env.var (& fix its type). #177, #178

Release 0.7.7 (2023-10-30)

Changes:

  • Upgrade curies package (to >= 0.6.6) and use new passthrough option. #173, #176

Bug fixes:

  • Consistent validation with pydantic and SHACL/vocpub (disallow None). #174, #175

Release 0.7.5 / 0.7.6 (2023-09-03)

In 0.7.6 we fixed the license specifier for Zenodo and the link to the changelog for PyPI.

New features:

  • Add creation of an index-page for the root of gh-pages. #160, #165

Changes:

  • Replaced CITATION.cff by CITATION.bib to avoid side effects on data in Zenodo. #166, #167, #168

  • Provide metadata for Zenodo completely via .zenodo.json. The metadata have also been enriched significantly. #167, #168

Release 0.7.4 (2023-08-31)

New features:

  • Expand tables to include full content. This happens every time when an xlsx-file is written. #155, #159

Changes:

  • Change HTML documentation to use IRI as id (anchor) in html. #156

  • List members in collections in alphabetical order (in HTML documentation). #162

Bug fixes:

  • Creator and publisher missing in generated HTML documentation. #154

Release 0.7.2 / 0.7.3 (2023-08-23)

First release after setting up Zenodo integration (0.7.2) and fix of Zenodo community (0.7.3).

There were no functional changes since 0.7.1.

Release 0.7.1 (2023-08-22)

First release to upload to PyPI.

There were no functional changes since 0.7.0.

Release 0.7.0 (2023-08-16)

New features:

  • In concept scheme sheet creator can now be ORCID, ROR ID or a predefined string; publisher can be ROR ID or a predefined string (for example NFDI4Cat) #120, #151

  • Support for two environment variables was added. If present they will be used with highest preference. #148

    • VOC4CAT_MODIFIED - Can be used to supply a modified date.

    • VOC4CAT_VERSION - version string; it must start with “v”.

  • voc4cat detects if it runs in gh-actions. In gh-actions it clears the modified date to avoid tracking its changes with git. #148

Changes:

  • In concept scheme sheet, modified date and version are now optional. #148

  • Update notes xlsx-template and example files. #152

  • Use rotating logfiles instead of single file by default. #149, #150

Bug fixes:

  • Modified date of concept scheme was not transferred from xlsx to rdf. #147, #148

Release 0.6.2 (2023-08-10)

New features:

  • Option --ci-post of sub-command voc4cat check was improved to detect and work with split vocabularies. #146

Release 0.6.1 (2023-08-10)

New features:

  • The merge_vocab script gained support for directories containing vocabularies created with voc4cat transform --split. This feature is used in gh-actions of voc4cat-template-based vocabularies. #144

Changes:

  • The use of logging levels was made more consistent: Success of an operation is now logged for all operations on INFO level. #145

  • The log file will now always be written to the given directory. Previously the log file directory depended on the presence of the --outdir option. #144

Bug fixes:

  • Sub-command voc4cat docs failed if --outdir was not given. #143 #144

Release 0.6.0 (2023-08-09)

New features:

  • New command line interface voc4cat that uses subcommands transform, convert, check and docs. This was added as preview in Release 0.5.1 and is now the default. With the new CLI conversion and validation are no longer coupled but can be run separately. #140, #141

  • New options for subcommand transform: --split to split a large SKOS/rdf file to a directory of files with one file per concept/collection. --join for the reverse operation of transforming the directory of files back to a single turtle vocabulary. #139

Changes:

  • As part of the CLI work, the vocexcel CLI was removed. #141

  • Consistent use and handling of exceptions. #136

Release 0.5.1 (2023-08-03)

New features:

  • New (experimental) command line interface voc4cat-ng that will replace the current one in 0.6.0. #128, #135

  • When adding IDs via –make-IDs, the new CLI offers to pass a base-IRI (see help voc4cat-ng transform --help).

Changes:

  • Various small changes to improve test coverage (now 96 %) and reduce the number of linter complaints (from 38 to 25).

Release 0.5.0 (2023-07-27)

New features:

  • Support for a vocabulary configuration file idranges.toml. Via this configuration file ranges of IDs can be assigned/reserved for individual contributors. #131, #134

  • Extended validation/checks especially useful for the CI-vocabulary pipeline of voc4cat-template. The new config provides the basis for more thorough validation. #126 #134

  • Support for pylode2 as new documentation generator which is also the new default. #115

  • Added a central logging config. Updated code to use logging instead of print() almost everywhere.

Changes:

  • Merged some parts from vocexcel to remove vocexcel as a dependency. #119

  • Various code improvements. #126, #127, #129

  • Adapted and revised example files. #137

  • Switched to ruff as code linter.

Bug fixes:

  • None.

Release 0.4.0 (2023-03-15)

First public release of voc4cat on github.

Earlier releases

Before 0.4.0 the code was in alpha state and kept private. See git commit log and the issues & milestones in this repository for the early history.

Just before 0.4.0 the code was migrated from a private gitlab instance to github. The transfer went OK but not perfect (gitlab-MRs were not well converted to github-PRs).