pyPreservica 2.7.0__tar.gz → 2.7.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/PKG-INFO +1 -1
  2. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/__init__.py +3 -3
  3. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/entityAPI.py +9 -8
  4. pyPreservica-2.7.2/pyPreservica/mdformsAPI.py +100 -0
  5. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/uploadAPI.py +65 -63
  6. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica.egg-info/PKG-INFO +1 -1
  7. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica.egg-info/SOURCES.txt +1 -0
  8. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/setup.py +1 -1
  9. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/LICENSE.txt +0 -0
  10. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/README.md +0 -0
  11. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/adminAPI.py +0 -0
  12. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/authorityAPI.py +0 -0
  13. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/common.py +0 -0
  14. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/contentAPI.py +0 -0
  15. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/monitorAPI.py +0 -0
  16. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/opex.py +0 -0
  17. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/parAPI.py +0 -0
  18. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/retentionAPI.py +0 -0
  19. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/webHooksAPI.py +0 -0
  20. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica/workflowAPI.py +0 -0
  21. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica.egg-info/dependency_links.txt +0 -0
  22. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica.egg-info/requires.txt +0 -0
  23. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/pyPreservica.egg-info/top_level.txt +0 -0
  24. {pyPreservica-2.7.0 → pyPreservica-2.7.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyPreservica
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: Python library for the Preservica API
5
5
  Home-page: https://pypreservica.readthedocs.io/
6
6
  Author: James Carr
@@ -18,11 +18,11 @@ from .adminAPI import AdminAPI
18
18
  from .monitorAPI import MonitorAPI, MonitorCategory, MonitorStatus, MessageStatus
19
19
  from .webHooksAPI import WebHooksAPI, TriggerType, WebHookHandler
20
20
  from .authorityAPI import AuthorityAPI, Table
21
-
21
+ from .mdformsAPI import MDFormsAPI
22
22
 
23
23
  __author__ = "James Carr (drjamescarr@gmail.com)"
24
24
 
25
- # Version of the Preservica API package
26
- __version__ = "2.7.0"
25
+ # Version of the pyPreservica package
26
+ __version__ = "2.7.2"
27
27
 
28
28
  __license__ = "Apache License Version 2.0"
@@ -796,11 +796,11 @@ class EntityAPI(AuthenticatedAPI):
796
796
  for url in entity.metadata:
797
797
  if schema == entity.metadata[url]:
798
798
  mref = url[url.rfind(f"{entity.reference}/metadata/") + len(f"{entity.reference}/metadata/"):]
799
- xml_object = xml.etree.ElementTree.Element('MetadataContainer',
800
- {"schemaUri": schema, "xmlns": self.xip_ns})
801
- xml.etree.ElementTree.SubElement(xml_object, "Ref").text = mref
802
- xml.etree.ElementTree.SubElement(xml_object, "Entity").text = entity.reference
803
- content = xml.etree.ElementTree.SubElement(xml_object, "Content")
799
+ xml_object = xml.etree.ElementTree.Element('xip:MetadataContainer',
800
+ {"schemaUri": schema, "xmlns:xip": self.xip_ns})
801
+ xml.etree.ElementTree.SubElement(xml_object, "xip:Ref").text = mref
802
+ xml.etree.ElementTree.SubElement(xml_object, "xip:Entity").text = entity.reference
803
+ content = xml.etree.ElementTree.SubElement(xml_object, "xip:Content")
804
804
  if isinstance(data, str):
805
805
  ob = xml.etree.ElementTree.fromstring(data)
806
806
  content.append(ob)
@@ -836,9 +836,10 @@ class EntityAPI(AuthenticatedAPI):
836
836
  """
837
837
  headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/xml;charset=UTF-8'}
838
838
 
839
- xml_object = xml.etree.ElementTree.Element('MetadataContainer', {"schemaUri": schema, "xmlns": self.xip_ns})
840
- xml.etree.ElementTree.SubElement(xml_object, "Entity").text = entity.reference
841
- content = xml.etree.ElementTree.SubElement(xml_object, "Content")
839
+ xml_object = xml.etree.ElementTree.Element('xip:MetadataContainer', {"schemaUri": schema,
840
+ "xmlns:xip": self.xip_ns})
841
+ xml.etree.ElementTree.SubElement(xml_object, "xip:Entity").text = entity.reference
842
+ content = xml.etree.ElementTree.SubElement(xml_object, "xip:Content")
842
843
  if isinstance(data, str):
843
844
  ob = xml.etree.ElementTree.fromstring(data)
844
845
  content.append(ob)
@@ -0,0 +1,100 @@
1
+ """
2
+ pyPreservica MDFormsAPI module definition
3
+
4
+ A client library for the Preservica Repository web services Metadata API
5
+ https://demo.preservica.com/api/metadata/documentation.html
6
+
7
+ author: James Carr
8
+ licence: Apache License 2.0
9
+
10
+ """
11
+ import json
12
+ import xml.etree.ElementTree
13
+
14
+ from pyPreservica.common import *
15
+
16
+
17
+ class MDFormsAPI(AuthenticatedAPI):
18
+ def __init__(self, username: str = None, password: str = None, tenant: str = None, server: str = None,
19
+ use_shared_secret: bool = False, two_fa_secret_key: str = None, protocol: str = "https"):
20
+ super().__init__(username, password, tenant, server, use_shared_secret, two_fa_secret_key, protocol)
21
+ xml.etree.ElementTree.register_namespace("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/")
22
+ xml.etree.ElementTree.register_namespace("ead", "urn:isbn:1-931666-22-9")
23
+
24
+ def delete_group(self, id: str):
25
+ """
26
+ Delete a group
27
+ :param id: Group ID
28
+ :return:
29
+ """
30
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
31
+ url = f'{self.protocol}://{self.server}/api/metadata/groups/{id}'
32
+ with self.session.delete(url, headers=headers) as request:
33
+ if request.status_code == requests.codes.unauthorized:
34
+ self.token = self.__token__()
35
+ return self.delete_group(id)
36
+ elif request.status_code == requests.codes.no_content:
37
+ return None
38
+ else:
39
+ exception = HTTPException(None, request.status_code, request.url, "delete_group",
40
+ request.content.decode('utf-8'))
41
+ logger.error(exception)
42
+ raise exception
43
+
44
+ def add_group(self, document):
45
+ """
46
+ Add a new group
47
+ :return:
48
+ """
49
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
50
+ url = f'{self.protocol}://{self.server}/api/metadata/groups/'
51
+ with self.session.post(url, headers=headers, json=document) as request:
52
+ if request.status_code == requests.codes.unauthorized:
53
+ self.token = self.__token__()
54
+ return self.add_group(document)
55
+ elif request.status_code == requests.codes.created:
56
+ return json.loads(str(request.content.decode('utf-8')))
57
+ else:
58
+ exception = HTTPException(None, request.status_code, request.url, "group",
59
+ request.content.decode('utf-8'))
60
+ logger.error(exception)
61
+ raise exception
62
+
63
+ def group(self, id: str):
64
+ """
65
+ Fetch a metadata Group by its id
66
+ :param id: The group ID
67
+ :return: JSON Document
68
+ """
69
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
70
+ url = f'{self.protocol}://{self.server}/api/metadata/groups/{id}'
71
+ with self.session.get(url, headers=headers) as request:
72
+ if request.status_code == requests.codes.unauthorized:
73
+ self.token = self.__token__()
74
+ return self.group(id)
75
+ elif request.status_code == requests.codes.ok:
76
+ return json.loads(str(request.content.decode('utf-8')))
77
+ else:
78
+ exception = HTTPException(None, request.status_code, request.url, "group",
79
+ request.content.decode('utf-8'))
80
+ logger.error(exception)
81
+ raise exception
82
+
83
+ def groups(self):
84
+ """
85
+ Fetch all the Metadata Groups as JSON
86
+ :return: JSON Document
87
+ """
88
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
89
+ url = f'{self.protocol}://{self.server}/api/metadata/groups'
90
+ with self.session.get(url, headers=headers) as request:
91
+ if request.status_code == requests.codes.unauthorized:
92
+ self.token = self.__token__()
93
+ return self.groups()
94
+ elif request.status_code == requests.codes.ok:
95
+ return json.loads(str(request.content.decode('utf-8')))['groups']
96
+ else:
97
+ exception = HTTPException(None, request.status_code, request.url, "groups",
98
+ request.content.decode('utf-8'))
99
+ logger.error(exception)
100
+ raise exception
@@ -98,11 +98,11 @@ def prettify(elem):
98
98
 
99
99
  def __create_io__(xip=None, file_name=None, parent_folder=None, **kwargs):
100
100
  if xip is None:
101
- xip = Element('XIP')
101
+ xip = Element('xip:XIP')
102
102
  assert xip is not None
103
- xip.set('xmlns', 'http://preservica.com/XIP/v6.0')
104
- io = SubElement(xip, 'InformationObject')
105
- ref = SubElement(io, 'Ref')
103
+ xip.set('xmlns:xip', 'http://preservica.com/XIP/v6.0')
104
+ io = SubElement(xip, 'xip:InformationObject')
105
+ ref = SubElement(io, 'xip:Ref')
106
106
 
107
107
  if 'IO_Identifier_callback' in kwargs:
108
108
  ident_callback = kwargs.get('IO_Identifier_callback')
@@ -110,15 +110,15 @@ def __create_io__(xip=None, file_name=None, parent_folder=None, **kwargs):
110
110
  else:
111
111
  ref.text = str(uuid.uuid4())
112
112
 
113
- title = SubElement(io, 'Title')
113
+ title = SubElement(io, 'xip:Title')
114
114
  title.text = kwargs.get('Title', file_name)
115
- description = SubElement(io, 'Description')
115
+ description = SubElement(io, 'xip:Description')
116
116
  description.text = kwargs.get('Description', file_name)
117
- security = SubElement(io, 'SecurityTag')
117
+ security = SubElement(io, 'xip:SecurityTag')
118
118
  security.text = kwargs.get('SecurityTag', "open")
119
- custom_type = SubElement(io, 'CustomType')
119
+ custom_type = SubElement(io, 'xip:CustomType')
120
120
  custom_type.text = kwargs.get('CustomType', "")
121
- parent = SubElement(io, 'Parent')
121
+ parent = SubElement(io, 'xip:Parent')
122
122
 
123
123
  if hasattr(parent_folder, "reference"):
124
124
  parent.text = parent_folder.reference
@@ -129,76 +129,76 @@ def __create_io__(xip=None, file_name=None, parent_folder=None, **kwargs):
129
129
 
130
130
 
131
131
  def __make_representation__(xip, rep_name, rep_type, io_ref):
132
- representation = SubElement(xip, 'Representation')
133
- io_link = SubElement(representation, 'InformationObject')
132
+ representation = SubElement(xip, 'xip:Representation')
133
+ io_link = SubElement(representation, 'xip:InformationObject')
134
134
  io_link.text = io_ref
135
- access_name = SubElement(representation, 'Name')
135
+ access_name = SubElement(representation, 'xip:Name')
136
136
  access_name.text = rep_name
137
- access_type = SubElement(representation, 'Type')
137
+ access_type = SubElement(representation, 'xip:Type')
138
138
  access_type.text = rep_type
139
- content_objects = SubElement(representation, 'ContentObjects')
140
- content_object = SubElement(content_objects, 'ContentObject')
139
+ content_objects = SubElement(representation, 'xip:ContentObjects')
140
+ content_object = SubElement(content_objects, 'xip:ContentObject')
141
141
  content_object_ref = str(uuid.uuid4())
142
142
  content_object.text = content_object_ref
143
143
  return content_object_ref
144
144
 
145
145
 
146
146
  def __make_content_objects__(xip, content_title, co_ref, io_ref, tag, content_description, content_type):
147
- content_object = SubElement(xip, 'ContentObject')
148
- ref_element = SubElement(content_object, "Ref")
147
+ content_object = SubElement(xip, 'xip:ContentObject')
148
+ ref_element = SubElement(content_object, "xip:Ref")
149
149
  ref_element.text = co_ref
150
- title = SubElement(content_object, "Title")
150
+ title = SubElement(content_object, "xip:Title")
151
151
  title.text = content_title
152
- description = SubElement(content_object, "Description")
152
+ description = SubElement(content_object, "xip:Description")
153
153
  description.text = content_description
154
- security_tag = SubElement(content_object, "SecurityTag")
154
+ security_tag = SubElement(content_object, "xip:SecurityTag")
155
155
  security_tag.text = tag
156
- custom_type = SubElement(content_object, "CustomType")
156
+ custom_type = SubElement(content_object, "xip:CustomType")
157
157
  custom_type.text = content_type
158
- parent = SubElement(content_object, "Parent")
158
+ parent = SubElement(content_object, "xip:Parent")
159
159
  parent.text = io_ref
160
160
 
161
161
 
162
162
  def __make_generation__(xip, filename, co_ref, generation_label, location=None):
163
- generation = SubElement(xip, 'Generation', {"original": "true", "active": "true"})
164
- content_object = SubElement(generation, "ContentObject")
163
+ generation = SubElement(xip, 'xip:Generation', {"original": "true", "active": "true"})
164
+ content_object = SubElement(generation, "xip:ContentObject")
165
165
  content_object.text = co_ref
166
- label = SubElement(generation, "Label")
166
+ label = SubElement(generation, "xip:Label")
167
167
  if generation_label:
168
168
  label.text = generation_label
169
169
  else:
170
170
  label.text = os.path.splitext(filename)[0]
171
- effective_date = SubElement(generation, "EffectiveDate")
171
+ effective_date = SubElement(generation, "xip:EffectiveDate")
172
172
  effective_date.text = datetime.now().isoformat()
173
- bitstreams = SubElement(generation, "Bitstreams")
174
- bitstream = SubElement(bitstreams, "Bitstream")
173
+ bitstreams = SubElement(generation, "xip:Bitstreams")
174
+ bitstream = SubElement(bitstreams, "xip:Bitstream")
175
175
  bitstream.text = f"{location}/{filename}"
176
- SubElement(generation, "Formats")
177
- SubElement(generation, "Properties")
176
+ SubElement(generation, "xip:Formats")
177
+ SubElement(generation, "xip:Properties")
178
178
 
179
179
 
180
180
  def __make_bitstream__(xip, file_name, full_path, callback, location=None):
181
- bitstream = SubElement(xip, 'Bitstream')
182
- filename_element = SubElement(bitstream, "Filename")
181
+ bitstream = SubElement(xip, 'xip:Bitstream')
182
+ filename_element = SubElement(bitstream, "xip:Filename")
183
183
  filename_element.text = file_name
184
- filesize = SubElement(bitstream, "FileSize")
184
+ filesize = SubElement(bitstream, "xip:FileSize")
185
185
  file_stats = os.stat(full_path)
186
186
  filesize.text = str(file_stats.st_size)
187
- physical_location = SubElement(bitstream, "PhysicalLocation")
187
+ physical_location = SubElement(bitstream, "xip:PhysicalLocation")
188
188
  physical_location.text = location
189
- fixities = SubElement(bitstream, "Fixities")
189
+ fixities = SubElement(bitstream, "xip:Fixities")
190
190
  fixity_result = callback(file_name, full_path)
191
191
  if type(fixity_result) == tuple:
192
- fixity = SubElement(fixities, "Fixity")
193
- fixity_algorithm_ref = SubElement(fixity, "FixityAlgorithmRef")
194
- fixity_value = SubElement(fixity, "FixityValue")
192
+ fixity = SubElement(fixities, "xip:Fixity")
193
+ fixity_algorithm_ref = SubElement(fixity, "xip:FixityAlgorithmRef")
194
+ fixity_value = SubElement(fixity, "xip:FixityValue")
195
195
  fixity_algorithm_ref.text = fixity_result[0]
196
196
  fixity_value.text = fixity_result[1]
197
197
  elif type(fixity_result) == dict:
198
198
  for key, val in fixity_result.items():
199
- fixity = SubElement(fixities, "Fixity")
200
- fixity_algorithm_ref = SubElement(fixity, "FixityAlgorithmRef")
201
- fixity_value = SubElement(fixity, "FixityValue")
199
+ fixity = SubElement(fixities, "xip:Fixity")
200
+ fixity_algorithm_ref = SubElement(fixity, "xip:FixityAlgorithmRef")
201
+ fixity_value = SubElement(fixity, "xip:FixityValue")
202
202
  fixity_algorithm_ref.text = key
203
203
  fixity_value.text = val
204
204
  else:
@@ -207,17 +207,17 @@ def __make_bitstream__(xip, file_name, full_path, callback, location=None):
207
207
 
208
208
 
209
209
  def __make_representation_multiple_co__(xip, rep_name, rep_type, rep_files, io_ref):
210
- representation = SubElement(xip, 'Representation')
211
- io_link = SubElement(representation, 'InformationObject')
210
+ representation = SubElement(xip, 'xip:Representation')
211
+ io_link = SubElement(representation, 'xip:InformationObject')
212
212
  io_link.text = io_ref
213
- access_name = SubElement(representation, 'Name')
213
+ access_name = SubElement(representation, 'xip:Name')
214
214
  access_name.text = rep_name
215
- access_type = SubElement(representation, 'Type')
215
+ access_type = SubElement(representation, 'xip:Type')
216
216
  access_type.text = rep_type
217
- content_objects = SubElement(representation, 'ContentObjects')
217
+ content_objects = SubElement(representation, 'xip:ContentObjects')
218
218
  refs_dict = {}
219
219
  for f in rep_files:
220
- content_object = SubElement(content_objects, 'ContentObject')
220
+ content_object = SubElement(content_objects, 'xip:ContentObject')
221
221
  content_object_ref = str(uuid.uuid4())
222
222
  content_object.text = content_object_ref
223
223
  refs_dict[content_object_ref] = f
@@ -864,6 +864,8 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
864
864
  'Preservation_Representation_Name' Name of the Preservation Representation
865
865
  'Access_Representation_Name' Name of the Access Representation
866
866
  """
867
+ xml.etree.ElementTree.register_namespace("xip", "http://preservica.com/XIP/v6.0")
868
+
867
869
  # some basic validation
868
870
  if export_folder is None:
869
871
  export_folder = tempfile.gettempdir()
@@ -990,12 +992,12 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
990
992
  for identifier_key, identifier_value in identifier_map.items():
991
993
  if identifier_key:
992
994
  if identifier_value:
993
- identifier = SubElement(xip, 'Identifier')
994
- id_type = SubElement(identifier, "Type")
995
+ identifier = SubElement(xip, 'xip:Identifier')
996
+ id_type = SubElement(identifier, "xip:Type")
995
997
  id_type.text = identifier_key
996
- id_value = SubElement(identifier, "Value")
998
+ id_value = SubElement(identifier, "xip:Value")
997
999
  id_value.text = identifier_value
998
- id_io = SubElement(identifier, "Entity")
1000
+ id_io = SubElement(identifier, "xip:Entity")
999
1001
  id_io.text = io_ref
1000
1002
 
1001
1003
  if 'Asset_Metadata' in kwargs:
@@ -1005,22 +1007,22 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
1005
1007
  if metadata_path and isinstance(metadata_path, str):
1006
1008
  if os.path.exists(metadata_path) and os.path.isfile(metadata_path):
1007
1009
  descriptive_metadata = xml.etree.ElementTree.parse(source=metadata_path)
1008
- metadata = SubElement(xip, 'Metadata', {'schemaUri': metadata_ns})
1009
- metadata_ref = SubElement(metadata, 'Ref')
1010
+ metadata = SubElement(xip, 'xip:Metadata', {'schemaUri': metadata_ns})
1011
+ metadata_ref = SubElement(metadata, 'xip:Ref')
1010
1012
  metadata_ref.text = str(uuid.uuid4())
1011
- entity = SubElement(metadata, 'Entity')
1013
+ entity = SubElement(metadata, 'xip:Entity')
1012
1014
  entity.text = io_ref
1013
- content = SubElement(metadata, 'Content')
1015
+ content = SubElement(metadata, 'xip:Content')
1014
1016
  content.append(descriptive_metadata.getroot())
1015
1017
  elif isinstance(metadata_path, str):
1016
1018
  try:
1017
1019
  descriptive_metadata = xml.etree.ElementTree.fromstring(metadata_path)
1018
- metadata = SubElement(xip, 'Metadata', {'schemaUri': metadata_ns})
1019
- metadata_ref = SubElement(metadata, 'Ref')
1020
+ metadata = SubElement(xip, 'xip:Metadata', {'schemaUri': metadata_ns})
1021
+ metadata_ref = SubElement(metadata, 'xip:Ref')
1020
1022
  metadata_ref.text = str(uuid.uuid4())
1021
- entity = SubElement(metadata, 'Entity')
1023
+ entity = SubElement(metadata, 'xip:Entity')
1022
1024
  entity.text = io_ref
1023
- content = SubElement(metadata, 'Content')
1025
+ content = SubElement(metadata, 'xip:Content')
1024
1026
  content.append(descriptive_metadata)
1025
1027
  except RuntimeError:
1026
1028
  logging.info(f"Could not parse asset metadata in namespace {metadata_ns}")
@@ -1028,12 +1030,12 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
1028
1030
  for path in metadata_path:
1029
1031
  if os.path.exists(path) and os.path.isfile(path):
1030
1032
  descriptive_metadata = xml.etree.ElementTree.parse(source=path)
1031
- metadata = SubElement(xip, 'Metadata', {'schemaUri': metadata_ns})
1032
- metadata_ref = SubElement(metadata, 'Ref')
1033
+ metadata = SubElement(xip, 'xip:Metadata', {'schemaUri': metadata_ns})
1034
+ metadata_ref = SubElement(metadata, 'xip:Ref')
1033
1035
  metadata_ref.text = str(uuid.uuid4())
1034
- entity = SubElement(metadata, 'Entity')
1036
+ entity = SubElement(metadata, 'xip:Entity')
1035
1037
  entity.text = io_ref
1036
- content = SubElement(metadata, 'Content')
1038
+ content = SubElement(metadata, 'xip:Content')
1037
1039
  content.append(descriptive_metadata.getroot())
1038
1040
 
1039
1041
  if xip is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyPreservica
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: Python library for the Preservica API
5
5
  Home-page: https://pypreservica.readthedocs.io/
6
6
  Author: James Carr
@@ -7,6 +7,7 @@ pyPreservica/authorityAPI.py
7
7
  pyPreservica/common.py
8
8
  pyPreservica/contentAPI.py
9
9
  pyPreservica/entityAPI.py
10
+ pyPreservica/mdformsAPI.py
10
11
  pyPreservica/monitorAPI.py
11
12
  pyPreservica/opex.py
12
13
  pyPreservica/parAPI.py
@@ -21,7 +21,7 @@ if sys.argv[-1] == 'publish':
21
21
  # This call to setup() does all the work
22
22
  setup(
23
23
  name=PKG,
24
- version="2.7.0",
24
+ version="2.7.2",
25
25
  description="Python library for the Preservica API",
26
26
  long_description=README,
27
27
  long_description_content_type="text/markdown",
File without changes
File without changes
File without changes