diff --git a/swh/model/hypothesis_strategies.py b/swh/model/hypothesis_strategies.py --- a/swh/model/hypothesis_strategies.py +++ b/swh/model/hypothesis_strategies.py @@ -1,4 +1,4 @@ -# Copyright (C) 2019 The Software Heritage developers +# Copyright (C) 2019-2020 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -15,8 +15,8 @@ from .from_disk import DentryPerms from .model import ( Person, Timestamp, TimestampWithTimezone, Origin, OriginVisit, - Snapshot, SnapshotBranch, TargetType, Release, Revision, - Directory, DirectoryEntry, Content, SkippedContent + OriginVisitUpdate, Snapshot, SnapshotBranch, TargetType, Release, + Revision, Directory, DirectoryEntry, Content, SkippedContent ) from .identifiers import snapshot_identifier, identifier_to_bytes @@ -85,7 +85,22 @@ origin=urls(), status=sampled_from(['ongoing', 'full', 'partial']), type=pgsql_text(), - snapshot=optional(sha1_git())) + snapshot=optional(sha1_git()), + ) + + +def metadata_dicts(): + return dictionaries(pgsql_text(), pgsql_text()) + + +def origin_visit_updates(): + return builds( + OriginVisitUpdate, + visit=integers(0, 1000), + origin=urls(), + status=sampled_from(['ongoing', 'full', 'partial']), + snapshot=optional(sha1_git()), + metadata=one_of(none(), metadata_dicts())) @composite @@ -104,8 +119,7 @@ author=author) -def revision_metadata(): - return dictionaries(pgsql_text(), pgsql_text()) +revision_metadata = metadata_dicts def revisions(): @@ -238,6 +252,7 @@ return one_of( origins().map(lambda x: ('origin', x)), origin_visits().map(lambda x: ('origin_visit', x)), + origin_visit_updates().map(lambda x: ('origin_visit_update', x)), snapshots().map(lambda x: ('snapshot', x)), releases().map(lambda x: ('release', x)), revisions().map(lambda x: ('revision', x)), diff --git a/swh/model/model.py b/swh/model/model.py --- a/swh/model/model.py +++ b/swh/model/model.py @@ -234,6 +234,23 @@ **d) +@attr.s(frozen=True) +class OriginVisitUpdate(BaseModel): + """Represents a visit update of an origin at a given point in time. + + """ + origin = attr.ib(type=str) + visit = attr.ib(type=int) + + date = attr.ib(type=datetime.datetime) + status = attr.ib( + type=str, + validator=attr.validators.in_(['ongoing', 'full', 'partial'])) + snapshot = attr.ib(type=Optional[Sha1Git]) + metadata = attr.ib(type=Optional[Dict[str, object]], + default=None) + + class TargetType(Enum): """The type of content pointed to by a snapshot branch. Usually a revision or an alias.""" 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 @@ -1,4 +1,4 @@ -# Copyright (C) 2019 The Software Heritage developers +# Copyright (C) 2019-2020 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -16,7 +16,9 @@ MissingData, Person ) from swh.model.hashutil import hash_to_bytes, MultiHash -from swh.model.hypothesis_strategies import objects, origins, origin_visits +from swh.model.hypothesis_strategies import ( + objects, origins, origin_visits, origin_visit_updates +) from swh.model.identifiers import ( directory_identifier, revision_identifier, release_identifier, snapshot_identifier @@ -61,6 +63,13 @@ assert origin_visit == type(origin_visit).from_dict(obj) +@given(origin_visit_updates()) +def test_todict_origin_visit_updates(origin_visit_update): + obj = origin_visit_update.to_dict() + + assert origin_visit_update == type(origin_visit_update).from_dict(obj) + + def test_timestampwithtimezone_from_datetime(): tz = datetime.timezone(datetime.timedelta(minutes=+60)) date = datetime.datetime(