History¶
2.4.0 (2026-07-06)¶
Documentation overhaul: the documentation has been reorganised along the Diátaxis framework (tutorials, how-to guides, reference, explanations), with new furo/MyST/napoleon/intersphinx tooling behind the Sphinx build. Closes #141 (graphics export how-to) and #83 (
prov-convert/prov-compareCLI tools how-to). (#210, #211, #212, #213, #214, #215, #216)Test suite redesigned as pytest-native: shared statement/attribute/qname coverage is now expressed once and parametrized across a document x format matrix (json/xml/rdf/model) instead of being copy-pasted per serializer; Hypothesis property-based round-trip tests generate documents across the full feature set; a malformed-input corpus exercises each deserializer’s error handling. (#219, #220, #221, #222, #227, #229)
``prov.model`` split into a package (
prov.model.records,prov.model.namespaces,prov.model.bundle) for maintainability, with no import-path changes: every historicfrom prov.model import Xstill works identically. (#231)Minor Makefile/CLAUDE.md cleanup for contributors. (#209)
The serializer registry now degrades gracefully when the optional
rdf(rdflib) orxml(lxml) extra is not installed:import provand the JSON/PROV-N serializers work in a minimal install, and requesting therdf/xmlformat raises an informativeDoNotExistnaming the missing extra instead of a bareModuleNotFoundError. (#230)Deprecation warnings signposting planned 3.0 changes: importing
prov.dot/prov.graphnow emits aDeprecationWarningnaming the futureprov[dot]/prov[graph]extras those modules will require, andProvBundle.unified()/ProvDocument.unified()emit aFutureWarningabout the upcoming PROV-CONSTRAINTS unification rework. Both warnings are hidden by default (standardDeprecationWarning/FutureWarningsemantics) and link to the new Upgrading to 3.0 guide, which tables every planned 3.0 change and what to do about it.
2.3.0 (2026-07-05)¶
Dropped Python 3.9 support; minimum is now Python 3.10 (security fixes in transitive dependencies are only released for Python 3.10+) (#189)
Widened ``rdflib`` to ``>=6.0.0,<8`` (was
>=4.2.1,<7): rdflib 7 now supported; the floor rose because 4.2.1 no longer installs on supported Pythons (#207)Diagnostic improvement:
DoNotExist(serializer lookup) and the CLI’sCLIErrornow set__cause__via exception chaining, so tracebacks show the original error; exception types and messages are unchanged, so existingexceptblocks are unaffected (#200)Whole package passes
mypy --strict; ships apy.typedmarker (PEP 561) so downstream type-checkers see inline types (#192, #193, #194)Coverage raised to 97%, enforced in CI; new tests for the CLI scripts,
prov.read()auto-detection, graph interop, and the serializer registry (#201, #202, #203, #204)Internal code quality: ruff rule families I/C4/SIM/RUF/UP045/UP031 enabled and long-standing lint suppressions resolved (#195, #196, #197, #198, #199, #200); dependency audit documented in
docs/dependencies.md; tox removed (useuv run --python 3.X pytestfor local multi-version testing) (#205)Security hygiene:
SECURITY.md, Dependabot version updates, and a documented support policy (#190)Fixed ReadTheDocs build (Sphinx pinned
<9) (#187)
2.2.0 (2026-07-03)¶
Fixed graphical output when a filename is supplied (#164)
Fixed PROV-XML deserialization when prov is the default namespace (#155)
New
plotextra:pip install prov[plot]for matplotlib support (#166)Marked as Production/Stable; added Python 3.14 to the test matrix
Tooling: ruff (lint+format), pytest runner, uv-based CI, automated PyPI releases via Trusted Publishing. No public API changes.
2.1.1 (2025-06-24)¶
No change - fixing the previous botched release
2.1.0 (2025-06-24)¶
Added type annotations and mypy checks
Added support for Python 3.13
2.0.2 (2025-06-07)¶
Removed support for EOL Python 3.8
Using pyproject.toml for project configurations (instead of setup.py)
2.0.1 (2024-06-10)¶
Removed support for EOL Python 3.6 and 3.7
Minor documentation update (#153)
Stopped using deepcopy when duplicating Namespace (#158)
Restricting rdflib package version to “<7” (#156)
Raise an exception when an empty URI is registered as a namespace (#142)
Ensure rdflib 6+ returns bytes when serializing tests (fixed #151)
Removed fancy label output for bundle
2.0.0 (2020-11-01)¶
Removed support for EOL Python 2
Testing against Python 3.6+ and Pypy3
1.5.3 (2018-11-20)¶
Reorganised source code to /src
Added Python 3.7 support
Removed Python 3.3 support due to end-of-life
plus minor improvements and bug fixes
1.5.2 (2018-02-06)¶
Fixed association relation in RDF serialisation
Fixed compatibility with networkx 2.0+
1.5.1 (2017-07-18)¶
Replaced pydotplus with pydot (see #111)
Fixed datetime and bundle error in RDF serialisation
Tested against Python 3.6
Improved documentation
1.5.0 (2016-10-19)¶
Added: Support for PROV-O (RDF) serialization and deserialization
Added: direction option for
prov.dot.prov_to_dot()Added:
prov.graph.graph_to_prov()to convert a MultiDiGraph back to aProvDocumentTesting with Python 3.5
Various minor bug fixes and improvements
1.4.0 (2015-08-13)¶
Changed the type of qualified names to prov:QUALIFIED_NAME (fixed #68)
Removed XSDQName class and stopped supporting parsing xsd:QName as qualified names
Replaced pydot dependency with pydotplus
Removed support for Python 2.6
Various minor bug fixes and improvements
1.3.2 (2015-06-17)¶
Added: prov-compare script to check equivalence of two PROV files (currently supporting JSON and XML)
Fixed: deserialising Python 3’s bytes objects (issue #67)
1.3.1 (2015-02-27)¶
Fixed unicode issue with deserialising text contents
Set the correct version requirement for six
Fixed format selection in prov-convert script
1.3.0 (2015-02-03)¶
Python 3.3 and 3.4 supported
Updated prov-convert script to support XML output
Added missing test JSON and XML files in distributions
1.2.0 (2014-12-19)¶
Added:
prov.graph.prov_to_graph()to convert aProvDocumentto a MultiDiGraphAdded: PROV-N serializer
Fixed: None values for empty formal attributes in PROV-N output (issue #60)
Fixed: PROV-N representation for xsd:dateTime (issue #58)
Fixed: Unintended merging of Identifier and QualifiedName values
Fixed: Cloning the records when creating a new document from them
Fixed: incorrect SoftwareAgent records in XML serialization
1.1.0 (2014-08-21)¶
Added: Support for PROV-XML serialization and deserialization
A
ProvRecordinstance can now be used as the value of an attributesAdded: convenient assertions methods for
ProvEntity,ProvActivity, andProvAgentAdded:
prov.model.ProvDocument.update()andprov.model.ProvBundle.update()Fixed: Handling default namespaces of bundles when flattened
1.0.1 (2014-08-18)¶
Added: Default namespace inheritance for bundles
Fixed:
prov.model.NamespaceManager.valid_qualified_name()did not supportXSDQNameAdded: Convenience
prov.read()method with a lazy format detectionAdded: Convenience
plot()method on theProvBundleclass (requiring matplotlib).Changed: The previous
add_record()method renamed tonew_record()Added:
add_record()function which takes one argument, aProvRecord, has been addedFixed: Document flattening (see
flattened())Added:
__hash__()function added toProvRecord(at risk: to be removed asProvRecordis expected to be mutable)Added:
extra_attributesadded to mirror existingformal_attributes
1.0.0 (2014-07-15)¶
The underlying data model has been rewritten and is incompatible with pre-1.0 versions.
References to PROV elements (i.e. entities, activities, agents) in relation records are now QualifiedName instances.
A document or bundle can have multiple records with the same identifier.
PROV-JSON serializer and deserializer are now separated from the data model.
Many tests added, including round-trip PROV-JSON encoding/decoding.
For changes pre-1.0, see the “Pre-1.0 change log” section below.
Pre-1.0 change log¶
0.5.3 (2013-12-13)¶
Changed: Allowed namespaces at bundle level
Fixed: Only check equality of ProvBundles on asserted records
Fixed: Some string literals are wrongly converted to QNames
Updated test cases from ProvToolbox (v4.1)
Added text explanations for some ProvException subclasses
Added support for langtag in prov.persistence.LiteralAttribute
Fixed: Support for prov:InternationalizedString literals
Fixed: Keep timezone information when parsing xsd:dateTime
0.5.2 (2013-10-18)¶
Added South migrations for prov.persistence
Fixed: Support for unlimited-length record identifier
Fixed: Support for unlimited-length URI in namespace
Fixed: Support for long literals (i.e. longer than 255 characters)
Fixed: (JSON) Support for membership with multiple members
Fixed: UnicodeEncodeError error
Fixed: Support for JSON having records sharing the same identifier
Fixed: Refactor the flattening code
Fixed: Parsing XSD dateTime
Fixed: Triple quoted multi-line string literals in PROV-N
Added: Support initialising namespaces when creating a ProvBundle
0.5.1 (2013-09-13)¶
Added: JSON membership relation with a single entity (in a list)
Fixed: Not generating inferred records in JSON encoding.
Fixed: Generating JSON arrays for multi-value attributes
Fixed: Comparing unicode literal values (fixed #12)
Fixed: Returning the identifier of a record if the required attribute type is Identifier
Fixed: No longer trying to find the actual generalEntity record when creating a Mention record
Added informative arguments to ProvException classes
Fixed: Attribute validation does not fail if the attribute is already a ProvRecord
0.5.0 (2013-09-02)¶
Allow inferred records to be retyped when flattening
prov.model.graph: check if a node of a relation already drawn
Add get_flattened() function to ProvBundle
Added: hash functions for Literal and Namespace
Changed: Add new bundle’s namespaces to parent document
Fixed: prov.persistence only saves namespaces at document level
Added: is_document() and is_bundle() for ProvBundle
Fixed: Stop outputting prefix in an bundle’s PROV-JSON
Changed: Removed namespace declarations in example bundles
Better handling of ids when generating PROV-JSON
Changed: Bundles cannot have their own namespace prefixes
When exporting a bundle as a document add namespaces from parent
Return pdbundle when calling add_prov_bundle
Fixed support for the default namespace
Fixed minor bugs.
0.4.9 (2013-08-09)¶
Fixed: Cannot get_label() when self._extra_attributes is None
0.4.8 (2013-08-06)¶
Added: Option to show attributes of relations in DOT graph generation
Added: option to show attributes of nodes in DOT graph representation
Added: Convenient methods for (de)serialising PROV-JSON (closes #17)
Fixed: No longer output inferred records in PROV-N and PROV-JSON
Fixed: Bundles now can have own namespaces
Fixed: missing return Literal(…)
Fixed: Error getting the value and datatype of Literal
0.4.7 (2013-07-10)¶
Changed: Removed out-dated example_graph()
Changed: Improved mappings between default Python and XSD data types
Changed: Removed ProvElement as the inferred record for influence
Changed: Updated examples (primer, bundles1, bundles2)
Fixed: Removed the duplicated Bundle definition in PROV_RECORD_TYPES
Added JSON test files from ProvToolbox and a test for loading these
Changed: Improved Literal equality test
Added langtag getter to Literal
0.4.6 (2013-04-24)¶
Fixed: Removed the ‘activity’ attribute from Influence expression
Fixed: Inferred records couldn’t be created when the expected types provided as a list
0.4.5 (2013-03-13)¶
Changed: ProvActivity.set_time() can now accept just one argument. It previously sets the time of the missing argument to None.
Changed: ProvAgent is now eligible for entity arguments and ProvEntity for agent ones
Fixed: Producing the right PROV-N representation for float values
0.4.4¶
Added float data type support for prov.persistence
Removed ProvCollection class since collections should be instantiated as entities
Added get_attribute() and get_value() to ProvRecord
Changed: Check if an attribute’s value is a valid QName and return the QName
Fixed exception rendering graphs with empty records
0.4.3¶
Fixed: PROV-N export - top-level bundle -> document
Fixed: Bug when renaming prefixes
0.4.2¶
Updated graph colors to the PROV style
0.4.1¶
Restructured package folder
Moved to a new repo.
Fixed: ‘memberof’ -> ‘hadMember’
0.4.0 (2012-10-31)¶
Initial release.