Changelog
Deployement repository
Worker update by Marco De Donno at 2026-06-11 19:15:51
Remove the `nginx` streams and expose directly the mandatory containers by Marco De Donno at 2026-06-11 19:14:11
Worker update by Marco De Donno at 2026-06-02 11:43:15
Force UTC timezone everywhere by Marco De Donno at 2026-05-29 18:49:30
Worker update by Marco De Donno at 2026-05-28 20:06:15
Worker update by Marco De Donno at 2026-05-26 23:02:37
Add the `/tmp/cache` tmpfs mount folder for the worker by Marco De Donno at 2026-05-17 17:12:57
`nginx` and `worker` submodules update by Marco De Donno at 2026-05-10 18:58:01
Force the gitlab CICD git strategy to `clone` by Marco De Donno at 2026-02-10 17:20:51
Documentation update by Marco De Donno at 2026-02-10 16:59:04
Update the `worker` submodule by Marco De Donno at 2026-02-10 16:58:46
Update the `nginx` submodule by Marco De Donno at 2026-02-10 16:57:16
Use `uv` as a python package manager by Marco De Donno at 2025-12-11 13:00:21
`pip` seems to have some issues to resolve correctly non-trivial dependencies.
Automatically get the branch name in the documentation by Marco De Donno at 2025-12-04 17:51:59
Update submodules by Marco De Donno at 2025-12-04 16:27:06
Add basic documentation by Marco De Donno at 2025-12-04 15:04:36
Basic docker-compose file by Marco De Donno at 2025-10-29 18:18:12
Add services submodules by Marco De Donno at 2025-10-23 17:17:44
Initial commit by Marco De Donno at 2025-10-11 16:35:45
Worker
Add the favicon.ico file by Marco De Donno at 2026-06-11 20:16:29
Check the input JSON data format by Marco De Donno at 2026-06-11 19:46:49
Library update by Marco De Donno at 2026-06-11 18:19:08
Refactoring of the Dockerfile to maximize the docker cache hit by Marco De Donno at 2026-06-11 17:18:36
Remove hard-coded `idc` values, and use the `search_idc` and `reference_idc` values from the config by Marco De Donno at 2026-06-10 20:33:11
Libraries update by Marco De Donno at 2026-06-10 19:42:02
Documentation update by Marco De Donno at 2026-06-10 19:41:54
Add checks for some mandatory data by Marco De Donno at 2026-06-08 14:21:25
Uniformization of the naming by Marco De Donno at 2026-06-08 14:18:14
‘search’ instead of ‘mark’, ‘reference’ instead of ‘print’, no abbreviation.
Add the `task_xn_to_leave_one_out` in the workflow by Marco De Donno at 2026-06-04 16:06:15
Add the `xn_to_leave_one_out()` and `xn_to_all_subsets()` functions by Marco De Donno at 2026-06-04 16:04:05
Force update the local cache at startup, and runs `spec.exe` once by Marco De Donno at 2026-06-04 15:38:31
This permits to force run, at startup, once the `wine spec.exe` command to force wine to initialize all the folders and stuff it needs. This is done because, sometimes, when the first `wine spec.exe` execution is done in a task, the task hangs (for no reasons), and crash the workflow. Maybe this commits will help, who knows …
Return the local path of the cached files in the `fs` functions related to the local cache by Marco De Donno at 2026-06-04 15:21:10
Update the return type of the `fs.ls()` function to be a `minio.datatypes.Object` object by Marco De Donno at 2026-06-04 15:18:14
Update the list of annotation type for the annotationlist_to_pkmat() function by Marco De Donno at 2026-06-04 13:27:50
PKMAT lib update by Marco De Donno at 2026-06-04 12:43:22
Merge back the useless split between the API v1.9 et v2 by Marco De Donno at 2026-06-04 12:41:33
Check for the size of the ROI by Marco De Donno at 2026-06-02 16:19:56
Since the PKMAT format only supports for 1inch size, the API have to check if the input data fits in this ROI. The check is only done on the paired minutiae since non-paired ones are not critical in the matching process, and will be dropped if falling outside the PKMAT area.
Create the PDF report by Marco De Donno at 2026-06-01 22:14:29
Create the cropped diptych images (raw and annotated) by Marco De Donno at 2026-06-01 22:10:02
Force crop the input images from PiAnoS to 1inch square by Marco De Donno at 2026-06-01 22:04:48
Generate the TPS distortion grid by Marco De Donno at 2026-06-01 21:45:16
Clean TPS imports by Marco De Donno at 2026-06-01 21:44:25
Add support of `PIL.Image` to the `filestore.write()` function by Marco De Donno at 2026-06-01 21:08:02
Update LR metrics by Marco De Donno at 2026-06-01 16:41:13
Add the pourcentils 30 and 70 for the within- and between-variability (`within_p30`, `within_p70`, `between_p30`, `between_p30`), and symetric-log dLR/ds (`sl_dlr`) and symetric-log DM factor (`sl_dm`)
Move the `post/json` route to the `/v1.9` legacy api endpoint by Marco De Donno at 2026-05-30 14:58:35
Get some configuration from the environment variables by Marco De Donno at 2026-05-30 14:15:31
Add typing by Marco De Donno at 2026-05-30 14:08:07
Add the basic `post/nist` route to start a job with a xn file by Marco De Donno at 2026-05-30 13:23:51
Add the logo at startup in the `start.sh` script by Marco De Donno at 2026-05-29 21:33:57
Add the `models` folder to the cached folder by Marco De Donno at 2026-05-29 20:54:42
Move configuration to the `config.py` file and remove conflicting config by Marco De Donno at 2026-05-29 20:28:46
Refactoring of the `spec()` function by Marco De Donno at 2026-05-29 20:13:58
Force UTC time by Marco De Donno at 2026-05-29 18:46:33
Uniformization of the tasks function names by Marco De Donno at 2026-05-29 15:45:40
Force the `spec` matcher to be locally-cached and pulled from filestore by Marco De Donno at 2026-05-29 15:20:22
Refactoring of the `filesStorage` class by Marco De Donno at 2026-05-29 15:17:44
No changes in functionality.
Move the option to save to PiAnoS up the call-chain, in the route used by PiAnoS by Marco De Donno at 2026-05-28 23:35:12
Force the types in the LR computation by Marco De Donno at 2026-05-28 22:40:42
For some cases, the input values are interpreted as unsigned numpy values. This cause problems when the value is negative, for example with the `devidence` variable when the search is not in rank 1 (i.e. the max between value is higher than the evidence score, hence the devidence negative).
Refactoring of the `to_json_safe()` function to catch more numpy types by Marco De Donno at 2026-05-28 21:47:36
Assisted-by: Claude:claude-sonnet-4-6
Generate the mark and reference images (normal and annotated) by Marco De Donno at 2026-05-28 20:51:32
Add the `db_save_pianos()` function to the main workflow by Marco De Donno at 2026-05-28 20:05:21
Libraries update by Marco De Donno at 2026-05-28 16:22:02
Refactoring of the `xn.get_minutiae()` and `xn.get_minutiae_paired()` functions by Marco De Donno at 2026-05-28 15:07:12
Patch: Only save the pairing information for corresponding minutiae, not cores by Marco De Donno at 2026-05-27 00:00:48
Simplify the `spec` function to leverage the filestore cache by Marco De Donno at 2026-05-26 22:58:52
Use correct HTTP error codes by Marco De Donno at 2026-05-26 20:46:37
501 for not implemented features 500 if we can not, for some reasons, delay the processing task to the cluster
Check for non-implemented options, and raise in the preflight checks by Marco De Donno at 2026-05-26 19:00:41
Check if the AFIS result is not empty, raise otherwise by Marco De Donno at 2026-05-26 19:00:03
Workflow refactoring, no changes in functionality by Marco De Donno at 2026-05-26 18:59:28
Refactoring of the `Database` object to be more resilient to already disconnected server by Marco De Donno at 2026-05-26 17:43:47
Add the generation of the TPS.json file to the workflow by Marco De Donno at 2026-05-25 23:58:04
Library update by Marco De Donno at 2026-05-25 19:53:10
Create and run the workflow in the `input_json_process()` function by Marco De Donno at 2026-05-25 19:52:16
Check if the database is connected in the `Database.query()` and reconnect as needed by Marco De Donno at 2026-05-25 19:50:52
Force the name of the `input_json_process` in Celery by Marco De Donno at 2026-05-25 16:34:46
Set the default priority for a task to 250 (near max priority) by Marco De Donno at 2026-05-25 16:00:00
This is done to ensure that there is a high priority for tasks without a priority at all. This can append in some weird circumstance where Celery decide to remove the priority, in particular with some complex workflow (for example with a `chain(task, chord)`).
Refactor the `Database` object initialization parameters by Marco De Donno at 2026-05-25 15:57:19
Refactoring to take as argument a connection string instead of a dictionary or connection variables
Get the postgresql port from the environment file, or get default value by Marco De Donno at 2026-05-25 15:55:46
Get the type of transaction with the `transaction_type` request parameter by Marco De Donno at 2026-05-25 15:49:23
Add the `db_save_pianos` function by Marco De Donno at 2026-05-25 15:48:30
First draft, we dont have the generation of the PDF at the moment.
[bug] Wrong values for the centils for the evidence by Marco De Donno at 2026-05-25 15:10:53
The between- and within-centil position of the evidence are mixed up.
Refactoring of the `Database` object by Marco De Donno at 2026-05-24 20:07:28
Libraries update by Marco De Donno at 2026-05-24 19:24:41
Add the minutiae count to the output LR json object by Marco De Donno at 2026-05-24 19:19:32
Save the PiAnoS request and other miscellaneous metadata to the filestore by Marco De Donno at 2026-05-24 19:17:15
Add typing by Marco De Donno at 2026-05-24 15:57:19
Update worker configuration by Marco De Donno at 2026-05-21 21:42:02
Patch the workflow, to have the within, between and evidence done at the same time by Marco De Donno at 2026-05-21 21:29:54
Apparently, this works to set the priority of the tasks in the inner chord. This is only working because the use of the `|` AND the `group`. If we use either the `task_xn_to_pkmat` as normal `Task` (not a group), OR a chain(group, chord) instead of the `group | chord` (should be the same, but apparently not), then the priority of the inner tasks are not working correctly.
Configure `matplotlib` to be headless by Marco De Donno at 2026-05-20 19:49:12
Configure the drawing backend to `Agg` (headless) and close the plotting device after using it.
Add typing by Marco De Donno at 2026-05-18 01:39:28
Fix the priority problem by Marco De Donno at 2026-05-18 01:36:33
With group in group, we loose the priority of inner tasks. This is probably due to a bug in Celery doing a reorganization of the tasks (ex: chains of chain are flatten by celery before sending to the backend server).
Force the name for all tasks by Marco De Donno at 2026-05-18 01:34:54
The `shadow` parameter allows to change the name of the task on the fly. This is done to have more detailed statistics regarding the execution time for each context of execution (for example, the `spec` function is used for different type of matching, with different typical execution time).
Refactoring of the case folder path arguments by Marco De Donno at 2026-05-17 23:53:41
Remove the `main_uuid` and `base_folder`, and replace with the merged full path of the case `case_path`.
Add the main folder process function (`process_folder`) by Marco De Donno at 2026-05-17 23:14:57
This is the main function that create the entire workflow, and send it to the cluster.
Clean unused imports by Marco De Donno at 2026-05-17 23:09:15
Add local cache for some FileStore path by Marco De Donno at 2026-05-17 19:34:55
This is useful for between galleries, to reduce the network transfer.
Configure the `wine()` task (queue and time_limit) by Marco De Donno at 2026-05-13 22:18:42
If there is a problem with the spec binary, the task will be requeued after a delay of 10 minutes. If not doable, the task will be aborted.
Remove the useless `join()` task by Marco De Donno at 2026-05-13 22:17:41
Use the `Celery.group()` function instead.
Only return string path in the filestore by Marco De Donno at 2026-05-13 22:14:01
This enable the return value to be easier to store as json object in the RabbitMQ server. This will server when changing the serializer to the `json` one.
Remove the useless overload of the task signature functions by Marco De Donno at 2026-05-13 22:08:34
This was done mainly to update options for tasks, for example the priority. This is can be done easily with the `function.s().set(option=value)` function call instead.
Remove unused imports by Marco De Donno at 2026-05-13 15:16:49
Configure the default retry options by Marco De Donno at 2026-05-13 15:12:40
Move the default task configuration values to the `myTask` object by Marco De Donno at 2026-05-13 15:11:31
Force the same version of the celery and flask as Debian 13 by Marco De Donno at 2026-05-13 15:04:06
Force the uniformity of versions between the Docker and Debian deployments.
Update the linter configuration by Marco De Donno at 2026-05-13 14:59:21
Show unused imports, and don’t scan `venv` folder.
Submodules libraries update by Marco De Donno at 2026-05-13 14:54:37
Patch the call for the `spec.exe` binary by Marco De Donno at 2026-05-13 14:48:19
This assume that the container has a folder `/xenabin` mounted with the .exe binaries (at least the `spec-bis.no.exe`) binary.
Add the missing `curl` binary for healthchecks by Marco De Donno at 2026-05-13 14:47:50
NIST library update by Marco De Donno at 2026-05-10 18:56:42
Remove the `eventlet` library, migrate to `gthread` by Marco De Donno at 2026-05-10 18:55:01
Egli 2009 model refactoring by Marco De Donno at 2026-05-04 18:32:46
Add the ESLR calculation in the Egli model by Marco De Donno at 2026-05-04 16:57:06
Move the calibration function in the models.py module by Marco De Donno at 2026-05-04 16:55:15
Since the calibration model is related to the specific model, it will only be used with this specific model, hence the move in the same file.
Consolidate the calibration process in the model fit by Marco De Donno at 2026-05-04 13:49:24
Add function typing in the tasks.py file by Marco De Donno at 2026-04-28 13:26:48
Add the calibration step and model by Marco De Donno at 2026-04-28 12:58:56
Add the calibration function based upon the calibration done on the NIST SD27 the 2018.03.17.
Add the build of the Dockerfile with kaniko by Marco De Donno at 2026-03-16 18:39:31
Move the start command to the `start.sh` script and force Wine to start in background by Marco De Donno at 2026-03-16 17:25:23
The `startserver -p` command is a wine command that loads wine and keep it working in the background. This will reduce the start time for each wine execution since the context will not be reloaded each time.
Patch the worker .pth file generation by Marco De Donno at 2026-03-16 16:57:48
Add the `calcLR()` function by Marco De Donno at 2026-03-16 13:51:23
Add PKMAT files for self-matching by Marco De Donno at 2026-03-11 13:21:30
This saves the mark as a reference, and the reference as a mark. This will enable the matching against herself.
Update the TPS library by Marco De Donno at 2026-03-11 12:27:23
Add headers to the matching result file, and processing functions by Marco De Donno at 2026-03-11 12:27:05
Add support for `numpy.ndarray` objects to the `to_json_safe` function by Marco De Donno at 2026-03-11 12:23:51
Add the `fs.readline_generator()` function to yield one line at the time by Marco De Donno at 2026-02-19 20:43:47
Add wine32 binaries to the worker image by Marco De Donno at 2026-02-17 19:36:10
This is mandatory to run the `spec.exe` binary.
Port the worker to use debian:13 as base image by Marco De Donno at 2026-02-17 19:33:57
No change in functionality, only a preparation for later utilities to add to the docker image.
Add missing python libraries to the python venv by Marco De Donno at 2026-02-17 18:42:29
Force the usage of python 3.13.5 by Marco De Donno at 2026-02-17 18:17:34
This is done to have an uniform python version between all modules. This corresponds to the version available on Debian stable.
Add the `merge_matching_file` task by Marco De Donno at 2026-02-17 17:28:51
Add the filestore `readlines` function by Marco De Donno at 2026-02-17 17:14:51
Add the filestore `exists` function by Marco De Donno at 2026-02-17 16:31:50
Add the filestore `remove` function by Marco De Donno at 2026-02-17 16:31:32
Force the use of local cache for reference galleries by Marco De Donno at 2026-02-17 16:15:34
Add the `spec` task by Marco De Donno at 2026-02-17 13:05:57
Set the correct name in the PKMAT files by Marco De Donno at 2026-02-17 13:04:06
This name is used by the `spec` matcher, and is present in the resulting matching file. This add will help the processing of the score data later on.
Add the `join()` task by Marco De Donno at 2026-02-12 18:42:45
Patch all S3 file type by Marco De Donno at 2026-02-12 18:38:32
Simplify and uniformize the task call parameters by Marco De Donno at 2026-02-12 18:08:37
Force the gitlab CICD git strategy to `clone` by Marco De Donno at 2026-02-10 17:20:20
Check for mark and reference image resolutions, shall be 500dpi by Marco De Donno at 2026-02-09 16:29:34
Since the AFIS matcher is at 500dpi, and there is not a resolution changer at the moment in the NIST library, Xena will simply refuse to parse non-compliant files.
Use the correct 400 error code when the request is not compliant with Xena requirements by Marco De Donno at 2026-02-09 16:28:58
Move all PKMAT files to the PKMAT folder by Marco De Donno at 2026-02-09 16:24:58
Add the `xn_within_pkmat` task by Marco De Donno at 2026-02-08 16:34:47
Add the functions related to model/object loading and dumping by Marco De Donno at 2026-02-08 16:26:33
Set all annotations type in the XN file, including the cores and deltas by Marco De Donno at 2026-02-06 17:01:55
Patch the API to put the case in the `cases` folder by Marco De Donno at 2026-02-06 16:59:53
Rename the Xena NIST object file to avoid import error with the NIST library by Marco De Donno at 2026-02-06 16:50:01
Add the `xn_to_pkmat` task by Marco De Donno at 2026-02-06 13:50:46
Create, based upon the input Xena file, the mark and reference PKMAT files (with only the paired and all minutiae).
Force single import per line by Marco De Donno at 2026-02-04 22:11:23
Update the NIST library by Marco De Donno at 2026-02-04 22:07:22
Add the conversion function from AnnotationList to PKMAT by Marco De Donno at 2026-01-30 19:56:02
Replace the `NIST` class with the `xn(NIST)` overloaded one by Marco De Donno at 2026-01-30 16:27:52
Implement the basic `xn` class to add Xena specific NIST capabilities, and implement the `get_minutiae_paired()` function.
Add the function and task to create the TPS object by Marco De Donno at 2026-01-22 14:40:53
Force the data to be saved as bytes to the datastore by Marco De Donno at 2026-01-22 14:01:59
Move the configuration of mark and reference IDC to the config file by Marco De Donno at 2026-01-22 14:01:38
Update the NIST library by Marco De Donno at 2026-01-22 13:52:25
Add the TPS submodule by Marco De Donno at 2026-01-22 13:52:03
Move the location for cases into a sub-folder by Marco De Donno at 2026-01-13 16:13:49
Add the `json_to_xn` task by Marco De Donno at 2026-01-13 15:05:31
This task will convert the PiAnoS4 json post to the internal Xena NIST format.
Add the `producer` and `main_uuid` options to the worker options by Marco De Donno at 2026-01-13 12:29:14
Libs update by Marco De Donno at 2026-01-13 12:37:16
Add the `make format` rule by Marco De Donno at 2026-01-09 16:49:13
Libs update by Marco De Donno at 2026-01-09 16:36:26
Add the filestore `ls()` method to list a folder by Marco De Donno at 2026-01-09 16:35:25
Save the `data.json`, mark and reference files on api `post/json` call by Marco De Donno at 2026-01-09 16:33:20
Update the NIST library by Marco De Donno at 2025-12-04 16:26:00
Only format the Xena module by Marco De Donno at 2025-12-04 14:51:12
The libraries will be formatted by the libraries them self in the respective repositories and gitlab pipelines, no need to reformat them here; moreover, the formatting is not descriptive (done in 3 steps, the later ones re-formatting the first ones), hence not easy to validate in the pipeline.
Add the python libraries by Marco De Donno at 2025-12-04 13:38:57
Overload the celery task .si() function to set the priority by Marco De Donno at 2025-11-12 22:37:17
Same overload as per the .s() function, but for the immutable signatures. The `subtask` and the `signature` functions are exactly the same in the celery Task() object.
Remove the useless myChain(chain) object by Marco De Donno at 2025-11-12 22:12:18
This myChain object was done to patch the priority and uuid of the tasks. This operations will be done in the future in an object managing the entire workflow, and not at a per-task or per-chain level.
Add the basic route to upload a json file by Marco De Donno at 2025-11-07 14:40:27
Add basic myTask (celery.Task) and myChain (celery.chain) overloads by Marco De Donno at 2025-11-07 13:59:47
Migrate the default serialization method to pickle by Marco De Donno at 2025-11-07 02:15:00
Some tasks need to pass python objects to one an other, which is not possible using json.
Wrapping the file storage logic in the fileStorage object by Marco De Donno at 2025-11-05 15:45:19
This will simplify the logic on writing and reading files from the server, in particular if we have to change the server type. This class may only have a self.server object, one self.write() and self.read() functions.
Move the myQueue object to the object module by Marco De Donno at 2025-11-05 15:16:56
Reorganization of the routes by Marco De Donno at 2025-11-04 23:33:49
Drop the `.0` for the first v2 version, and add an additional version-tagged route for the `base` views.
Remove useless pycycle by Marco De Donno at 2025-11-04 16:26:46
There is apparently a bug with pycycle, it’s detecting cycles in the CI but not locally. Deletion of that validation for the moment.
Add the workerOptions class, and pass the options to the route if needed by Marco De Donno at 2025-11-04 16:10:19
Add the api.errorhandler(APIError) method by Marco De Donno at 2025-11-04 15:19:27
This enable the simplification of the error handling for the api.
Add the validation of the token by Marco De Donno at 2025-10-29 23:16:00
This validates the API token against the database
Add the postgres connector by Marco De Donno at 2025-10-29 23:14:00
Reorganization of the Xena module by Marco De Donno at 2025-10-28 22:51:11
Add pycycle in the gitlab cicd validation step by Marco De Donno at 2025-10-28 18:30:01
Initial commit by Marco De Donno at 2025-10-23 15:45:50
Basic port of the legacy app
Libraries
NIST
Add the typing for for `Annotation` and `AnnotationList` for the `+=` operator by Marco De Donno at 2026-06-10 20:05:21
And force upgrade the minimum requirement to 3.11. The `typing.Self` type is only available starting with 3.11.
Doc update by Marco De Donno at 2026-06-10 19:32:17
Add optional color for the `annotate()` function by Marco De Donno at 2026-05-28 16:11:53
Remove useless `pyright: ignore` statements by Marco De Donno at 2026-05-27 00:13:57
Add the `scale_image()` (and `changeResolution()` for retrocompatibility) function by Marco De Donno at 2026-05-25 18:44:41
Add the documentation for the `get_minutiae_format` function by Marco De Donno at 2026-05-25 18:39:36
Notify the user with a log.warning() if some minutia is removed form the NIST object by Marco De Donno at 2026-05-25 18:36:58
If some minutiae are not inbound as per the documentation, the minutiae can not be stored in the object, and are removed. The user should be notified if this appends.
Minutiae in the traditional format should be between 0000 and 5000 by Marco De Donno at 2026-05-25 18:35:02
Patch the function `traditional_minutia_is_inbound()` and change the documentation of the function.
Update the details regarding the python versions supported by Marco De Donno at 2026-05-19 22:05:58
Add return types for Annotation and AnnotationList functions by Marco De Donno at 2026-05-18 15:19:24
Remove useless `fpc_list` variable definition by Marco De Donno at 2026-05-18 15:13:43
Bugfix in the `set_field()` function by Marco De Donno at 2026-05-18 15:13:08
Use more correct `auto()` type, since we accept unknown objects and try to load by Marco De Donno at 2026-05-18 15:07:44
Re enable warnings for UnusedImport, and disable the warning on case-by-case by Marco De Donno at 2026-05-07 17:18:57
Patch the types for the `functions.toPIL()` function by Marco De Donno at 2026-05-07 17:04:27
Since we don’t know what type is passed as input to the `toPIL()` function, the correct type should be `object`.
Add the `FieldTag` type, and patch a bug in the `field_splitter` function by Marco De Donno at 2026-05-07 16:21:55
Add the `add_checksum_data_field()` function by Marco De Donno at 2026-05-06 19:28:43
Recompute and store the sha256 hash of all the DATA (999) fields in the NIST object. The re computation is done when cleaning the NIST object.
Update all hashed to sha256 by Marco De Donno at 2026-05-05 14:04:40
This is done to unify all hashes function, as per the NIST documentation regarding the x.996 fields.
Add the `__len__()` function to get the size of the NIST object as if it would be written on disk by Marco De Donno at 2026-05-05 13:17:37
Add the `AnnotationList.__iadd__()` function to support += operator by Marco De Donno at 2026-02-06 18:34:41
This will call the equivalent `__iadd__()` function for each Annotation in the AnnotationList.
Force single line import by Marco De Donno at 2026-02-04 22:03:04
Add the `crop_image` function by Marco De Donno at 2026-01-30 15:13:53
Add the `set_annotations` function by Marco De Donno at 2026-01-29 19:49:20
Add the `Annotation.class_name` function by Marco De Donno at 2026-01-29 19:46:50
Add the `set_cores` and `set_deltas` functions by Marco De Donno at 2026-01-29 16:10:02
First draft of the functions, no extensive tests documented and added to those functions.
Add the `get_minutiae_format` function by Marco De Donno at 2026-01-28 16:49:28
Add the __iadd__ (+=) operator for the `Annotation` object by Marco De Donno at 2026-01-28 16:49:00
Remove an import cycle between `objects` and `functions` by Marco De Donno at 2026-01-21 17:38:25
Add support for lower case image format name by Marco De Donno at 2026-01-13 12:34:48
Add `debian:stable` and `debian:testing` as test targets by Marco De Donno at 2025-12-19 18:04:15
Force the usage of debian:13 main target by Marco De Donno at 2025-12-19 17:44:14
Add missing `idc` in `validate_type09` and `set_image` functions by Marco De Donno at 2025-12-11 14:24:53
Add the test of the library for the `latest` tag by Marco De Donno at 2025-12-10 20:28:21
Usually, this will be exactly the same as the current tagged version, but, when a new python version is out, the pipeline will automatically test it, even if the library is not specifically tagged against it, just in case.
Clean up the gitlab pipeline by Marco De Donno at 2025-12-10 18:32:01
Use `uv` for package management by Marco De Donno at 2025-12-10 16:12:38
Apparently, `pip` has some issues to resolve complex dependencies. This was the case between `sphinx_rtd_theme` and `sphinx`; once `sphinx` latest was installed (i.e 9.0.4), sphinx_rtd_theme was not able to force the installation of <9, as requested, even if in the same `requirements` file.
Add Type-09 EFS format reader by Marco De Donno at 2025-12-08 22:08:06
Add the `target_format` parameter to the `set_minutiae()` function by Marco De Donno at 2025-12-08 16:50:44
This is done in prevision of the next changes to support more formats.
Rename the Type-09 “standard” format to “traditional” by Marco De Donno at 2025-12-08 16:31:17
Force the usage of the current directory for doctest coverage by Marco De Donno at 2025-12-08 13:41:37
Add the coverage html report in the gitlab pipeline by Marco De Donno at 2025-12-08 13:03:11
Do not crash the Type-09 detection if the annotation type is not yet defined by Marco De Donno at 2025-12-08 12:47:38
Documentation update by Marco De Donno at 2025-12-08 12:44:45
Get the name of the branch automatically in the documentation by Marco De Donno at 2025-12-04 16:47:19
Documentation update by Marco De Donno at 2025-11-28 23:22:59
Stylize the documentation changelog by Marco De Donno at 2025-11-28 19:22:49
Add the build date on the index of the homepage by Marco De Donno at 2025-11-28 18:30:07
Add support to get fields by name (`get_field()`) by Marco De Donno at 2025-11-28 18:42:38
Same logic as for the `set_field()` function
Add support to set fields by name (`set_field()`) by Marco De Donno at 2025-11-28 17:53:44
Documentation layout update by Marco De Donno at 2025-11-28 17:05:02
Add the `set_image` and related functions by Marco De Donno at 2025-11-28 15:59:49
Patch some linter complains by Marco De Donno at 2025-11-28 14:16:06
Add types and shutdown some other warnings where a type may be be easy to add.
Documentation update by Marco De Donno at 2025-11-28 02:18:46
Ensure the full git history is cloned in the gitlab runner by Marco De Donno at 2025-11-28 00:58:46
By default, only 50 commits are cloned, which mess up the changelog in the documentation.
Remove the source code from the html documentation by Marco De Donno at 2025-11-28 00:39:12
Show all commits in the changelog chapter of the documentation by Marco De Donno at 2025-11-27 23:39:30
Update typing for the `convert_image_to_format` function by Marco De Donno at 2025-11-27 20:56:52
Add the `set_minutiae` function by Marco De Donno at 2025-11-26 23:20:35
Add the `has_field_any` function by Marco De Donno at 2025-11-27 19:37:51
Refactoring of the Annotation (and children) objects by Marco De Donno at 2025-11-26 23:13:39
Patch the installation process by Marco De Donno at 2025-11-26 17:45:50
On some python versions, in particular all `-slim` versions, the installation was not done correctly. The image folder was not pushed to the target installation folder. This lists the full folder to force-add to the target folder, including the `image` folder.
Add support for str and int types in the `set_field` function by Marco De Donno at 2025-11-26 16:38:52
Add the `BASE_DIR` variable and use it in image opening by Marco De Donno at 2025-11-26 16:02:14
This will enable the usage of scripts, like the `itl` script, to be used from outside the NIST base directory.
Do not crash the `get_annotations` function if no data is present for one particular type. by Marco De Donno at 2025-11-24 16:42:11
Skip empty minutiae in the `get_minutiae` function by Marco De Donno at 2025-11-24 16:34:51
If, for some reasons, the NIST file contains minutiae field that are malformatted, in this case with empty minutia, the function will simply skip over this field. We may have to check the logic later on one more time.
Add the `ensure_has_mandatory_fields` function by Marco De Donno at 2025-11-24 16:13:26
This will check the content of the Record Type-01, and add mandatory fields if needed.
Add the `has_record` and `has_field` functions by Marco De Donno at 2025-11-24 16:10:54
Do not raise an exception on non-existing fields by Marco De Donno at 2025-11-24 15:20:47
If the field is not define in the NIST standard, and the lib can still parse the NIST file, the parser will only raise an exception and consider the field as ASCII without a label.
Add the `pyproject.toml` configuration file by Marco De Donno at 2025-11-21 23:38:03
Force the object to have mandatory Record Type-01 by Marco De Donno at 2025-11-20 15:55:59
Add support to pass variables via kwargs for `Annotation` objects by Marco De Donno at 2025-11-13 11:47:13
Add more variable types for the Annotation object (and children classes) by Marco De Donno at 2025-11-13 11:45:39
Apply code linter recommendations by Marco De Donno at 2025-11-13 11:44:42
Change typing for optional argument by Marco De Donno at 2025-11-13 06:17:47
Use `Optional` instead of `| None`
Remove the build of the Docker image by Marco De Donno at 2025-10-11 20:58:06
It’s maybe not interesting to only have a docker image that contains this library, hence the removal of the build of the docker image.
Split the Docker build process into multistage by Marco De Donno at 2025-10-11 15:12:46
Add support for Python 3.14 by Marco De Donno at 2025-10-09 12:13:43
Add support for pypy 3.11 by Marco De Donno at 2025-08-18 09:17:26
format the .gitlab-ci.yml file by Marco De Donno at 2025-04-15 01:26:28
Use absolute imports instead of relative imports by Marco De Donno at 2025-04-11 14:21:37
Update the `bytes_iterator()` class by Marco De Donno at 2025-04-04 17:57:14
Add asserts by Marco De Donno at 2025-04-04 17:56:42
Documentation update by Marco De Donno at 2025-04-04 17:56:08
Add support for selecting IDC in the `dump()` function by Marco De Donno at 2025-04-02 10:13:11
Add support for RAW 1bit (black and white) images by Marco De Donno at 2025-03-30 06:35:01
Refactoring of the `toPIL()` function by Marco De Donno at 2025-03-30 06:08:57
Refactoring of the `get_label()` function by Marco De Donno at 2025-03-28 23:10:48
And add the `user_defined_fields_ranges()` function
Refactor `search_and_get_label` to `get_field_by_name` by Marco De Donno at 2025-03-28 21:31:38
And patch called functions
Force the printed output to be sorted by key by Marco De Donno at 2025-03-24 00:46:27
Add the `toPIL` and `convert_image_to` functions by Marco De Donno at 2025-03-21 23:50:42
Add support for partial doctest by Marco De Donno at 2025-03-21 00:25:32
Since multiple functions are heavy to test, in the context of constant test of the library while developing, some functions can be temporary disabled. The test of all functions is sill done with the normal test, with docker and on the cicd pipeline.
Add tests for the field data with printable_field_separator by Marco De Donno at 2025-03-20 17:24:45
Refactoring of the `validate()` function by Marco De Donno at 2025-03-20 17:15:15
Add the `get_tenprintcard_back` function, and refactor out the `_get_tenprintcard()` function by Marco De Donno at 2025-03-02 05:23:08
The `_get_tenprintcard()` function process the front and back card since they are exactly the same logic.
Refactoring of the `get_tenprintcard_front` function by Marco De Donno at 2025-03-02 02:54:28
Add test for non-image `get_resolution` function calls by Marco De Donno at 2025-03-02 02:21:23
If it’s not a record type related to an image, it does not make sense to try to get the resolution back.
Set the image resolution in the returned image in the `get_image` function by Marco De Donno at 2025-03-02 02:20:37
Move all exceptions in the `exceptions` file by Marco De Donno at 2025-02-28 17:54:24
Force the check for isort in the cicd validation stage by Marco De Donno at 2025-02-28 17:02:36
Add gitlab cicd retries for the `test` stages by Marco De Donno at 2025-02-26 13:52:11
Add tests for normal and slim docker images by Marco De Donno at 2025-02-26 13:37:53
Only make the `build` step for the main branches and tags by Marco De Donno at 2025-02-26 13:30:41
Update all python images to the `-slim` one by Marco De Donno at 2025-02-26 12:56:31
Force the cicd to check for black formatting by Marco De Donno at 2025-02-26 11:08:46
Add support for bytes loading by Marco De Donno at 2025-02-23 18:47:57
Refactoring of some variables names by Marco De Donno at 2025-02-22 00:34:15
Apply python linter and best practices advises by Marco De Donno at 2025-02-17 23:25:32
Patch the call to the BICUBIC function (PIL.Image.Resampling.BICUBIC) by Marco De Donno at 2025-02-17 20:30:42
Refactoring of the `search_fgp` function by Marco De Donno at 2025-02-14 23:13:34
[fix] Patch the `get_resolution` function by Marco De Donno at 2025-02-12 16:00:55
For types using the `Transmitted x pixel scale` (Records other than 3, 4, 5, 6 and 7), the `IDC` was not passed to the `search_and_get_label` function.
Add the setup.py script by Marco De Donno at 2025-02-08 17:03:20
Add code coverage in the gitlab cicd configuration by Marco De Donno at 2025-02-06 19:59:04
Add support for pypy by Marco De Donno at 2025-02-04 01:21:43
Add support for python 3.10 by Marco De Donno at 2025-02-04 16:49:30
Documentation update by Marco De Donno at 2025-02-04 16:31:46
Add gitlab actions for multiple python version by Marco De Donno at 2025-02-03 14:28:22
This will ensure to test multiple python versions, starting with 3.11 and up.
Add the documentation compilation by Marco De Donno at 2024-03-01 01:56:01
Add the sphinx compilation folder, with basic documentation. The docstrings are automatically extracted from the code as documentation.
Update python to 3.13 by Marco De Donno at 2025-01-31 15:26:55
Update python to 3.12 by Marco De Donno at 2025-01-31 15:26:26
Use python to find automatically the correct `site-packages` folder by Marco De Donno at 2025-01-31 15:25:30
Add the `delete_field` function by Marco De Donno at 2024-04-08 19:34:47
Patch the BICUBIC function call by Marco De Donno at 2024-04-08 14:36:52
Add the `get_tenprintcard_front()` function by Marco De Donno at 2024-03-14 16:56:10
Pretty-print the FGP fields in the `dump()` function by Marco De Donno at 2024-03-14 15:11:39
Remove loop dependency in the `validate()` function, and refactoring by Marco De Donno at 2024-03-14 15:10:56
General refactoring to clarify internal variable names by Marco De Donno at 2024-03-01 18:29:32
No changes in functionality.
General documentation by Marco De Donno at 2024-03-01 16:49:47
Add the gitlab CICD configuration by Marco De Donno at 2024-03-01 00:10:43
Add support to specify the record_type in the `dump` function by Marco De Donno at 2024-02-29 18:20:46
Add the field type in the configuration, add the `get_field_type()` function by Marco De Donno at 2024-02-29 18:17:39
Convert the list of field labels to a dictionnary by Marco De Donno at 2024-02-29 16:23:11
Add the `get_deltas()` function by Marco De Donno at 2024-02-27 14:48:04
Add the `get_image_annotated()` and image function `annotate()` function by Marco De Donno at 2024-02-27 14:32:50
Add the `get_cores()` function by Marco De Donno at 2024-02-25 22:49:48
Store `Annotation` data raw, print rounded to 2 decimals (for numeric data) by Marco De Donno at 2024-02-24 22:24:25
Even if the standards only talk about data with a precision of 2 decimal, it make sense, in the context of this library, to store intermediate values raw. This will limit error of conversion later on.
Add `get_minutiae()` function by Marco De Donno at 2024-02-27 10:02:01
Refactoring options and internal variables by Marco De Donno at 2024-02-27 10:01:19
Add the `get_resolution()` function by Marco De Donno at 2024-02-24 15:11:33
Add the `search_record_for_idc()` function by Marco De Donno at 2024-02-24 15:10:30
Add different types of classes to store various objects by Marco De Donno at 2024-02-22 21:56:37
Added the `Annotation`, `AnnotationList`, `Minutia` and `Core` objects.
Add support for RAW format images in the `get_image()` function by Marco De Donno at 2024-02-21 21:43:23
Generic refactoring by Marco De Donno at 2024-02-21 21:41:24
Add functions to search fields (`label_search` and `search_and_get_label`) by Marco De Donno at 2024-02-21 21:01:59
Rename and refactoring the function to check `record_type` and `idc` into `validate()` function by Marco De Donno at 2024-02-21 18:59:57
This function validates the `record_type` and/or `idc` passed in parameter. This function extends the old `check_idc()` function, and deprecates it.
[Patch] Rename the `decode_gca()` function to `decode_cga()` by Marco De Donno at 2024-02-20 17:12:47
Add the `get_image()` function by Marco De Donno at 2024-02-19 21:24:03
Add support for automatic parsing of images stored in records Type 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 19 and 22.
Refactoring of the `fgp` functions, and add the `search_fgp()` function by Marco De Donno at 2024-02-19 20:40:05
Ensure that the `get_x_list()` functions return ordered elements by Marco De Donno at 2024-02-19 17:10:22
Refactoring of the `check_idc()` function by Marco De Donno at 2024-02-19 17:09:52
Allow multiple calls to the `set_options()` function by Marco De Donno at 2024-02-19 13:04:23
Add the `hash()` function and tests by Marco De Donno at 2024-02-19 00:01:50
Add the `write()` function by Marco De Donno at 2024-02-19 00:00:58
Function to write to a file on disk the content of the NIST object, in the traditional format.
Refactoring of functions in a more Python3-way by Marco De Donno at 2024-02-18 23:21:00
Refactoring of the `clean()` function by Marco De Donno at 2024-02-18 23:19:43
This commits introduce some variables to control how/if the NIST object should be cleaned and if some fields should be recomputed.
Add the `get_binary_record_header_definition()` function and refactoring by Marco De Donno at 2024-02-18 21:03:44
Refactoring of the `set_options()` function by Marco De Donno at 2024-02-18 20:53:55
[patch] Patch the loading of the binary records by Marco De Donno at 2024-02-16 23:09:00
The data for binary records was off by one (one fewer byte loaded as data, but still counted in the offset process).
Add the `ensure_has_record`, `get_field_list` and `ensure_has_idc`, and refactoring by Marco De Donno at 2024-02-15 19:45:13
Generic comments and documentation update by Marco De Donno at 2024-02-15 18:55:21
Add the `set_option()` function by Marco De Donno at 2024-02-15 00:08:04
This function allows to set particular options specific to this library (input/output format, record format, …).
General refactoring and uniformization of functions name by Marco De Donno at 2024-02-14 17:34:46
- printableFieldSeparator -> printable_field_separator - bindump -> format_binary_data - NIST.get_record_type -> NIST.get_records_list - NIST.add_record_type -> NIST.add_record - NIST.get_idc -> NIST.get_idc_list - NIST.checkIDC -> NIST.check_idc - NIST.read -> NIST.read_file
Refactoring of the loading process, adding support for Type-3, Type-5, Type-6, Type-7 and Type-8 records by Marco De Donno at 2024-02-14 15:26:31
This commit was initially done to refactor the load() function in two functions: the records() and fields() generators. By doing so, the support for the new records types (3, 5, 6, 7 and 8) was so trivial that the new functions have been designed to accommodate the processing of those fields.
Minimum port of the legacy library by Marco De Donno at 2024-02-09 18:27:24
This commit only ports the strict minimum of functions to be able to load and parse a NIST file into memory, and print it to screen, only tested for some .an2 files provided by the NIST.
Initial commit by Marco De Donno at 2024-02-02 23:46:07
PKMAT
Documentation update by Marco De Donno at 2026-06-10 19:33:24
Force to have at least 4 minutiae in the PKMAT file by Marco De Donno at 2026-06-04 12:42:53
Add typing by Marco De Donno at 2026-05-28 16:21:38
Add empty requirements.txt file by Marco De Donno at 2026-05-12 18:58:36
Initial commit by Marco De Donno at 2026-01-27 16:16:14
Port of the PKMAT version 2 library, without any major changes nor modifications of behaviour.
TPS
Documentation update by Marco De Donno at 2026-06-10 19:35:17
Raise an exception on error in the `angle_between()` function by Marco De Donno at 2026-06-01 21:26:27
Add the destination points to the distortion grid by Marco De Donno at 2026-06-01 21:25:55
Add the unittest check by Marco De Donno at 2026-05-24 19:22:45
Add the python project configuration file by Marco De Donno at 2026-05-24 19:22:28
Add typing by Marco De Donno at 2026-05-24 19:21:00
Add support for the computed `angle` value by Marco De Donno at 2026-02-19 20:38:22
Initial port of the legacy TPS library by Marco De Donno at 2026-01-16 17:33:20
This is the strict minimum port of the legacy library, without any major change in functionality, nor refactoring.