Changeset View
Changeset View
Standalone View
Standalone View
swh/model/hypothesis_strategies.py
Show First 20 Lines • Show All 174 Lines • ▼ Show 20 Lines | def branch_targets(*, only_objects=False): | ||||
else: | else: | ||||
return one_of(branch_targets_alias(), branch_targets_object()) | return one_of(branch_targets_alias(), branch_targets_object()) | ||||
@composite | @composite | ||||
def snapshots(draw, *, min_size=0, max_size=100, only_objects=False): | def snapshots(draw, *, min_size=0, max_size=100, only_objects=False): | ||||
branches = draw(dictionaries( | branches = draw(dictionaries( | ||||
keys=branch_names(), | keys=branch_names(), | ||||
values=branch_targets(only_objects=only_objects), | values=one_of( | ||||
none(), | |||||
branch_targets(only_objects=only_objects) | |||||
), | |||||
min_size=min_size, | min_size=min_size, | ||||
max_size=max_size, | max_size=max_size, | ||||
)) | )) | ||||
if not only_objects: | if not only_objects: | ||||
# Make sure aliases point to actual branches | # Make sure aliases point to actual branches | ||||
unresolved_aliases = { | unresolved_aliases = { | ||||
target.target | target.target | ||||
for target in branches.values() | for target in branches.values() | ||||
if (target | if (target | ||||
and target.target_type == 'alias' | and target.target_type == 'alias' | ||||
and target.target not in branches) | and target.target not in branches) | ||||
} | } | ||||
for alias in unresolved_aliases: | for alias in unresolved_aliases: | ||||
branches[alias] = draw(branch_targets(only_objects=True)) | branches[alias] = draw(branch_targets(only_objects=True)) | ||||
while True: | while True: | ||||
try: | try: | ||||
id_ = snapshot_identifier({ | id_ = snapshot_identifier({ | ||||
'branches': { | 'branches': { | ||||
name: branch.to_dict() | name: branch.to_dict() if branch else None | ||||
for (name, branch) in branches.items()}}) | for (name, branch) in branches.items()}}) | ||||
except ValueError as e: | except ValueError as e: | ||||
for (source, target) in e.args[1]: | for (source, target) in e.args[1]: | ||||
branches[source] = draw(branch_targets(only_objects=True)) | branches[source] = draw(branch_targets(only_objects=True)) | ||||
else: | else: | ||||
break | break | ||||
return Snapshot( | return Snapshot( | ||||
id=identifier_to_bytes(id_), | id=identifier_to_bytes(id_), | ||||
Show All 17 Lines |