diff --git a/swh/model/model.py b/swh/model/model.py --- a/swh/model/model.py +++ b/swh/model/model.py @@ -681,7 +681,7 @@ default=None) origin = attr.ib( - type=Optional[Origin], + type=Optional[str], validator=type_validator(), default=None) @@ -727,8 +727,7 @@ @classmethod def from_dict(cls, d): - d2 = d - d = d.copy() - if d.pop('data', None) is not None: - raise ValueError('SkippedContent has no "data" attribute %r' % d2) - return super().from_dict(d, use_subclass=False) + d2 = d.copy() + if d2.pop('data', None) is not None: + raise ValueError('SkippedContent has no "data" attribute %r' % d) + return super().from_dict(d2, use_subclass=False) diff --git a/swh/model/tests/test_model.py b/swh/model/tests/test_model.py --- a/swh/model/tests/test_model.py +++ b/swh/model/tests/test_model.py @@ -14,15 +14,15 @@ from swh.model.model import ( Content, SkippedContent, Directory, Revision, Release, Snapshot, - Timestamp, TimestampWithTimezone, + Origin, Timestamp, TimestampWithTimezone, MissingData, Person ) from swh.model.hashutil import hash_to_bytes, MultiHash from swh.model.hypothesis_strategies import ( - objects, origins, origin_visits, origin_visit_updates, timestamps + objects, origins, origin_visits, origin_visit_updates, + skipped_contents_d, timestamps ) - from swh.model.identifiers import ( directory_identifier, revision_identifier, release_identifier, snapshot_identifier @@ -386,6 +386,20 @@ assert getattr(c, key) == value +@given(skipped_contents_d()) +def test_skipped_content_origin_is_str(skipped_content_d): + assert SkippedContent.from_dict(skipped_content_d) + + skipped_content_d['origin'] = 'http://path/to/origin' + assert SkippedContent.from_dict(skipped_content_d) + + skipped_content_d['origin'] = Origin(url='http://path/to/origin') + with pytest.raises(ValueError, match='origin'): + SkippedContent.from_dict(skipped_content_d) + + +# ID computation + def test_directory_model_id_computation(): dir_dict = directory_example.copy() del dir_dict['id']