Skip to content

Commit a48022e

Browse files
committed
Ensure that an "or later" id can be used #27
* the key change is in rdf.py * also add tests for doc validate() and write_document() for rdf and tag/values * streamline and refine validation code and add several new todo/fixme * bump version Signed-off-by: Philippe Ombredanne <[email protected]>
1 parent 2e299c7 commit a48022e

13 files changed

+635
-114
lines changed

Diff for: setup.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_suite():
1313

1414
setup(
1515
name='spdx-tools',
16-
version='0.5.3',
16+
version='0.5.4',
1717
description='SPDX parser and tools.',
1818
packages=['spdx', 'spdx.parsers', 'spdx.writers', 'spdx.parsers.lexers'],
1919
package_data={'spdx': ['spdx_licenselist.csv']},
@@ -30,6 +30,9 @@ def test_suite():
3030
'spdx-tv2rdf = spdx.tv_to_rdf:main',
3131
],
3232
},
33+
tests_require=[
34+
'xmltodict',
35+
],
3336

3437
author='Ahmed H. Ismail',
3538
author_email='[email protected]',

Diff for: spdx/creationinfo.py

+18-9
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ def __init__(self, name, email):
5454

5555
# FIXME: do not overrride eq and not hash
5656
def __eq__(self, other):
57-
return isinstance(other, Organization) and (self.name, self.email) == (other.name, other.email)
57+
return isinstance(other, Organization) and (self.name, self.email) == (other.name, other.email)
5858

5959
def __lt__(self, other):
60-
return isinstance(other, Organization) and (self.name, self.email) < (other.name, other.email)
60+
return isinstance(other, Organization) and (self.name, self.email) < (other.name, other.email)
6161

6262
def to_value(self):
6363
if self.email:
@@ -84,10 +84,10 @@ def __init__(self, name, email):
8484

8585
# FIXME: do not overrride eq and not hash
8686
def __eq__(self, other):
87-
return isinstance(other, Person) and (self.name, self.email) == (other.name, other.email)
87+
return isinstance(other, Person) and (self.name, self.email) == (other.name, other.email)
8888

8989
def __lt__(self, other):
90-
return isinstance(other, Person) and (self.name, self.email) < (other.name, other.email)
90+
return isinstance(other, Person) and (self.name, self.email) < (other.name, other.email)
9191

9292
def to_value(self):
9393
if self.email is not None:
@@ -152,21 +152,30 @@ def created_iso_format(self):
152152
def has_comment(self):
153153
return self.comment is not None
154154

155-
def validate(self, messages):
155+
def validate(self, messages=None):
156156
"""Returns True if the fields are valid according to the SPDX standard.
157157
Appends user friendly messages to the messages parameter.
158158
"""
159-
return (self.validate_creators(messages) and
160-
self.validate_created(messages))
159+
# FIXME: messages should be returned
160+
messages = messages if messages is not None else []
161+
162+
return (self.validate_creators(messages)
163+
and self.validate_created(messages))
164+
165+
def validate_creators(self, messages=None):
166+
# FIXME: messages should be returned
167+
messages = messages if messages is not None else []
161168

162-
def validate_creators(self, messages):
163169
if len(self.creators) != 0:
164170
return True
165171
else:
166172
messages.append('No creators defined, must have at least one.')
167173
return False
168174

169-
def validate_created(self, messages):
175+
def validate_created(self, messages=None):
176+
# FIXME: messages should be returned
177+
messages = messages if messages is not None else []
178+
170179
if self.created is not None:
171180
return True
172181
else:

Diff for: spdx/document.py

+33-25
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ def add_xref(self, ref):
175175

176176
def validate(self, messages=None):
177177
# FIXME: messages should be returned
178-
if messages is None:
179-
messages = []
178+
messages = messages if messages is not None else []
179+
180180
if self.text is None:
181181
messages.append('ExtractedLicense text can not be None')
182182
return False
@@ -234,18 +234,19 @@ def validate(self, messages=None):
234234
"""
235235
# FIXME: messages should be returned
236236
messages = messages if messages is not None else []
237-
return (
238-
self.validate_version(messages) and
239-
self.validate_data_lics(messages) and
240-
self.validate_creation_info(messages) and
241-
self.validate_package(messages) and
242-
self.validate_extracted_licenses(messages) and
243-
self.validate_reviews(messages)
237+
238+
return (self.validate_version(messages)
239+
and self.validate_data_lics(messages)
240+
and self.validate_creation_info(messages)
241+
and self.validate_package(messages)
242+
and self.validate_extracted_licenses(messages)
243+
and self.validate_reviews(messages)
244244
)
245245

246246
def validate_version(self, messages=None):
247247
# FIXME: messages should be returned
248248
messages = messages if messages is not None else []
249+
249250
if self.version is None:
250251
messages.append('Document has no version.')
251252
return False
@@ -255,27 +256,31 @@ def validate_version(self, messages=None):
255256
def validate_data_lics(self, messages=None):
256257
# FIXME: messages should be returned
257258
messages = messages if messages is not None else []
258-
if self.data_license is not None:
259-
if self.data_license.identifier == 'CC0-1.0':
260-
return True
261-
else:
262-
messages.append('Document data license must be CC0-1.0.')
263-
return False
264-
else:
259+
260+
if self.data_license is None:
265261
messages.append('Document has no data license.')
266262
return False
267263

264+
if self.data_license.identifier == 'CC0-1.0':
265+
return True
266+
else:
267+
# FIXME: REALLY? what if someone wants to use something else?
268+
messages.append('Document data license must be CC0-1.0.')
269+
return False
270+
268271
def validate_reviews(self, messages=None):
269272
# FIXME: messages should be returned
270273
messages = messages if messages is not None else []
271-
status = True
274+
275+
valid = True
272276
for review in self.reviews:
273-
status = status and review.validate(messages)
274-
return status
277+
valid = review.validate(messages) and valid
278+
return valid
275279

276280
def validate_creation_info(self, messages=None):
277281
# FIXME: messages should be returned
278282
messages = messages if messages is not None else []
283+
279284
if self.creation_info is not None:
280285
return self.creation_info.validate(messages)
281286
else:
@@ -285,6 +290,7 @@ def validate_creation_info(self, messages=None):
285290
def validate_package(self, messages=None):
286291
# FIXME: messages should be returned
287292
messages = messages if messages is not None else []
293+
288294
if self.package is not None:
289295
return self.package.validate(messages)
290296
else:
@@ -294,12 +300,14 @@ def validate_package(self, messages=None):
294300
def validate_extracted_licenses(self, messages=None):
295301
# FIXME: messages should be returned
296302
messages = messages if messages is not None else []
297-
status = True
303+
304+
valid = True
298305
for lic in self.extracted_licenses:
299306
if isinstance(lic, ExtractedLicense):
300-
status = status and lic.validate(messages)
307+
valid = lic.validate(messages) and valid
301308
else:
302-
messages.append('Document extracted licenses must be of type' +
303-
'spdx.document.ExtractedLicense')
304-
return False
305-
return status
309+
messages.append(
310+
'Document extracted licenses must be of type '
311+
'spdx.document.ExtractedLicense and not ' + type(lic))
312+
valid = False
313+
return valid

Diff for: spdx/file.py

+32-21
Original file line numberDiff line numberDiff line change
@@ -98,27 +98,31 @@ def validate(self, messages=None):
9898
to messages parameter if there are errors.
9999
"""
100100
# FIXME: messages should be returned
101-
messages = messages if messages is None else []
102-
return (self.validate_lic_conc(messages) and
103-
self.validate_type(messages) and
104-
self.validate_chksum(messages) and
105-
self.validate_licenses_in_file(messages) and
106-
self.validate_copyright(messages) and
107-
self.validate_artifacts(messages))
101+
messages = messages if messages is not None else []
102+
103+
return (self.validate_concluded_license(messages)
104+
and self.validate_type(messages)
105+
and self.validate_chksum(messages)
106+
and self.validate_licenses_in_file(messages)
107+
and self.validate_copyright(messages)
108+
and self.validate_artifacts(messages))
108109

109110
def validate_copyright(self, messages=None):
110111
# FIXME: messages should be returned
111-
messages = messages if messages is None else []
112-
if isinstance(self.copyright, (six.string_types, six.text_type,
113-
utils.NoAssert, utils.SPDXNone)):
112+
messages = messages if messages is not None else []
113+
114+
if isinstance(
115+
self.copyright,
116+
(six.string_types, six.text_type, utils.NoAssert, utils.SPDXNone)):
114117
return True
115118
else:
116119
messages.append('File copyright must be str or unicode or utils.NoAssert or utils.SPDXNone')
117120
return False
118121

119122
def validate_artifacts(self, messages=None):
120123
# FIXME: messages should be returned
121-
messages = messages if messages is None else []
124+
messages = messages if messages is not None else []
125+
122126
if (len(self.artifact_of_project_home) >=
123127
max(len(self.artifact_of_project_uri), len(self.artifact_of_project_name))):
124128
return True
@@ -128,36 +132,43 @@ def validate_artifacts(self, messages=None):
128132

129133
def validate_licenses_in_file(self, messages=None):
130134
# FIXME: messages should be returned
131-
messages = messages if messages is None else []
135+
messages = messages if messages is not None else []
136+
137+
# FIXME: what are we testing the length of a list? or?
132138
if len(self.licenses_in_file) == 0:
133139
messages.append('File must have at least one license in file.')
134140
return False
135141
else:
136142
return True
137143

138-
def validate_lic_conc(self, messages=None):
144+
def validate_concluded_license(self, messages=None):
139145
# FIXME: messages should be returned
140-
messages = messages if messages is None else []
141-
if type(self.conc_lics) in [utils.NoAssert,
142-
utils.SPDXNone] or isinstance(self.conc_lics, document.License):
146+
messages = messages if messages is not None else []
147+
148+
# FIXME: use isinstance instead??
149+
if (type(self.conc_lics) in [utils.NoAssert, utils.SPDXNone]
150+
or isinstance(self.conc_lics, document.License)):
143151
return True
144152
else:
145-
messages.append('File concluded license must be one of document.License, utils.NoAssert or utils.SPDXNone')
153+
messages.append(
154+
'File concluded license must be one of '
155+
'document.License, utils.NoAssert or utils.SPDXNone')
146156
return False
147157

148158
def validate_type(self, messages=None):
149159
# FIXME: messages should be returned
150-
messages = messages if messages is None else []
151-
if self.type in [None, FileType.SOURCE, FileType.OTHER, FileType.BINARY,
152-
FileType.ARCHIVE]:
160+
messages = messages if messages is not None else []
161+
162+
if self.type in [None, FileType.SOURCE, FileType.OTHER, FileType.BINARY, FileType.ARCHIVE]:
153163
return True
154164
else:
155165
messages.append('File type must be one of the constants defined in class spdx.file.FileType')
156166
return False
157167

158168
def validate_chksum(self, messages=None):
159169
# FIXME: messages should be returned
160-
messages = messages if messages is None else []
170+
messages = messages if messages is not None else []
171+
161172
if isinstance(self.chk_sum, checksum.Algorithm):
162173
if self.chk_sum.identifier == 'SHA1':
163174
return True

0 commit comments

Comments
 (0)