Changelog¶
Release 1.2.0 (2026-09-22)¶
Features:
Reviewed concept pairs can be declared as
accepted_similarityinidranges.toml. #387voc-assistantgained--outputfor the report path and--hide-acceptedto leave the accepted similarities out. #387voc-assistantcan gate a CI pipeline. A pair that still needs a decision makes the run error (exit 1) inside a GitHub Actions workflow. Pairs recorded asaccepted_similaritynever fail the run.compareis the subcommand for this, since it screens only what a submission adds. #387voc-assistantduplicate detection runs without sentence-transformers.--definitions nonescores no definitions, sovoc-assistant check --method levenshtein --definitions noneneeds neither torch nor a model download. Levenshtein scores orthographic variants below the 0.98 default (for exampleco-precipitation/coprecipitationis 0.9677), so lower the threshold to reach them. #387voc-assistantgained--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 sameskos:prefLabelare 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. #387voc-assistant: The concept links in a report now come from the newconcept_url_templateinidranges.toml, which replaces a hardcoded URL of the voc4cat development documentation. #387voc-assistant comparereported 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-defsnow 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. #387The
assistantextra is renamedsbertand no longer installsvoc-assistantitself.levenshteinmoved to the core dependencies (7 MB), sovoc-assistantworks with a plainpip install voc4cat, comparing text with the Levenshtein ratio. The extra now holds onlysentence-transformersandtorch, which the default--method sbertneeds. Replacevoc4cat[assistant]withvoc4cat[sbert]; running--method sbertwithout it fails with a message naming both the extra and the flags that avoid it. #387voc-assistantuses the logging setup ofvoc4catinstead of configuring the root logger itself when the module is imported. #387Correct the instructions for syncing a vocabulary repository with voc4cat-template. The documented
git fetch <url> tag v26.xcopies the tags of the template into the vocabulary repository, where they are indistinguishable from its own release tags. #381Correct the documentation on available SKOS relations (
skos:relatedis not supported). #390
Release 1.1.1 (2026-08-30)¶
Features:
Add
--modified-date DATEoption fortransform --prov-from-git. Concepts that differ from--diff-baseget DATE asdct:modified, and concepts that have no commit yet get it asdct:createdas 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 oneskos:prefLabelper language, whichvp4cat-5.2rejected. It also drops the VocEdit SHACL UI shapes that made every label result appear twice.vp4cat-5.2stays bundled for pinning. #366The
voc4catpackage is now fully type-annotated and type-checked under a strictzubanconfiguration, enforced by a pre-commit hook. It ships apy.typedmarker (PEP 561), so downstream consumers get the annotations when type-checking their own code against this package. #362Add a version-neutral profile token
vp4catthat always resolves to the current vp4cat profile. Use a versioned token such asvp4cat-5.3to pin the version. #351, #352The IRIs of the vp4cat profiles now match the redirects configured at w3id.org, so
https://w3id.org/nfdi4cat/vp4catis dereferenceable. #317Development tooling moved from extras to PEP 735 dependency groups, so
uv syncinstalls it by default and it no longer appears in the published package metadata. Onlyassistantremains an extra. Type checking moved from mypy to zuban. #361Documentation brought in line with what the tool does: the recipe list of the voc4cat-template justfile, the
transform --diff-baseoption, the mandatoryVOCABargument ofvoc4cat template, the environment variables that are actually read, thedct:isReplacedBycolumns and vp4cat as the default profile. The quickstart now accounts for the example rows thatvoc4cat templatewrites. #365Detect CI through
GITHUB_ACTIONSinstead ofCI_RUN, which replaces that environment variable. The checks ofcheck --ci-preand--ci-postthat are advisory locally and fatal in the pipeline consultedCI_RUN, which no repository set, so they stayed advisory everywhere: a stray file in the inbox and a missingGITHUB_ACTORboth passed CI. GitHub Actions always setsGITHUB_ACTIONS, so repositories need no configuration. #370The inbox check now names the offending files instead of only restating the rule, and tells contributors who submitted a legacy
.xlsfile to save it in the.xlsxformat. Markdown documentation of any name is accepted, which the previous message described too narrowly asREADME.md. #370Document that repositories using
transform --prov-from-gitmust 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_pidlogged a spurious error. #365Return the exit code of
git merge-filefromvoc4cat-mergeinstead of collapsing every failure to1. The walrus operator binds less tightly than!=, soretcode := outp.returncode != 0stored a boolean and discarded git’s count of unresolved conflicts. #364Reject IRIs whose ID is outside the ID range(s) granted to the contributor.
check --ci-postnow validates the IDs added by the acting contributor (fromGITHUB_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, #369Generate template example rows with IDs from the first configured ID range. Previously
voc4cat templatealways suggestedex:0001001and the non-numericex:collection001, which are outside the ID ranges of the shipped starter configuration. #359Detect removal of ordered collections.
check --ci-postonly looked forskos:Conceptandskos:Collection, so deleting askos:OrderedCollectionwent unnoticed. #359Match the vocabulary name case-insensitively when reading its
allow_deletesetting. A vocabulary file with uppercase letters in its name silently fell back to forbidding deletion. #359Fail when
voc4cat docsis asked for pyLODE documentation and pyLODE is missing. The command logged an error and returned successfully, somerge.ymlandpublish.ymlwould have gone green and published gh-pages without regenerated documentation if their pyLODE install step ever broke. #375Compare against the previous version of a vocabulary stored in split form.
check --ci-postjoined 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 hadallow_deleteenforced. #368
Release 1.0.4 (2026-02-23)¶
Features:
Add
--diff-base REFoption fortransform --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 withid_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
--splitoption 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--joinoption supports both the new partitioned structure and the previous flat structure. #328Namespace prefixes in RDF: The
transformcommand now uses namespace bindings/prefixes in output (as convert already did). #327Longturtle 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:provenancewith IRI value (Req. 2.2.2). #325, #326Fix reporting for
check --redundant-hierarchies. #323Fix 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: Addsdct:createdanddct:modifieddates 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 hasskos:broaderto both a parent and an ancestor of that parent.Added
dct:isReplacedBycolumns to Concepts and Collections sheets for specifying replacement IRIs when deprecating concepts.
Changes:
Changed
dct:identifierformat: Now uses just the local numeric ID (e.g.,0000123instead ofvoc4cat_0000123).skos:historyNotesolely 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.tomlconfig.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:hadPrimarySourceand to reference itsdct:licenseand thedct:rightsHolder. This allows referencing the source.Git blame links: Provenance information links to git blame URLs for traceability.
Dynamic
skos:historyNote: Auto-generated fromPROV.wasInfluencedByand 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:
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:
Change:
Release 0.9.1 (2025-03-19)¶
Bug fixes:
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) asex:001 (example 001). The preferred label is used as qualifier of the IRI (in round brackets). #253, #258Improve 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
Changes:
New, better styled default template
src/voc4cat/blank_043.xlsx#265
Bug fixes:
Release 0.8.8 (2025-01-27)¶
0.8.8 only contains a fix for a bug introduced in 0.8.6.
Bug fixes:
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:
Release 0.8.5 (2024-03-09)¶
Bug fixes:
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:
Release 0.8.2 (2024-02-21)¶
Bug fixes:
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:
Breaking changes:
Release 0.7.10 (2024-02-11)¶
New features:
Add coverage summary as job output. #197
Changes:
Release 0.7.9 (2024-02-01)¶
Bug fixes:
Release 0.7.8 (2023-10-30)¶
Bug fixes:
Release 0.7.7 (2023-10-30)¶
Changes:
Bug fixes:
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:
Changes:
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, #151Support 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:
Release 0.6.2 (2023-08-10)¶
New features:
Option
--ci-postof sub-commandvoc4cat checkwas improved to detect and work with split vocabularies. #146
Release 0.6.1 (2023-08-10)¶
New features:
The
merge_vocabscript gained support for directories containing vocabularies created withvoc4cat 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
--outdiroption. #144
Bug fixes:
Release 0.6.0 (2023-08-09)¶
New features:
New command line interface
voc4catthat uses subcommandstransform,convert,checkanddocs. 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, #141New options for subcommand
transform:--splitto split a large SKOS/rdf file to a directory of files with one file per concept/collection.--joinfor the reverse operation of transforming the directory of files back to a single turtle vocabulary. #139
Changes:
Release 0.5.1 (2023-08-03)¶
New features:
New (experimental) command line interface
voc4cat-ngthat will replace the current one in 0.6.0. #128, #135When 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, #134Extended 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
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).