diff --git a/README.md b/README.md index 790f0de..edd3d5f 100644 --- a/README.md +++ b/README.md @@ -133,30 +133,31 @@ Informatieobject(naam='Verlenen kapvergunning Hooigracht 21 Den Haag', identifi 'VERLENEN KAPVERGUNNING HOOIGRACHT 21 DEN HAAG' ``` -Je kan op een vergelijkbare manier Bestand objecten bouwen via de `Bestand()` class. Het is vaak echter simpeler om hiervoor de _convience_ functie `create_bestand()` te gebruiken, omdat deze veel gegevens, zoals PRONOM informatie en checksums, automatisch voor je aanmaakt: +Je kan op een vergelijkbare manier Bestand objecten bouwen via de `Bestand()` class. Het is vaak echter simpeler om hiervoor de _convience_ functie `bestand_from_file()` te gebruiken, omdat deze veel gegevens, zoals PRONOM informatie en checksums, automatisch voor je aanmaakt: ```python from mdto.gegevensgroepen import * import mdto -# 'informatieobject_001.xml' is het informatieobject waar het Bestand object een representatie van is -with open("informatieobject_001.mdto.xml") as obj: - bestand = mdto.create_bestand( - infile="vergunning.pdf", # bestand waarvoor technische metagegevens moeten worden aangemaakt - identificatie=Identificatiegegevens("34c5-4379-9f1a-5c378", "Proza (DMS)"), - informatieobject=obj, - ) +# verwijzing naar bijbehorend informatieobject +obj_verwijzing = VerwijzingGegevens("Verlenen kapvergunning Hooigracht") + +bestand = mdto.bestand_from_file( + infile="vergunning.pdf", # bestand waarvoor technische metagegevens moeten worden aangemaakt + identificatie=Identificatiegegevens("34c5-4379-9f1a-5c378", "Proza (DMS)"), + isrepresentatievan=obj_verwijzing + ) # Sla op als XML bestand bestand.save("vergunning.bestand.mdto.xml") ``` -Het resulterende XML bestand bevat vervolgens de correcte ``, ``, `` , en `` tags. `` tags kunnen ook worden aangemaakt worden via de optionele `url=` parameter van `create_bestand()`. URLs worden automatisch gevalideerd via de [validators python library](https://pypi.org/project/validators/). +Het resulterende XML bestand bevat vervolgens de correcte ``, ``, `` , en `` tags. `` tags kunnen ook worden aangemaakt worden via de optionele `url=` parameter van `bestand_from_file()`. URLs worden automatisch gevalideerd via de [validators python library](https://pypi.org/project/validators/). ## XML bestanden inlezen -`mdto.py` kan ook MDTO bestanden inlezen en naar python MDTO objecten omzetten via de `from_file` functie. +`mdto.py` kan ook MDTO bestanden inlezen en naar python MDTO objecten omzetten via de `from_xml` functie. Stel bijvoorbeeld dat je alle checksums van Bestand XML bestanden wilt updaten: diff --git a/mdto/mdto.py b/mdto/mdto.py index c98c278..a3526f9 100755 --- a/mdto/mdto.py +++ b/mdto/mdto.py @@ -184,8 +184,8 @@ class ChecksumGegevens(XMLSerializable): """https://www.nationaalarchief.nl/archiveren/mdto/checksum Note: - When building Bestand objects, it's recommended to call the convience function `create_bestand()` instead. - Moreover, if you just need to update a Bestand object's checksum, you should use `create_checksum()`. + When building Bestand objects, it's recommended to call the convience function `bestand_from_file()`. + And if you just need to update a Bestand object's checksum, you should use `create_checksum()`. """ checksumAlgoritme: BegripGegevens @@ -550,7 +550,7 @@ class Bestand(Object, XMLSerializable): Note: When creating Bestand objects, it's easier to use the - `create_bestand()` convenience function instead. + `bestand_from_file()` convenience function instead. Args: identificatie (IdentificatieGegevens | List[IdentificatieGegevens]): Identificatiekenmerk @@ -730,57 +730,65 @@ def pronominfo(path: str) -> BegripGegevens: raise RuntimeError(f"fido PRONOM detection failed on file {path}") -def create_bestand( - infile: TextIO | str, +def bestand_from_file( + file: TextIO | str, identificatie: IdentificatieGegevens | List[IdentificatieGegevens], - informatieobject: TextIO | str, - naam: str = None, + isrepresentatievan: VerwijzingGegevens | TextIO | str, url: str = None, ) -> Bestand: - """Convenience function for creating Bestand objects. The difference between this function - and calling Bestand() directly is that this function infers most Bestand-related - information for you (checksum, name, and so on), based on the characteristics of `infile`. + """Convenience function for creating a Bestand object from a file. The difference + between this function and calling Bestand() directly is that this function infers + most Bestand-related information for you (checksum, name, and so on), based on + the characteristics of `file`. The value of , for example, is always set to the + name of `file`. Args: - infile (TextIO | str): the file the Bestand object should represent - identificatie (IdentificatieGegevens | List[IdentificatieGegevens]): Identificatiekenmerk - informatieobject (TextIO | str): path or file-like object to a XML file containing an informatieobject. - Used to infer values for . - naam (Optional[str]): value of . Defaults to the basename of `infile` + file (TextIO | str): the file the Bestand object represents + identificatie (IdentificatieGegevens | List[IdentificatieGegevens]): identificatiekenmerk of + Bestand object + isrepresentatievan (TextIO | str | VerwijzingGegevens): a XML file that contains an + an informatieobject, or a VerwijzingGegevens object referencing an informatieobject. + Used to construct the values for . url (Optional[str]): value of Example: ```python with open('informatieobject_001.xml') as f: - bestand = create_bestand("vergunning.pdf", + bestand = mdto.bestand_from_file("vergunning.pdf", IdentificatieGegevens('34c5-4379-9f1a-5c378', 'Proza (DMS)'), informatieobject=f) - xml = bestand.to_xml() + bestand.save("vergunning.bestand.mdto.xml") ``` Returns: Bestand: new Bestand object """ # allow infile to be a path (str) - infile = _process_file(infile) - - if not naam: - naam = os.path.basename(infile.name) - - omvang = os.path.getsize(infile.name) - bestandsformaat = pronominfo(infile.name) - checksum = create_checksum(infile) - - informatieobject = _process_file(informatieobject) - isrepresentatievan = detect_verwijzing(informatieobject) + file = _process_file(file) + + # set to basename + naam = os.path.basename(file.name) + + omvang = os.path.getsize(file.name) + bestandsformaat = pronominfo(file.name) + checksum = create_checksum(file) + + # file or file path? + if isinstance(isrepresentatievan, (str, Path)) or hasattr(isrepresentatievan, "read"): + informatieobject = _process_file(isrepresentatievan) + verwijzing_informatieobject = detect_verwijzing(informatieobject) + informatieobject.close() + elif isinstance(isrepresentatievan, VerwijzingGegevens): + verwijzing_informatieobject = isrepresentatievan + else: + raise TypeError("isrepresentatievan must either be a path/file, or a VerwijzingGegevens object.") - informatieobject.close() - infile.close() + file.close() return Bestand( - identificatie, naam, omvang, bestandsformaat, checksum, isrepresentatievan, url + identificatie, naam, omvang, bestandsformaat, checksum, verwijzing_informatieobject, url ) diff --git a/tests/test_mdto_xsd.py b/tests/test_mdto_xsd.py index fea89bc..8af7ba5 100644 --- a/tests/test_mdto_xsd.py +++ b/tests/test_mdto_xsd.py @@ -61,7 +61,7 @@ def test_automatic_bestand_xml_validity(mdto_xsd, voorbeeld_archiefstuk_xml): # use this .py file for automatic metadata generation example_file = Path(__file__) # create Bestand object from example_file + existing informatieobject - bestand = mdto.create_bestand( + bestand = mdto.bestand_from_file( example_file, IdentificatieGegevens("abcd-1234", "Corsa"), voorbeeld_archiefstuk_xml,