From 405917d6981a0918d4cf2dfd21df61c0b64dc525 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 27 Oct 2024 17:09:37 +0000 Subject: [PATCH] Update error codes and demo docs [actions skip] --- docs/demo_build_v1_0_spec_examples.md | 29 +++-- docs/demo_build_v1_1_spec_examples.md | 33 ++++-- docs/demo_ocfl_object_script.md | 54 ++++++---- docs/demo_ocfl_script.md | 2 +- docs/demo_ocfl_sidecar_script.md | 16 +-- docs/demo_using_bagit_bags.md | 54 +++++----- docs/validation_status.md | 148 +++++++++++++------------- 7 files changed, 189 insertions(+), 147 deletions(-) diff --git a/docs/demo_build_v1_0_spec_examples.md b/docs/demo_build_v1_0_spec_examples.md index 2ff184c..4a614fd 100644 --- a/docs/demo_build_v1_0_spec_examples.md +++ b/docs/demo_build_v1_0_spec_examples.md @@ -9,7 +9,7 @@ _Output from `tests/test_demo_build_spec_v1_0_examples.py`._ The digest type sha512-spec-ex is sha512 with most of the content stripped out and replaced with an ellipsis. This is inventory should match the example in . ``` -> python ocfl-object.py build --src fixtures/1.0/content/spec-ex-minimal --id http://example.org/minimal --spec-version 1.0 --digest sha512-spec-ex --created 2018-10-02T12:00:00Z --message One file --name Alice --address alice@example.org -v +> python ocfl-object.py create --src fixtures/1.0/content/spec-ex-minimal --id http://example.org/minimal --spec-version 1.0 --digest sha512-spec-ex --created 2018-10-02T12:00:00Z --message One file --name Alice --address alice@example.org -v ### Inventory for v1 { "digestAlgorithm": "sha512-spec-ex", @@ -17,7 +17,7 @@ The digest type sha512-spec-ex is sha512 with most of the content stripped out a "id": "http://example.org/minimal", "manifest": { "7545b8720a60123...f67": [ - "v1/content/file.txt" + "v1/content/v1/file.txt" ] }, "type": "https://ocfl.io/1.0/spec/#inventory", @@ -27,7 +27,7 @@ The digest type sha512-spec-ex is sha512 with most of the content stripped out a "message": "One file", "state": { "7545b8720a60123...f67": [ - "file.txt" + "v1/file.txt" ] }, "user": { @@ -47,7 +47,7 @@ The digest type sha512-spec-ex is sha512 with most of the content stripped out a This is inventory should match the example with 3 versions in . ``` -> python ocfl-object.py build --src fixtures/1.0/content/spec-ex-full --spec-version 1.0 --id ark:/12345/bcd987 --fixity md5 --fixity sha1 --digest sha512-spec-ex --created 2018-01-01T01:01:01Z -v +> python ocfl-object.py build --src fixtures/1.0/content/spec-ex-full --spec-version 1.0 --id ark:/12345/bcd987 --fixity md5 --fixity sha1 --digest sha512-spec-ex --metadata extra_fixtures/1.0/content/spec-ex-full-metadata.json -v ### Inventory for v3 { "digestAlgorithm": "sha512-spec-ex", @@ -101,6 +101,7 @@ This is inventory should match the example with 3 versions in . ``` -> python ocfl-object.py build --src fixtures/1.0/content/spec-ex-diff-paths --id http://example.org/diff-paths --spec-version 1.0 --digest sha512-spec-ex --normalization md5 --created 2019-03-14T20:31:00Z -v +> python ocfl-object.py create --src fixtures/1.0/content/spec-ex-diff-paths/v1 --id http://example.org/diff-paths --spec-version 1.0 --digest sha512-spec-ex --normalization md5 --created 2019-03-14T20:31:00Z -v ### Inventory for v1 { "digestAlgorithm": "sha512-spec-ex", diff --git a/docs/demo_build_v1_1_spec_examples.md b/docs/demo_build_v1_1_spec_examples.md index 10fd00a..a9b38df 100644 --- a/docs/demo_build_v1_1_spec_examples.md +++ b/docs/demo_build_v1_1_spec_examples.md @@ -9,7 +9,7 @@ _Output from `tests/test_demo_build_spec_v1_1_examples.py`._ The digest type sha512-spec-ex is sha512 with most of the content stripped out and replaced with an ellipsis. This is inventory should match the example in . ``` -> python ocfl-object.py build --src fixtures/1.1/content/spec-ex-minimal --id http://example.org/minimal --spec-version 1.1 --digest sha512-spec-ex --created 2018-10-02T12:00:00Z --message One file --name Alice --address alice@example.org -v +> python ocfl-object.py create --src fixtures/1.1/content/spec-ex-minimal --id http://example.org/minimal --spec-version 1.1 --digest sha512-spec-ex --created 2018-10-02T12:00:00Z --message One file --name Alice --address alice@example.org -v ### Inventory for v1 { "digestAlgorithm": "sha512-spec-ex", @@ -17,7 +17,7 @@ The digest type sha512-spec-ex is sha512 with most of the content stripped out a "id": "http://example.org/minimal", "manifest": { "7545b8720a60123...f67": [ - "v1/content/file.txt" + "v1/content/v1/file.txt" ] }, "type": "https://ocfl.io/1.1/spec/#inventory", @@ -27,7 +27,7 @@ The digest type sha512-spec-ex is sha512 with most of the content stripped out a "message": "One file", "state": { "7545b8720a60123...f67": [ - "file.txt" + "v1/file.txt" ] }, "user": { @@ -47,7 +47,7 @@ The digest type sha512-spec-ex is sha512 with most of the content stripped out a This is inventory should match the example with 3 versions in . ``` -> python ocfl-object.py build --src fixtures/1.1/content/spec-ex-full --spec-version 1.1 --id ark:/12345/bcd987 --fixity md5 --fixity sha1 --digest sha512-spec-ex -v +> python ocfl-object.py build --src fixtures/1.1/content/spec-ex-full --spec-version 1.1 --id ark:/12345/bcd987 --fixity md5 --fixity sha1 --digest sha512-spec-ex --metadata extra_fixtures/1.1/content/spec-ex-full-metadata.json -v ### Inventory for v3 { "digestAlgorithm": "sha512-spec-ex", @@ -100,7 +100,8 @@ This is inventory should match the example with 3 versions in . ``` -> python ocfl-object.py build --src fixtures/1.1/content/spec-ex-diff-paths --id http://example.org/diff-paths --spec-version 1.1 --digest sha512-spec-ex --normalization md5 --created 2019-03-14T20:31:00Z -v +> python ocfl-object.py create --src fixtures/1.1/content/spec-ex-diff-paths/v1 --id http://example.org/diff-paths/v1 --spec-version 1.1 --digest sha512-spec-ex --normalization md5 --created 2019-03-14T20:31:00Z -v ### Inventory for v1 { "digestAlgorithm": "sha512-spec-ex", "head": "v1", - "id": "http://example.org/diff-paths", + "id": "http://example.org/diff-paths/v1", "manifest": { "7545b8720a60123...f67": [ "v1/content/3bacb119a98a15c5" diff --git a/docs/demo_ocfl_object_script.md b/docs/demo_ocfl_object_script.md index fe45729..9f07a01 100644 --- a/docs/demo_ocfl_object_script.md +++ b/docs/demo_ocfl_object_script.md @@ -52,7 +52,7 @@ Without an `--objdir` argument the script just writes out the inventory for the Without an `--objdir` argument the script just writes out the inventory for each version in the object that would have been created. ``` -> python ocfl-object.py build --id http://example.org/obj2 --src fixtures/1.0/content/cf3 --created 2024-10-24T18:30:02Z +> python ocfl-object.py build --id http://example.org/obj2 --src fixtures/1.0/content/cf3 --metadata extra_fixtures/1.0/content/spec-ex-full-metadata.json ### Inventory for v3 { "digestAlgorithm": "sha512", @@ -69,27 +69,42 @@ Without an `--objdir` argument the script just writes out the inventory for each "type": "https://ocfl.io/1.1/spec/#inventory", "versions": { "v1": { - "created": "2024-10-24T18:30:02Z", + "created": "2018-01-01T01:01:01Z", + "message": "Initial import", "state": { "43a43fe8a8a082d3b5343dfaf2fd0c8b8e370675b1f376e92e9994612c33ea255b11298269d72f797399ebb94edeefe53df243643676548f584fb8603ca53a0f": [ "a_file.txt" ] + }, + "user": { + "address": "alice@example.com", + "name": "Alice" } }, "v2": { - "created": "2024-10-24T18:30:02Z", + "created": "2018-02-02T02:02:02Z", + "message": "Fix bar.xml, remove image.tiff, add empty2.txt", "state": { "296e72b8fd5f7f0ac1473993600ae34953d5dab646f17e7b182b8648aff830d7bf01b56490777cb3e72b33fcc1ae520506badea1032252d1a55fd7362e269975": [ "a_file.txt" ] + }, + "user": { + "address": "bob@example.com", + "name": "Bob" } }, "v3": { - "created": "2024-10-24T18:30:02Z", + "created": "2018-03-03T03:03:03Z", + "message": "Reinstate image.tiff, delete empty.txt", "state": { "43a43fe8a8a082d3b5343dfaf2fd0c8b8e370675b1f376e92e9994612c33ea255b11298269d72f797399ebb94edeefe53df243643676548f584fb8603ca53a0f": [ "a_file.txt" ] + }, + "user": { + "address": "cecilia@example.com", + "name": "Cecilia" } } } @@ -112,7 +127,7 @@ INFO:root:Created OCFL object http://example.org/obj1 in tmp/obj1 ### 4.1 New object with three versions ``` -> python ocfl-object.py build --id http://example.org/obj2 --src fixtures/1.0/content/cf3 --objdir tmp/obj2 --created 2024-10-24T18:30:04Z,-v +> python ocfl-object.py build --id http://example.org/obj2 --src fixtures/1.0/content/cf3 --objdir tmp/obj2 -v INFO:root:Built object http://example.org/obj2 at tmp/obj2 with 3 versions ``` @@ -133,13 +148,11 @@ and the extracted files are: ``` > find -s tmp/v1 -print -tmp/v1 -tmp/v1/empty.txt -tmp/v1/foo -tmp/v1/foo/bar.xml -tmp/v1/image.tiff +find: unknown predicate `-s' ``` +(last command exited with return code 1) + ### 5.2 Extract v2 of content in an OCFL v1.1 object @@ -153,13 +166,11 @@ and the extracted files are: ``` > find -s tmp/v2 -print -tmp/v2 -tmp/v2/empty.txt -tmp/v2/empty2.txt -tmp/v2/foo -tmp/v2/foo/bar.xml +find: unknown predicate `-s' ``` +(last command exited with return code 1) + ### 5.3 Extract head version (v3) of content in the same OCFL v1.1 object @@ -173,7 +184,7 @@ and the extracted files are: ``` > find -s tmp/v3 -print -find: tmp/v3: No such file or directory +find: unknown predicate `-s' ``` (last command exited with return code 1) @@ -190,10 +201,11 @@ and the extracted file is: ``` > find -s tmp/files -print -tmp/files -tmp/files/bar.xml +find: unknown predicate `-s' ``` +(last command exited with return code 1) + ### 5.5 Extract image.tiff of v3 (default) into the same directory @@ -206,11 +218,11 @@ and the directory now contains two extracted files: ``` > find -s tmp/files -print -tmp/files -tmp/files/bar.xml -tmp/files/image.tiff +find: unknown predicate `-s' ``` +(last command exited with return code 1) + ## 6. Test error conditions. diff --git a/docs/demo_ocfl_script.md b/docs/demo_ocfl_script.md index c0de482..dc763a5 100644 --- a/docs/demo_ocfl_script.md +++ b/docs/demo_ocfl_script.md @@ -59,8 +59,8 @@ ERROR:root:Add object failed because path ark%3A123%2Fabc exists ``` > python ocfl.py list --root=extra_fixtures/good-storage-roots/simple-root -http%3A%2F%2Fexample.org%2Fminimal_mixed_digests -- id=http://example.org/minimal_mixed_digests ark%3A123%2Fabc -- id=ark:123/abc +http%3A%2F%2Fexample.org%2Fminimal_mixed_digests -- id=http://example.org/minimal_mixed_digests ark%3A%2F12345%2Fbcd987 -- id=ark:/12345/bcd987 Found 3 OCFL Objects under root extra_fixtures/good-storage-roots/simple-root ``` diff --git a/docs/demo_ocfl_sidecar_script.md b/docs/demo_ocfl_sidecar_script.md index 38e1a89..839a713 100644 --- a/docs/demo_ocfl_sidecar_script.md +++ b/docs/demo_ocfl_sidecar_script.md @@ -20,7 +20,7 @@ ocfl-sidecar.py is part of ocfl-py version 1.9.0 ``` > mkdir -v tmp/obj -tmp/obj +mkdir: created directory 'tmp/obj' ``` @@ -28,7 +28,7 @@ tmp/obj ``` > cp -v fixtures/1.0/good-objects/minimal_one_version_one_file/inventory.json tmp/obj -fixtures/1.0/good-objects/minimal_one_version_one_file/inventory.json -> tmp/obj/inventory.json +'fixtures/1.0/good-objects/minimal_one_version_one_file/inventory.json' -> 'tmp/obj/inventory.json' ``` @@ -68,7 +68,7 @@ Written sidecar file tmp/obj/inventory.json.sha256 ``` > mkdir -v tmp/obj1 -tmp/obj1 +mkdir: created directory 'tmp/obj1' ``` @@ -76,7 +76,7 @@ tmp/obj1 ``` > mkdir -v tmp/obj2 -tmp/obj2 +mkdir: created directory 'tmp/obj2' ``` @@ -84,7 +84,7 @@ tmp/obj2 ``` > mkdir -v tmp/obj3 -tmp/obj3 +mkdir: created directory 'tmp/obj3' ``` @@ -92,7 +92,7 @@ tmp/obj3 ``` > cp -v fixtures/1.1/good-objects/minimal_uppercase_digests/inventory.json tmp/obj1 -fixtures/1.1/good-objects/minimal_uppercase_digests/inventory.json -> tmp/obj1/inventory.json +'fixtures/1.1/good-objects/minimal_uppercase_digests/inventory.json' -> 'tmp/obj1/inventory.json' ``` @@ -100,7 +100,7 @@ fixtures/1.1/good-objects/minimal_uppercase_digests/inventory.json -> tmp/obj1/i ``` > cp -v fixtures/1.1/good-objects/minimal_mixed_digests/inventory.json tmp/obj2 -fixtures/1.1/good-objects/minimal_mixed_digests/inventory.json -> tmp/obj2/inventory.json +'fixtures/1.1/good-objects/minimal_mixed_digests/inventory.json' -> 'tmp/obj2/inventory.json' ``` @@ -108,7 +108,7 @@ fixtures/1.1/good-objects/minimal_mixed_digests/inventory.json -> tmp/obj2/inven ``` > cp -v fixtures/1.1/good-objects/minimal_no_content/inventory.json tmp/obj3 -fixtures/1.1/good-objects/minimal_no_content/inventory.json -> tmp/obj3/inventory.json +'fixtures/1.1/good-objects/minimal_no_content/inventory.json' -> 'tmp/obj3/inventory.json' ``` diff --git a/docs/demo_using_bagit_bags.md b/docs/demo_using_bagit_bags.md index 66abc82..6b63ac7 100644 --- a/docs/demo_using_bagit_bags.md +++ b/docs/demo_using_bagit_bags.md @@ -10,11 +10,11 @@ Imagine that we have a Bagit bag [`tests/testdata/bags/uaa_v1`](https://github.c ``` > python ocfl-object.py create --objdir tmp/obj --srcbag tests/testdata/bags/uaa_v1 -v -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v1/data/my_content/dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v1/data/my_content/poe.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v1/bagit.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v1/bag-info.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v1/manifest-sha512.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v1/data/my_content/dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v1/data/my_content/poe.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v1/bagit.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v1/bag-info.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v1/manifest-sha512.txt INFO:root:Created OCFL object info:bb123cd4567 in tmp/obj ``` @@ -55,13 +55,13 @@ If we have a bag [`tests/testdata/bags/uaa_v2`](https://github.com/zimeon/ocfl-p ``` > python ocfl-object.py update --objdir tmp/obj --srcbag tests/testdata/bags/uaa_v2 -v -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/a_second_copy_of_dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/poe-nevermore.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/another_directory/a_third_copy_of_dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v2/bagit.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v2/bag-info.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v2/manifest-sha512.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/a_second_copy_of_dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/poe-nevermore.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v2/data/my_content/another_directory/a_third_copy_of_dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v2/bagit.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v2/bag-info.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v2/manifest-sha512.txt INFO:root:Will update info:bb123cd4567 v1 -> v2 INFO:root:Updated OCFL object info:bb123cd4567 in tmp/obj by adding v2 ``` @@ -96,12 +96,12 @@ Similarly we can `--update` with [`tests/testdata/bags/uaa_v3`](https://github.c ``` > python ocfl-object.py update --objdir tmp/obj --srcbag tests/testdata/bags/uaa_v3 -v -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v3/data/my_content/dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v3/data/my_content/poe-nevermore.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v3/data/my_content/another_directory/a_third_copy_of_dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v3/bagit.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v3/bag-info.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v3/manifest-sha512.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v3/data/my_content/dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v3/data/my_content/poe-nevermore.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v3/data/my_content/another_directory/a_third_copy_of_dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v3/bagit.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v3/bag-info.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v3/manifest-sha512.txt INFO:root:Will update info:bb123cd4567 v2 -> v3 INFO:root:Updated OCFL object info:bb123cd4567 in tmp/obj by adding v3 ``` @@ -140,13 +140,13 @@ Finally, we can `--update` again with [`tests/testdata/bags/uaa_v4`](https://git ``` > python ocfl-object.py update --objdir tmp/obj --srcbag tests/testdata/bags/uaa_v4 -v -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/dunwich.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/poe-nevermore.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/another_directory/a_third_copy_of_dracula.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v4/bagit.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v4/bag-info.txt -INFO:bagit:Verifying checksum for file /Users/sw272/src/ocfl-py/tests/testdata/bags/uaa_v4/manifest-sha512.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/dunwich.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/poe-nevermore.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v4/data/my_content/another_directory/a_third_copy_of_dracula.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v4/bagit.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v4/bag-info.txt +INFO:bagit:Verifying checksum for file /home/runner/work/ocfl-py/ocfl-py/tests/testdata/bags/uaa_v4/manifest-sha512.txt INFO:root:Will update info:bb123cd4567 v3 -> v4 INFO:root:Updated OCFL object info:bb123cd4567 in tmp/obj by adding v4 ``` @@ -161,8 +161,8 @@ Taking the newly created OCFL object `/tmp/obj` we can `--extract` the `v4` cont INFO:root:Extracted v4 into tmp/extracted_v4 INFO:bagit:Creating bag for directory tmp/extracted_v4 INFO:bagit:Creating data directory -INFO:bagit:Moving my_content to /privatetmp/extracted_v4/tmpzw7geuho/my_content -INFO:bagit:Moving /privatetmp/extracted_v4/tmpzw7geuho to data +INFO:bagit:Moving my_content to tmp/extracted_v4/tmpyn3c5dyc/my_content +INFO:bagit:Moving tmp/extracted_v4/tmpyn3c5dyc to data INFO:bagit:Using 1 processes to generate manifests: sha512 INFO:bagit:Generating manifest lines for file data/my_content/dracula.txt INFO:bagit:Generating manifest lines for file data/my_content/dunwich.txt diff --git a/docs/validation_status.md b/docs/validation_status.md index 85b53e2..84daa11 100644 --- a/docs/validation_status.md +++ b/docs/validation_status.md @@ -23,17 +23,17 @@ The following tables show the implementation status of all errors and warnings i | [E005](https://ocfl.io/1.1/spec#E005) | 'The [version declaration] filename must conform to the pattern T=dvalue, where T MUST be 0, and dvalue must be ocfl_object_, followed by the OCFL specification version number.' | _Not implemented_ | | [E006](https://ocfl.io/1.1/spec#E006) | 'The [version declaration] filename must conform to the pattern T=dvalue, where T must be 0, and dvalue MUST be ocfl_object_, followed by the OCFL specification version number.' | The OCFL object conformance declaration filename must be 0=ocfl_object_, followed by the OCFL specification version number, got %s instead \[[ocfl/validator.py#L138](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L138)\] | | [E007](https://ocfl.io/1.1/spec#E007) | 'The text contents of the [version declaration] file must be the same as dvalue, followed by a newline (\n).' | OCFL Object declaration file %s contents do not match file name without leading 0= (the 'dvalue') \[[ocfl/validator.py#L142](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L142)\] | -| [E008](https://ocfl.io/1.1/spec#E008) | 'OCFL Object content must be stored as a sequence of one or more versions.' | OCFL Object %s inventory versions block does not contain any versions, there must be at least version 1 \[[ocfl/inventory_validator.py#L267](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L267)\] | -| [E009](https://ocfl.io/1.1/spec#E009) | 'The version number sequence MUST start at 1 and must be continuous without missing integers.' | OCFL Object %s inventory versions block does not contain v1 or a zero padded equivalent \[[ocfl/inventory_validator.py#L287](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L287)\] | -| [E010](https://ocfl.io/1.1/spec#E010) | 'The version number sequence must start at 1 and MUST be continuous without missing integers.' | OCFL Object %s inventory versions block includes an out-of-sequence version \[[ocfl/inventory_validator.py#L298](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L298)\] | -| [E011](https://ocfl.io/1.1/spec#E011) | 'If zero-padded version directory numbers are used then they must start with the prefix v and then a zero.' | **Missing description** \[[ocfl/inventory_validator.py#L305](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L305)\] | +| [E008](https://ocfl.io/1.1/spec#E008) | 'OCFL Object content must be stored as a sequence of one or more versions.' | OCFL Object %s inventory versions block does not contain any versions, there must be at least version 1 \[[ocfl/inventory_validator.py#L281](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L281)\] | +| [E009](https://ocfl.io/1.1/spec#E009) | 'The version number sequence MUST start at 1 and must be continuous without missing integers.' | OCFL Object %s inventory versions block does not contain v1 or a zero padded equivalent \[[ocfl/inventory_validator.py#L301](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L301)\] | +| [E010](https://ocfl.io/1.1/spec#E010) | 'The version number sequence must start at 1 and MUST be continuous without missing integers.' | OCFL Object %s inventory versions block includes an out-of-sequence version \[[ocfl/inventory_validator.py#L312](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L312)\] | +| [E011](https://ocfl.io/1.1/spec#E011) | 'If zero-padded version directory numbers are used then they must start with the prefix v and then a zero.' | **Missing description** \[[ocfl/inventory_validator.py#L319](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L319)\] | | [E012](https://ocfl.io/1.1/spec#E012) | 'All version directories of an object must use the same naming convention: either a non-padded version directory number, or a zero-padded version directory number of consistent length.' | _Not implemented_ | | [E013](https://ocfl.io/1.1/spec#E013) | 'Operations that add a new version to an object must follow the version directory naming convention established by earlier versions.' | _Not implemented_ | | [E014](https://ocfl.io/1.1/spec#E014) | 'In all cases, references to files inside version directories from inventory files must use the actual version directory names.' | _Not implemented_ | | [E015](https://ocfl.io/1.1/spec#E015) | 'There must be no other files as children of a version directory, other than an inventory file and a inventory digest.' | OCFL Object version directory %s includes an illegal file (%s) \[[ocfl/validator.py#L421](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L421)\] | | [E016](https://ocfl.io/1.1/spec#E016) | 'Version directories must contain a designated content sub-directory if the version contains files to be preserved, and should not contain this sub-directory otherwise.' | _Not implemented_ | -| [E017](https://ocfl.io/1.1/spec#E017) | 'The contentDirectory value MUST NOT contain the forward slash (/) path separator and must not be either one or two periods (. or ..).' | OCFL Object %s inventory contentDirectory must be a string and must not contain a forward slash (/) \[[ocfl/inventory_validator.py#L126](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L126)\] | -| [E018](https://ocfl.io/1.1/spec#E018) | 'The contentDirectory value must not contain the forward slash (/) path separator and MUST NOT be either one or two periods (. or ..).' | OCFL Object %s inventory contentDirectory must not be either . or .. \[[ocfl/inventory_validator.py#L128](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L128)\] | +| [E017](https://ocfl.io/1.1/spec#E017) | 'The contentDirectory value MUST NOT contain the forward slash (/) path separator and must not be either one or two periods (. or ..).' | OCFL Object %s inventory contentDirectory must be a string and must not contain a forward slash (/) \[[ocfl/inventory_validator.py#L140](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L140)\] | +| [E018](https://ocfl.io/1.1/spec#E018) | 'The contentDirectory value must not contain the forward slash (/) path separator and MUST NOT be either one or two periods (. or ..).' | OCFL Object %s inventory contentDirectory must not be either . or .. \[[ocfl/inventory_validator.py#L142](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L142)\] | | [E019](https://ocfl.io/1.1/spec#E019) | 'If the key contentDirectory is set, it MUST be set in the first version of the object and must not change between versions of the same object.' | OCFL Object %s inventory sets contentDirectory whereas it was not set in the first version inventory \[[ocfl/validator.py#L332](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L332) [ocfl/validator.py#L340](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L340)\] | | [E020](https://ocfl.io/1.1/spec#E020) | 'If the key contentDirectory is set, it must be set in the first version of the object and MUST NOT change between versions of the same object.' | OCFL Object %s inventory contentDirectory %s does not match root contentDirectory %s \[[ocfl/validator.py#L343](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L343)\] | | [E021](https://ocfl.io/1.1/spec#E021) | 'If the key contentDirectory is not present in the inventory file then the name of the designated content sub-directory must be content.' | _Not implemented_ | @@ -43,77 +43,77 @@ The following tables show the implementation status of all errors and warnings i | | E023b | OCFL Object %s manifest does not include files listed in previous version manifests (%s) \[[ocfl/validator.py#L353](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L353)\] | | [E024](https://ocfl.io/1.1/spec#E024) | 'There must not be empty directories within a version\'s content directory.' | OCFL Object version %s content directory includes empty path %s \[[ocfl/validator.py#L412](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L412)\] | | [E025](https://ocfl.io/1.1/spec#E025) | 'For content-addressing, OCFL Objects must use either sha512 or sha256, and should use sha512.' | _See multiple cases identified with suffixes below_ | -| | E025a | OCFL Object %s inventory `digestAlgorithm` attribute not an allowed digest type (got '%s') \[[ocfl/inventory_validator.py#L120](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L120)\] | -| | E025b | OCFL Object %s inventory manifest block includes a digest (%s) that doesn't have the correct form for the %s algorithm \[[ocfl/inventory_validator.py#L186](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L186)\] | +| | E025a | OCFL Object %s inventory `digestAlgorithm` attribute not an allowed digest type (got '%s') \[[ocfl/inventory_validator.py#L134](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L134)\] | +| | E025b | OCFL Object %s inventory manifest block includes a digest (%s) that doesn't have the correct form for the %s algorithm \[[ocfl/inventory_validator.py#L200](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L200)\] | | [E026](https://ocfl.io/1.1/spec#E026) | 'For storage of additional fixity values, or to support legacy content migration, implementers must choose from the following controlled vocabulary of digest algorithms, or from a list of additional algorithms given in the [Digest-Algorithms-Extension].' | _See multiple cases identified with suffixes below_ | -| | E026a | OCFL Object %s inventory uses unknown digest type %s \[[ocfl/inventory_validator.py#L428](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L428)\] | +| | E026a | OCFL Object %s inventory uses unknown digest type %s \[[ocfl/inventory_validator.py#L442](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L442)\] | | [E027](https://ocfl.io/1.1/spec#E027) | 'OCFL clients must support all fixity algorithms given in the table below, and may support additional algorithms from the extensions.' | _Not implemented_ | | [E028](https://ocfl.io/1.1/spec#E028) | 'Optional fixity algorithms that are not supported by a client must be ignored by that client.' | _Not implemented_ | | [E029](https://ocfl.io/1.1/spec#E029) | 'SHA-1 algorithm defined by [FIPS-180-4] and must be encoded using hex (base16) encoding [RFC4648].' | _Not implemented_ | | [E030](https://ocfl.io/1.1/spec#E030) | 'SHA-256 algorithm defined by [FIPS-180-4] and must be encoded using hex (base16) encoding [RFC4648].' | _Not implemented_ | | [E031](https://ocfl.io/1.1/spec#E031) | 'SHA-512 algorithm defined by [FIPS-180-4] and must be encoded using hex (base16) encoding [RFC4648].' | _Not implemented_ | | [E032](https://ocfl.io/1.1/spec#E032) | '[blake2b-512] must be encoded using hex (base16) encoding [RFC4648].' | _Not implemented_ | -| [E033](https://ocfl.io/1.1/spec#E033) | 'An OCFL Object Inventory MUST follow the [JSON] structure described in this section and must be named inventory.json.' | OCFL Object %s inventory is not valid JSON (%s) \[[ocfl/object.py#L622](https://github.com/zimeon/ocfl-py/blob/main/ocfl/object.py#L622) [ocfl/validator.py#L196](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L196)\] | +| [E033](https://ocfl.io/1.1/spec#E033) | 'An OCFL Object Inventory MUST follow the [JSON] structure described in this section and must be named inventory.json.' | OCFL Object %s inventory is not valid JSON (%s) \[[ocfl/object.py#L636](https://github.com/zimeon/ocfl-py/blob/main/ocfl/object.py#L636) [ocfl/validator.py#L196](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L196)\] | | [E034](https://ocfl.io/1.1/spec#E034) | 'An OCFL Object Inventory must follow the [JSON] structure described in this section and MUST be named inventory.json.' | _Not implemented_ | | [E035](https://ocfl.io/1.1/spec#E035) | 'The forward slash (/) path separator must be used in content paths in the manifest and fixity blocks within the inventory.' | _Not implemented_ | | [E036](https://ocfl.io/1.1/spec#E036) | 'An OCFL Object Inventory must include the following keys: [id, type, digestAlgorithm, head]' | _See multiple cases identified with suffixes below_ | -| | E036a | OCFL Object %s inventory missing `id` attribute \[[ocfl/inventory_validator.py#L92](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L92)\] | -| | E036b | OCFL Object %s inventory missing `type` attribute \[[ocfl/inventory_validator.py#L94](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L94)\] | -| | E036c | OCFL Object %s inventory missing `digestAlgorithm` attribute \[[ocfl/inventory_validator.py#L111](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L111)\] | -| | E036d | OCFL Object %s inventory missing `head` attribute \[[ocfl/inventory_validator.py#L144](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L144)\] | +| | E036a | OCFL Object %s inventory missing `id` attribute \[[ocfl/inventory_validator.py#L106](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L106)\] | +| | E036b | OCFL Object %s inventory missing `type` attribute \[[ocfl/inventory_validator.py#L108](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L108)\] | +| | E036c | OCFL Object %s inventory missing `digestAlgorithm` attribute \[[ocfl/inventory_validator.py#L125](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L125)\] | +| | E036d | OCFL Object %s inventory missing `head` attribute \[[ocfl/inventory_validator.py#L158](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L158)\] | | [E037](https://ocfl.io/1.1/spec#E037) | '[id] must be unique in the local context, and should be a URI [RFC3986].' | _See multiple cases identified with suffixes below_ | -| | E037a | OCFL Object %s inventory `id` attribute is empty or badly formed \[[ocfl/inventory_validator.py#L84](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L84)\] | +| | E037a | OCFL Object %s inventory `id` attribute is empty or badly formed \[[ocfl/inventory_validator.py#L98](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L98)\] | | | E037b | OCFL Object %s inventory id `%s` does not match the value in the root inventory `%s` \[[ocfl/validator.py#L328](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L328)\] | | [E038](https://ocfl.io/1.1/spec#E038) | 'In the object root inventory [the type value] must be the URI of the inventory section of the specification version matching the object conformance declaration.' | _See multiple cases identified with suffixes below_ | -| | E038a | OCFL Object %s inventory `type` attribute has wrong value (expected %s, got %s) \[[ocfl/inventory_validator.py#L99](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L99)\] | -| | E038b | OCFL Object %s inventory `type` attribute does not look like a valid specification URI (got %s), will proceed as if using version %s \[[ocfl/inventory_validator.py#L104](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L104)\] | -| | E038c | OCFL Object %s inventory `type` attribute has an unsupported specification version number (%s), will proceed as if using version %s \[[ocfl/inventory_validator.py#L109](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L109)\] | +| | E038a | OCFL Object %s inventory `type` attribute has wrong value (expected %s, got %s) \[[ocfl/inventory_validator.py#L113](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L113)\] | +| | E038b | OCFL Object %s inventory `type` attribute does not look like a valid specification URI (got %s), will proceed as if using version %s \[[ocfl/inventory_validator.py#L118](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L118)\] | +| | E038c | OCFL Object %s inventory `type` attribute has an unsupported specification version number (%s), will proceed as if using version %s \[[ocfl/inventory_validator.py#L123](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L123)\] | | [E039](https://ocfl.io/1.1/spec#E039) | '[digestAlgorithm] must be the algorithm used in the manifest and state blocks.' | _Not implemented_ | -| [E040](https://ocfl.io/1.1/spec#E040) | [head] must be the version directory name with the highest version number.' | OCFL Object %s inventory head attribute doesn't match versions (got %s, expected %s) \[[ocfl/inventory_validator.py#L148](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L148)\] | +| [E040](https://ocfl.io/1.1/spec#E040) | [head] must be the version directory name with the highest version number.' | OCFL Object %s inventory head attribute doesn't match versions (got %s, expected %s) \[[ocfl/inventory_validator.py#L162](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L162)\] | | [E041](https://ocfl.io/1.1/spec#E041) | 'In addition to these keys, there must be two other blocks present, manifest and versions, which are discussed in the next two sections.' | _See multiple cases identified with suffixes below_ | -| | E041a | OCFL Object %s inventory missing `manifest` attribute \[[ocfl/inventory_validator.py#L134](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L134)\] | -| | E041b | OCFL Object %s inventory missing `versions` attribute \[[ocfl/inventory_validator.py#L139](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L139)\] | -| | E041c | OCFL Object %s inventory manifest block is not a JSON object \[[ocfl/inventory_validator.py#L179](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L179)\] | +| | E041a | OCFL Object %s inventory missing `manifest` attribute \[[ocfl/inventory_validator.py#L148](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L148)\] | +| | E041b | OCFL Object %s inventory missing `versions` attribute \[[ocfl/inventory_validator.py#L153](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L153)\] | +| | E041c | OCFL Object %s inventory manifest block is not a JSON object \[[ocfl/inventory_validator.py#L193](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L193)\] | | [E042](https://ocfl.io/1.1/spec#E042) | 'Content paths within a manifest block must be relative to the OCFL Object Root.' | _See multiple cases identified with suffixes below_ | -| | E042a | OCFL Object %s inventory manifest includes invalid content path %s \[[ocfl/inventory_validator.py#L463](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L463)\] | -| | E042b | OCFL Object %s inventory manifest includes content path %s with invalid version directory \[[ocfl/inventory_validator.py#L409](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L409)\] | -| | E042c | OCFL Object %s inventory manifest includes invalid content path %s that doesn't match the content directory name %s \[[ocfl/inventory_validator.py#L466](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L466)\] | +| | E042a | OCFL Object %s inventory manifest includes invalid content path %s \[[ocfl/inventory_validator.py#L477](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L477)\] | +| | E042b | OCFL Object %s inventory manifest includes content path %s with invalid version directory \[[ocfl/inventory_validator.py#L423](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L423)\] | +| | E042c | OCFL Object %s inventory manifest includes invalid content path %s that doesn't match the content directory name %s \[[ocfl/inventory_validator.py#L480](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L480)\] | | [E043](https://ocfl.io/1.1/spec#E043) | 'An OCFL Object Inventory must include a block for storing versions.' | _Not implemented_ | -| [E044](https://ocfl.io/1.1/spec#E044) | 'This block MUST have the key of versions within the inventory, and it must be a JSON object.' | OCFL Object %s inventory versions block is not a JSON object \[[ocfl/inventory_validator.py#L264](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L264)\] | +| [E044](https://ocfl.io/1.1/spec#E044) | 'This block MUST have the key of versions within the inventory, and it must be a JSON object.' | OCFL Object %s inventory versions block is not a JSON object \[[ocfl/inventory_validator.py#L278](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L278)\] | | [E045](https://ocfl.io/1.1/spec#E045) | 'This block must have the key of versions within the inventory, and it MUST be a JSON object.' | _Not implemented_ | | [E046](https://ocfl.io/1.1/spec#E046) | 'The keys of [the versions object] must correspond to the names of the version directories used.' | _See multiple cases identified with suffixes below_ | | | E046a | OCFL Object root inventory describes version %s but no corresponding version directory is present \[[ocfl/validator.py#L423](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L423)\] | | | E046b | OCFL Object includes directory %s that looks like a version directory but isn't a valid version in the inventory \[[ocfl/validator.py#L258](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L258)\] | | [E047](https://ocfl.io/1.1/spec#E047) | 'Each value [of the versions object] must be another JSON object that characterizes the version, as described in the 3.5.3.1 Version section.' | _Not implemented_ | -| [E048](https://ocfl.io/1.1/spec#E048) | 'A JSON object to describe one OCFL Version, which must include the following keys: [created, state]' | OCFL Object %s inventory %s version block does not include a created date or it is malformed \[[ocfl/inventory_validator.py#L325](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L325)\] | -| | E048c | OCFL Object %s inventory %s version block does not include a state block \[[ocfl/inventory_validator.py#L341](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L341)\] | +| [E048](https://ocfl.io/1.1/spec#E048) | 'A JSON object to describe one OCFL Version, which must include the following keys: [created, state]' | OCFL Object %s inventory %s version block does not include a created date or it is malformed \[[ocfl/inventory_validator.py#L339](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L339)\] | +| | E048c | OCFL Object %s inventory %s version block does not include a state block \[[ocfl/inventory_validator.py#L355](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L355)\] | | [E049](https://ocfl.io/1.1/spec#E049) | '[the value of the "created" key] must be expressed in the Internet Date/Time Format defined by [RFC3339].' | _See multiple cases identified with suffixes below_ | -| | E049a | OCFL Object %s inventory %s version block created date SHOULD include a timezone designator \[[ocfl/inventory_validator.py#L333](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L333)\] | -| | E049b | OCFL Object %s inventory %s version block created date SHOULD be granular to the seconds level \[[ocfl/inventory_validator.py#L335](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L335)\] | -| | E049c | OCFL Object %s inventory %s version block has bad created date, must be IS8601 (%s) \[[ocfl/inventory_validator.py#L337](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L337)\] | -| | E049d | OCFL Object %s inventory %s version block created value is not a JSON string \[[ocfl/inventory_validator.py#L327](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L327)\] | +| | E049a | OCFL Object %s inventory %s version block created date SHOULD include a timezone designator \[[ocfl/inventory_validator.py#L347](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L347)\] | +| | E049b | OCFL Object %s inventory %s version block created date SHOULD be granular to the seconds level \[[ocfl/inventory_validator.py#L349](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L349)\] | +| | E049c | OCFL Object %s inventory %s version block has bad created date, must be IS8601 (%s) \[[ocfl/inventory_validator.py#L351](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L351)\] | +| | E049d | OCFL Object %s inventory %s version block created value is not a JSON string \[[ocfl/inventory_validator.py#L341](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L341)\] | | [E050](https://ocfl.io/1.1/spec#E050) | 'The keys of [the "state" JSON object] are digest values, each of which must correspond to an entry in the manifest of the inventory.' | _See multiple cases identified with suffixes below_ | -| | E050a | OCFL Object %s inventory state refers to one or more digests that are not in the manifest (%s) \[[ocfl/inventory_validator.py#L417](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L417)\] | -| | E050c | OCFL Object %s inventory %s version block state block is not a JSON object \[[ocfl/inventory_validator.py#L374](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L374)\] | -| | E050d | OCFL Object %s inventory %s version state block includes a bad digest (%s) \[[ocfl/inventory_validator.py#L379](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L379)\] | -| | E050e | OCFL Object %s inventory %s version block state block value for digest %s is not list \[[ocfl/inventory_validator.py#L381](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L381)\] | -| | E050f | OCFL Object %s inventory version %s state includes digest value %s that is not listed in the manifest block \[[ocfl/inventory_validator.py#L390](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L390)\] | +| | E050a | OCFL Object %s inventory state refers to one or more digests that are not in the manifest (%s) \[[ocfl/inventory_validator.py#L431](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L431)\] | +| | E050c | OCFL Object %s inventory %s version block state block is not a JSON object \[[ocfl/inventory_validator.py#L388](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L388)\] | +| | E050d | OCFL Object %s inventory %s version state block includes a bad digest (%s) \[[ocfl/inventory_validator.py#L393](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L393)\] | +| | E050e | OCFL Object %s inventory %s version block state block value for digest %s is not list \[[ocfl/inventory_validator.py#L395](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L395)\] | +| | E050f | OCFL Object %s inventory version %s state includes digest value %s that is not listed in the manifest block \[[ocfl/inventory_validator.py#L404](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L404)\] | | [E051](https://ocfl.io/1.1/spec#E051) | 'The logical path [value of a "state" digest key] must be interpreted as a set of one or more path elements joined by a / path separator.' | NOTE - E051 is essentially a processing instruction and can't be tested for. \[_Not implemented_\] | -| [E052](https://ocfl.io/1.1/spec#E052) | '[logical] Path elements must not be ., .., or empty (//).' | OCFL Object %s inventory %s version block state block includes an invalid path %s that starts or ends with / \[[ocfl/inventory_validator.py#L445](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L445)\] | -| [E053](https://ocfl.io/1.1/spec#E053) | 'Additionally, a logical path must not begin or end with a forward slash (/).' | OCFL Object %s inventory %s version block state block includes an invalid path %s that includes . .. or // \[[ocfl/inventory_validator.py#L440](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L440)\] | +| [E052](https://ocfl.io/1.1/spec#E052) | '[logical] Path elements must not be ., .., or empty (//).' | OCFL Object %s inventory %s version block state block includes an invalid path %s that starts or ends with / \[[ocfl/inventory_validator.py#L459](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L459)\] | +| [E053](https://ocfl.io/1.1/spec#E053) | 'Additionally, a logical path must not begin or end with a forward slash (/).' | OCFL Object %s inventory %s version block state block includes an invalid path %s that includes . .. or // \[[ocfl/inventory_validator.py#L454](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L454)\] | | [E054](https://ocfl.io/1.1/spec#E054) | 'The value of the user key must contain a user name key, "name" and should contain an address key, "address".' | _See multiple cases identified with suffixes below_ | -| | E054a | OCFL Object %s inventory %s version block has user key with value that isn't a JSON object \[[ocfl/inventory_validator.py#L351](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L351)\] | -| | E054b | OCFL Object %s inventory %s version block has user/name key with value that isn't a string \[[ocfl/inventory_validator.py#L354](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L354)\] | -| | E054c | OCFL Object %s inventory %s version block has user/address key with value that isn't a string \[[ocfl/inventory_validator.py#L358](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L358)\] | +| | E054a | OCFL Object %s inventory %s version block has user key with value that isn't a JSON object \[[ocfl/inventory_validator.py#L365](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L365)\] | +| | E054b | OCFL Object %s inventory %s version block has user/name key with value that isn't a string \[[ocfl/inventory_validator.py#L368](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L368)\] | +| | E054c | OCFL Object %s inventory %s version block has user/address key with value that isn't a string \[[ocfl/inventory_validator.py#L372](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L372)\] | | [E055](https://ocfl.io/1.1/spec#E055) | 'If present, [the fixity] block must have the key of fixity within the inventory.' | _Not implemented_ | | [E056](https://ocfl.io/1.1/spec#E056) | 'The fixity block must contain keys corresponding to the controlled vocabulary given in the digest algorithms listed in the Digests section, or in a table given in an Extension.' | _See multiple cases identified with suffixes below_ | -| | E056a | OCFL Object %s inventory includes a fixity key with value that isn't a JSON object \[[ocfl/inventory_validator.py#L217](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L217)\] | -| | E056b | OCFL Object %s inventory fixity block includes a key that is not a known digest algorithm name: %s \[[ocfl/inventory_validator.py#L225](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L225)\] | +| | E056a | OCFL Object %s inventory includes a fixity key with value that isn't a JSON object \[[ocfl/inventory_validator.py#L231](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L231)\] | +| | E056b | OCFL Object %s inventory fixity block includes a key that is not a known digest algorithm name: %s \[[ocfl/inventory_validator.py#L239](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L239)\] | | [E057](https://ocfl.io/1.1/spec#E057) | 'The value of the fixity block for a particular digest algorithm must follow the structure of the manifest block; that is, a key corresponding to the digest value, and an array of content paths that match that digest.' | _See multiple cases identified with suffixes below_ | -| | E057a | OCFL Object %s inventory fixity block entry for digest algorithm name %s is not a JSON object \[[ocfl/inventory_validator.py#L232](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L232)\] | -| | E057b | OCFL Object %s inventory fixity block entry for digest algorithm %s includes digest %s which has the wrong form \[[ocfl/inventory_validator.py#L238](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L238)\] | -| | E057c | OCFL Object %s inventory fixity block entry for digest algorithm %s, digest %s is not a JSON list \[[ocfl/inventory_validator.py#L240](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L240)\] | -| | E057d | OCFL Object %s inventory fixity block entry for digest algorithm %s, digest %s includes a content path %s that is not in the manifest \[[ocfl/inventory_validator.py#L253](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L253)\] | +| | E057a | OCFL Object %s inventory fixity block entry for digest algorithm name %s is not a JSON object \[[ocfl/inventory_validator.py#L246](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L246)\] | +| | E057b | OCFL Object %s inventory fixity block entry for digest algorithm %s includes digest %s which has the wrong form \[[ocfl/inventory_validator.py#L252](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L252)\] | +| | E057c | OCFL Object %s inventory fixity block entry for digest algorithm %s, digest %s is not a JSON list \[[ocfl/inventory_validator.py#L254](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L254)\] | +| | E057d | OCFL Object %s inventory fixity block entry for digest algorithm %s, digest %s includes a content path %s that is not in the manifest \[[ocfl/inventory_validator.py#L267](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L267)\] | | [E058](https://ocfl.io/1.1/spec#E058) | 'Every occurrence of an inventory file must have an accompanying sidecar file stating its digest.' | _See multiple cases identified with suffixes below_ | | | E058a | OCFL Object %s inventory is missing sidecar digest file at %s \[[ocfl/validator.py#L208](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L208)\] | | | E058b | Cannot extract digest type from inventory digest file name %s \[[ocfl/validator.py#L231](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L231)\] | @@ -124,11 +124,11 @@ The following tables show the implementation status of all errors and warnings i | [E063](https://ocfl.io/1.1/spec#E063) | 'Every OCFL Object must have an inventory file within the OCFL Object Root, corresponding to the state of the OCFL Object at the current version.' | OCFL Object root inventory is missing \[[ocfl/validator.py#L153](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L153)\] | | [E064](https://ocfl.io/1.1/spec#E064) | 'Where an OCFL Object contains inventory.json in version directories, the inventory file in the OCFL Object Root must be the same as the file in the most recent version.' | Object root inventory and copy in last version MUST be identical but are not (%s and %s) \[[ocfl/validator.py#L310](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L310)\] | | [E066](https://ocfl.io/1.1/spec#E066) | 'Each version block in each prior inventory file must represent the same object state as the corresponding version block in the current inventory file.' | _See multiple cases identified with suffixes below_ | -| | E066a | OCFL Object inventory for %s doesn't have a subset of version blocks of inventory for %s \[[ocfl/inventory_validator.py#L490](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L490)\] | -| | E066b | OCFL Object %s inventory %s version state doesn't have same logical paths as same version in %s inventory (paths %s only in %s inventory) \[[ocfl/inventory_validator.py#L510](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L510) [ocfl/inventory_validator.py#L512](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L512)\] | -| | E066c | OCFL Object %s inventory %s version state has logical path %s that maps to content path %s, but in %s inventory it maps to content path %s \[[ocfl/inventory_validator.py#L517](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L517)\] | -| | E066d | OCFL Object %s inventory %s version state has digest %s (mapping to logical files %s) that does not appear in the %s inventory \[[ocfl/inventory_validator.py#L546](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L546)\] | -| | E066e | OCFL Object %s inventory %s version state has digest %s (mapping to logical files %s) that does not appear in the %s inventory \[[ocfl/inventory_validator.py#L549](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L549)\] | +| | E066a | OCFL Object inventory for %s doesn't have a subset of version blocks of inventory for %s \[[ocfl/inventory_validator.py#L504](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L504)\] | +| | E066b | OCFL Object %s inventory %s version state doesn't have same logical paths as same version in %s inventory (paths %s only in %s inventory) \[[ocfl/inventory_validator.py#L524](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L524) [ocfl/inventory_validator.py#L526](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L526)\] | +| | E066c | OCFL Object %s inventory %s version state has logical path %s that maps to content path %s, but in %s inventory it maps to content path %s \[[ocfl/inventory_validator.py#L531](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L531)\] | +| | E066d | OCFL Object %s inventory %s version state has digest %s (mapping to logical files %s) that does not appear in the %s inventory \[[ocfl/inventory_validator.py#L560](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L560)\] | +| | E066e | OCFL Object %s inventory %s version state has digest %s (mapping to logical files %s) that does not appear in the %s inventory \[[ocfl/inventory_validator.py#L563](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L563)\] | | [E067](https://ocfl.io/1.1/spec#E067) | 'The extensions directory must not contain any files or sub-directories other than extension sub-directories.' | OCFL Object extensions direct contains an unexpected non-directory entry: %s \[[ocfl/validator.py#L279](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L279)\] | | [E069](https://ocfl.io/1.1/spec#E069) | 'An OCFL Storage Root MUST contain a Root Conformance Declaration identifying it as such.' | _Not implemented_ | | [E070](https://ocfl.io/1.1/spec#E070) | 'If present, [the ocfl_layout.json document] MUST include the following two keys in the root JSON object: [extension, description]' | _Not implemented_ | @@ -153,52 +153,52 @@ The following tables show the implementation status of all errors and warnings i | [E089](https://ocfl.io/1.1/spec#E089) | 'If the preservation of non-OCFL-compliant features is required then the content MUST be wrapped in a suitable disk or filesystem image format which OCFL can treat as a regular file.' | _Not implemented_ | | [E090](https://ocfl.io/1.1/spec#E090) | 'Hard and soft (symbolic) links are not portable and MUST NOT be used within OCFL Storage hierarchies.' | NOTE - E090 is a processing instruction and can't be tested for \[_Not implemented_\] | | [E091](https://ocfl.io/1.1/spec#E091) | 'Filesystems MUST preserve the case of OCFL filepaths and filenames.' | OCFL Object %s inventory manifest file list for digest %s is not a JSON array \[_Not implemented_\] | -| [E092](https://ocfl.io/1.1/spec#E092) | 'The value for each key in the manifest must be an array containing the content paths of files in the OCFL Object that have content with the given digest.' | **Missing description** \[[ocfl/inventory_validator.py#L188](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L188)\] | +| [E092](https://ocfl.io/1.1/spec#E092) | 'The value for each key in the manifest must be an array containing the content paths of files in the OCFL Object that have content with the given digest.' | **Missing description** \[[ocfl/inventory_validator.py#L202](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L202)\] | | | E092a | OCFL Object %s inventory manifest using digest algorithm %s has digest %s for file %s which doesn't match calculated digest %s for that file \[[ocfl/validator.py#L449](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L449) [ocfl/validator.py#L454](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L454)\] | | | E092b | OCFL Object %s inventory manifest refers to a file path that is not present in the object (%s) \[[ocfl/validator.py#L444](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L444)\] | | [E093](https://ocfl.io/1.1/spec#E093) | 'Where included in the fixity block, the digest values given must match the digests of the files at the corresponding content paths.' | _See multiple cases identified with suffixes below_ | | | E093a | OCFL Object %s inventory fixity block for digest algorithm %s has digest %s for file %s which doesn't match calculated digest %s for that file \[[ocfl/validator.py#L452](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L452) [ocfl/validator.py#L455](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L455)\] | | | E093b | OCFL Object %s inventory fixity block for digest algorithm %s has digest %s for a file %s which does not exist in the object \[[ocfl/validator.py#L438](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L438)\] | -| [E094](https://ocfl.io/1.1/spec#E094) | 'The value of [the message] key is freeform text, used to record the rationale for creating this version. It must be a JSON string.' | OCFL Object %s inventory %s version block has message key with value that isn't a string \[[ocfl/inventory_validator.py#L345](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L345)\] | +| [E094](https://ocfl.io/1.1/spec#E094) | 'The value of [the message] key is freeform text, used to record the rationale for creating this version. It must be a JSON string.' | OCFL Object %s inventory %s version block has message key with value that isn't a string \[[ocfl/inventory_validator.py#L359](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L359)\] | | [E095](https://ocfl.io/1.1/spec#E095) | 'Within a version, logical paths must be unique and non-conflicting, so the logical path for a file cannot appear as the initial part of another logical path.' | _See multiple cases identified with suffixes below_ | -| | E095a | OCFL Object %s inventory version %s state has logical path %s used more than once \[[ocfl/inventory_validator.py#L385](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L385)\] | -| | E095b | OCFL Object %s inventory version %s state has logical path %s used as both a directory and a file path. \[[ocfl/inventory_validator.py#L396](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L396)\] | -| [E096](https://ocfl.io/1.1/spec#E096) | 'As JSON keys are case sensitive, while digests may not be, there is an additional requirement that each digest value must occur only once in the manifest regardless of case.' | OCFL Object %s inventory manifest block includes digest %s more than once with different normalizations \[[ocfl/inventory_validator.py#L194](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L194)\] | -| [E097](https://ocfl.io/1.1/spec#E097) | 'As JSON keys are case sensitive, while digests may not be, there is an additional requirement that each digest value must occur only once in the fixity block for any digest algorithm, regardless of case.' | OCFL Object %s inventory fixity block for digest algorithm %s, includes digest %s more than once with different normalizations \[[ocfl/inventory_validator.py#L248](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L248)\] | +| | E095a | OCFL Object %s inventory version %s state has logical path %s used more than once \[[ocfl/inventory_validator.py#L399](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L399)\] | +| | E095b | OCFL Object %s inventory version %s state has logical path %s used as both a directory and a file path. \[[ocfl/inventory_validator.py#L410](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L410)\] | +| [E096](https://ocfl.io/1.1/spec#E096) | 'As JSON keys are case sensitive, while digests may not be, there is an additional requirement that each digest value must occur only once in the manifest regardless of case.' | OCFL Object %s inventory manifest block includes digest %s more than once with different normalizations \[[ocfl/inventory_validator.py#L208](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L208)\] | +| [E097](https://ocfl.io/1.1/spec#E097) | 'As JSON keys are case sensitive, while digests may not be, there is an additional requirement that each digest value must occur only once in the fixity block for any digest algorithm, regardless of case.' | OCFL Object %s inventory fixity block for digest algorithm %s, includes digest %s more than once with different normalizations \[[ocfl/inventory_validator.py#L262](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L262)\] | | [E098](https://ocfl.io/1.1/spec#E098) | 'The content path must be interpreted as a set of one or more path elements joined by a / path separator.' | _Not implemented_ | -| [E099](https://ocfl.io/1.1/spec#E099) | '[content] path elements must not be ., .., or empty (//).' | OCFL Object %s inventory manifest content path %s includes invalid element ., .., or empty (//). \[[ocfl/inventory_validator.py#L471](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L471)\] | -| [E100](https://ocfl.io/1.1/spec#E100) | 'A content path must not begin or end with a forward slash (/).' | OCFL Object %s inventory manifest content path %s must not begin or end with /. \[[ocfl/inventory_validator.py#L459](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L459)\] | +| [E099](https://ocfl.io/1.1/spec#E099) | '[content] path elements must not be ., .., or empty (//).' | OCFL Object %s inventory manifest content path %s includes invalid element ., .., or empty (//). \[[ocfl/inventory_validator.py#L485](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L485)\] | +| [E100](https://ocfl.io/1.1/spec#E100) | 'A content path must not begin or end with a forward slash (/).' | OCFL Object %s inventory manifest content path %s must not begin or end with /. \[[ocfl/inventory_validator.py#L473](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L473)\] | | [E101](https://ocfl.io/1.1/spec#E101) | 'Within an inventory, content paths must be unique and non-conflicting, so the content path for a file cannot appear as the initial part of another content path.' | _See multiple cases identified with suffixes below_ | -| | E101a | OCFL Object %s inventory manifest content path %s is repeated \[[ocfl/inventory_validator.py#L475](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L475)\] | -| | E101b | OCFL Object %s inventory manifest content path %s used as both a directory and a file path \[[ocfl/inventory_validator.py#L204](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L204)\] | +| | E101a | OCFL Object %s inventory manifest content path %s is repeated \[[ocfl/inventory_validator.py#L489](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L489)\] | +| | E101b | OCFL Object %s inventory manifest content path %s used as both a directory and a file path \[[ocfl/inventory_validator.py#L218](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L218)\] | | [E102](https://ocfl.io/1.1/spec#E102) | 'An inventory file must not contain keys that are not specified.' | _Not implemented_ | | [E103](https://ocfl.io/1.1/spec#E103) | 'Each version directory within an OCFL Object MUST conform to either the same or a later OCFL specification version as the preceding version directory.' | OCFL Object %s inventory conforms to specification version %s which is an earlier version than the %s inventory which conforms to specification version %s \[[ocfl/validator.py#L385](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L385)\] | | [E104](https://ocfl.io/1.1/spec#E104) | 'Version directory names MUST be constructed by prepending v to the version number.' | _Not implemented_ | | [E105](https://ocfl.io/1.1/spec#E105) | 'The version number MUST be taken from the sequence of positive, base-ten integers: 1, 2, 3, etc.' | _Not implemented_ | | [E106](https://ocfl.io/1.1/spec#E106) | 'The value of the manifest key MUST be a JSON object.' | _Not implemented_ | -| [E107](https://ocfl.io/1.1/spec#E107) | 'The value of the manifest key must be a JSON object, and each key MUST correspond to a digest value key found in one or more state blocks of the current and/or previous version blocks of the OCFL Object.' | **Missing description** \[[ocfl/inventory_validator.py#L420](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L420)\] | +| [E107](https://ocfl.io/1.1/spec#E107) | 'The value of the manifest key must be a JSON object, and each key MUST correspond to a digest value key found in one or more state blocks of the current and/or previous version blocks of the OCFL Object.' | **Missing description** \[[ocfl/inventory_validator.py#L434](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L434)\] | | [E108](https://ocfl.io/1.1/spec#E108) | 'The contentDirectory value MUST represent a direct child directory of the version directory in which it is found.' | _Not implemented_ | | [E110](https://ocfl.io/1.1/spec#E110) | 'A unique identifier for the OCFL Object MUST NOT change between versions of the same object.' | _Not implemented_ | | [E111](https://ocfl.io/1.1/spec#E111) | 'If present, [the value of the fixity key] MUST be a JSON object, which may be empty.' | OCFL Object %s inventory includes a fixity key with value that isn't a JSON object \[_Not implemented_\] | | [E112](https://ocfl.io/1.1/spec#E112) | 'The extensions directory must not contain any files or sub-directories other than extension sub-directories.' | _Not implemented_ | -| E999 | **Not in specification** | **Missing description** \[[ocfl/inventory_validator.py#L96](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L96)\] | +| E999 | **Not in specification** | **Missing description** \[[ocfl/inventory_validator.py#L110](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L110)\] | ## Warnings | Code | Specification text (or suffixed code) | Implementation status and message/links | | --- | --- | --- | -| [W001](https://ocfl.io/1.1/spec#W001) | 'Implementations SHOULD use version directory names constructed without zero-padding the version number, ie. v1, v2, v3, etc.'' | OCFL Object %s inventory version numbers SHOULD NOT be zero-padded \[[ocfl/inventory_validator.py#L290](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L290)\] | +| [W001](https://ocfl.io/1.1/spec#W001) | 'Implementations SHOULD use version directory names constructed without zero-padding the version number, ie. v1, v2, v3, etc.'' | OCFL Object %s inventory version numbers SHOULD NOT be zero-padded \[[ocfl/inventory_validator.py#L304](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L304)\] | | [W002](https://ocfl.io/1.1/spec#W002) | 'The version directory SHOULD NOT contain any directories other than the designated content sub-directory. Once created, the contents of a version directory are expected to be immutable.' | OCFL Object version directory %s SHOULD NOT contain any directory except the designated content directory (found %s) \[[ocfl/validator.py#L419](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L419)\] | | [W003](https://ocfl.io/1.1/spec#W003) | 'Version directories must contain a designated content sub-directory if the version contains files to be preserved, and SHOULD NOT contain this sub-directory otherwise.' | OCFL Object version directory %s SHOULD NOT contain an empty content directory \[[ocfl/validator.py#L417](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L417)\] | -| [W004](https://ocfl.io/1.1/spec#W004) | 'For content-addressing, OCFL Objects SHOULD use sha512.' | OCFL Object %s inventory SHOULD use sha512 but uses sha256 as the DigestAlgorithm \[[ocfl/inventory_validator.py#L117](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L117)\] | -| [W005](https://ocfl.io/1.1/spec#W005) | 'The OCFL Object Inventory id SHOULD be a URI.' | OCFL Object %s inventory id SHOULD be a URI (got %s) \[[ocfl/inventory_validator.py#L89](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L89)\] | +| [W004](https://ocfl.io/1.1/spec#W004) | 'For content-addressing, OCFL Objects SHOULD use sha512.' | OCFL Object %s inventory SHOULD use sha512 but uses sha256 as the DigestAlgorithm \[[ocfl/inventory_validator.py#L131](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L131)\] | +| [W005](https://ocfl.io/1.1/spec#W005) | 'The OCFL Object Inventory id SHOULD be a URI.' | OCFL Object %s inventory id SHOULD be a URI (got %s) \[[ocfl/inventory_validator.py#L103](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L103)\] | | [W007](https://ocfl.io/1.1/spec#W007) | 'In the OCFL Object Inventory, the JSON object describing an OCFL Version, SHOULD include the message and user keys.' | _See multiple cases identified with suffixes below_ | -| | W007a | OCFL Object %s inventory %s version block SHOULD include a message key \[[ocfl/inventory_validator.py#L343](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L343)\] | -| | W007b | OCFL Object %s inventory %s version block SHOULD include a user key \[[ocfl/inventory_validator.py#L347](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L347)\] | -| [W008](https://ocfl.io/1.1/spec#W008) | 'In the OCFL Object Inventory, in the version block, the value of the user key SHOULD contain an address key, address.' | OCFL Object %s inventory %s version block user description SHOULD have an address \[[ocfl/inventory_validator.py#L356](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L356)\] | -| [W009](https://ocfl.io/1.1/spec#W009) | 'In the OCFL Object Inventory, in the version block, the address value SHOULD be a URI: either a mailto URI [RFC6068] with the e-mail address of the user or a URL to a personal identifier, e.g., an ORCID iD.' | OCFL Object %s inventory %s version block user description SHOULD be a mailto: or person identifier URI \[[ocfl/inventory_validator.py#L360](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L360)\] | +| | W007a | OCFL Object %s inventory %s version block SHOULD include a message key \[[ocfl/inventory_validator.py#L357](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L357)\] | +| | W007b | OCFL Object %s inventory %s version block SHOULD include a user key \[[ocfl/inventory_validator.py#L361](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L361)\] | +| [W008](https://ocfl.io/1.1/spec#W008) | 'In the OCFL Object Inventory, in the version block, the value of the user key SHOULD contain an address key, address.' | OCFL Object %s inventory %s version block user description SHOULD have an address \[[ocfl/inventory_validator.py#L370](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L370)\] | +| [W009](https://ocfl.io/1.1/spec#W009) | 'In the OCFL Object Inventory, in the version block, the address value SHOULD be a URI: either a mailto URI [RFC6068] with the e-mail address of the user or a URL to a personal identifier, e.g., an ORCID iD.' | OCFL Object %s inventory %s version block user description SHOULD be a mailto: or person identifier URI \[[ocfl/inventory_validator.py#L374](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L374)\] | | [W010](https://ocfl.io/1.1/spec#W010) | 'In addition to the inventory in the OCFL Object Root, every version directory SHOULD include an inventory file that is an Inventory of all content for versions up to and including that particular version.' | OCFL Object %s SHOULD have an inventory file but does not \[[ocfl/validator.py#L302](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L302)\] | -| [W011](https://ocfl.io/1.1/spec#W011) | 'In the case that prior version directories include an inventory file, the values of the created, message and user keys in each version block in each prior inventory file SHOULD have the same values as the corresponding keys in the corresponding version block in the current inventory file.' | OCFL Object version metadata '%s' for %s in %s inventory does not match that in %s inventory \[[ocfl/inventory_validator.py#L525](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L525)\] | +| [W011](https://ocfl.io/1.1/spec#W011) | 'In the case that prior version directories include an inventory file, the values of the created, message and user keys in each version block in each prior inventory file SHOULD have the same values as the corresponding keys in the corresponding version block in the current inventory file.' | OCFL Object version metadata '%s' for %s in %s inventory does not match that in %s inventory \[[ocfl/inventory_validator.py#L539](https://github.com/zimeon/ocfl-py/blob/main/ocfl/inventory_validator.py#L539)\] | | [W012](https://ocfl.io/1.1/spec#W012) | 'Implementers SHOULD use the logs directory, if present, for storing files that contain a record of actions taken on the object.' | _Not implemented_ | | [W013](https://ocfl.io/1.1/spec#W013) | 'In an OCFL Object, extension sub-directories SHOULD be named according to a registered extension name.' | OCFL Object includes unregistered extension directory '%s' \[[ocfl/validator.py#L277](https://github.com/zimeon/ocfl-py/blob/main/ocfl/validator.py#L277)\] | | [W014](https://ocfl.io/1.1/spec#W014) | 'Storage hierarchies within the same OCFL Storage Root SHOULD use just one layout pattern.' | _Not implemented_ | @@ -206,4 +206,4 @@ The following tables show the implementation status of all errors and warnings i | [W016](https://ocfl.io/1.1/spec#W016) | 'In the Storage Root, extension sub-directories SHOULD be named according to a registered extension name.' | _Not implemented_ | | W901 | **Not in specification** | OCFL Storage Root includes unregistered extension directory '%s' \[[ocfl/storage_root.py#L274](https://github.com/zimeon/ocfl-py/blob/main/ocfl/storage_root.py#L274)\] | -_Generated by `extract_codes.py` at 2024-10-24 18:30:20.962876_ \ No newline at end of file +_Generated by `extract_codes.py` at 2024-10-27 17:09:23.961703_ \ No newline at end of file