Getting Started¶
Validation¶
Using Tripoli to validate a IIIF document is easy.
>>> from tripoli import IIIFValidator
>>> import requests # for example
>>> iv = IIIFValidator()
>>> manifest = requests.get("http://example.com/manifest.json")
>>> iv.validate(manifest.text)
>>> iv.is_valid
True
When Tripoli detects issues in a document, it provides informative errors and warnings with key paths to simplify the debugging progress.
>>> man = requests.get("http://example.com/bad_manifest.json")
>>> iv.validate(man)
>>> iv.is_valid
False
>>> iv.print_warnings()
Warning: logo SHOULD be IIIF image service. @ data['logo']
Warning: manifest SHOULD have thumbnail field. @ data['thumbnail']
Warning: Unknown key 'see_also' in 'manifest' @ data['see_also']
Warning: ImageResource SHOULD have @id field. @ data['sequences']['canvases']['images']['@id']
>>> iv.print_errors()
Error: Field has no '@language' key where one is required. @ data['metadata']['value']
Error: viewingHint 'pages' is not valid and not uri. @ data['sequences']['canvases']['viewingHint']
Options¶
The IIIFValidator
has a number of options to control its behaviour.
-
class
tripoli.
IIIFValidator
(debug=False, collect_warnings=True, collect_errors=True, fail_fast=True, verbose=False, unique_logging=True) -
collect_errors
= True Sets whether or not errors are logged.
-
collect_warnings
= True Sets whether or not warnings are logged. Default
True
.
-
debug
= False Sets whether or not to save tracebacks in warnings/errors.
-
fail_fast
= True When
True
, validation stops at first error hit (faster). IfFalse
, entire document will always be validated.Note: Turning
fail_fast
off may cause the validator to raise unexpected exceptions if the the document is grossly invalid (for instance, if an integer is supplied where a list is expected).
-
unique_logging
= True If
True
, only one instance of duplicate logged messages will be saved. IfFalse
, all logged messages will be saved.Example: If set to true, then if every canvas has error A, instead of having the errors (Error(A, canvas[0]), Error(A, canvas[1]), …), you will only get Error(A, canvas[0]) (the first error of type A on a canvas).
-
verbose
= False If
True
, prints all errors and warnings as they occur. IfFalse
, errors and warnings only printed after de-duplication.
-
The complete interface can be found in the API guide.
Tripoli can also be configured to log extra warnings, ignore particular errors, and correct errors in manifests. Refer to the configuration section for more information.
Validating Online¶
You can use tripoli to validate online at https://validate.musiclibs.net. Simply pass in a link to a manifest as a query parameter named ‘manifest’.
>>> curl "https://validate.musiclibs.net/?manifest=${MANIFEST_URL}" -H "Accept: application/json"
{
"errors": [
"Error: '@context' must be set to 'http://iiif.io/api/presentation/2/context.json' @ data['@context']",
"Error: @context field not allowed in embedded sequence. @ data['sequences']['@context']",
"Error: Key 'on' is required in 'annotation' @ data['sequences']['canvases']['images']['on']"
],
"is_valid": false,
"manifest_url": ${MANIFEST_URL},
"warnings": [
"Warning: thumbnail SHOULD be IIIF image service. @ data['thumbnail']",
"Warning: manifest SHOULD have description field. @ data['description']",
"Warning: logo SHOULD be IIIF image service. @ data['logo']",
"Warning: Unknown key '@context' in 'sequence' @ data['sequences']['@context']",
"Warning: Unknown key '@context' in 'annotation' @ data['sequences']['canvases']['images']['@context']"
]
}