Skip to content

Commit 1cf1cf0

Browse files
committed
Unfreeze core objects.
Update the two places we mutate state to mutate the object. Manually made Workspace hashable, for convenience in tests, but also it is just one bit of immutable data.
1 parent ed33dbd commit 1cf1cf0

File tree

3 files changed

+15
-23
lines changed

3 files changed

+15
-23
lines changed

airlock/api.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def get_url_for_path(self):
4444
raise NotImplementedError()
4545

4646

47-
@dataclass(frozen=True)
47+
@dataclass
4848
class Workspace(AirlockContainer):
4949
"""Simple wrapper around a workspace directory on disk.
5050
@@ -89,6 +89,9 @@ def abspath(self, relpath):
8989

9090
return path
9191

92+
def __hash__(self):
93+
return hash(self.name)
94+
9295

9396
@dataclass(frozen=True)
9497
class RequestFile:
@@ -109,7 +112,7 @@ class FileGroup:
109112
files: list[RequestFile]
110113

111114

112-
@dataclass(frozen=True)
115+
@dataclass
113116
class ReleaseRequest(AirlockContainer):
114117
"""Represents a release request made by a user.
115118
@@ -316,30 +319,22 @@ def set_status(
316319

317320
# validate first
318321
self.check_status(release_request, to_status, user)
319-
320-
# Ensure the state of this object is updated to reflect the change in status
321-
# This is deliberately bypassing the frozen aspect of the class to keep
322-
# things consistent. It does change the hash.
323-
release_request.__dict__["status"] = to_status
322+
release_request.status = to_status
324323

325324
def add_file_to_request(
326325
self,
327326
release_request: ReleaseRequest,
328327
relpath: Path,
329328
user: User,
330329
group_name: Optional[str] = "default",
331-
) -> ReleaseRequest:
330+
):
332331
"""Add a file to a request.
333332
334333
Subclasses should do what they need to create the filegroup and
335334
record the file metadata as needed and THEN
336335
call super().add_file_to_request(...) to do the
337336
copying. If the copying fails (e.g. due to permission errors raised
338337
below), the subclasses should roll back any changes.
339-
340-
After calling add_file_to_request, the current release_request's
341-
filegroups will be out of date. Subclasses should return a new
342-
ReleaseRequest to ensure filegroups are current.
343338
"""
344339
if user.username != release_request.author:
345340
raise self.RequestPermissionDenied(

local_db/api.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def add_file_to_request(
135135
relpath: Path,
136136
user: User,
137137
group_name: Optional[str] = "default",
138-
) -> ReleaseRequest:
138+
):
139139
with transaction.atomic():
140140
# Get/create the FileGroupMetadata if it doesn't already exist
141141
filegroupmetadata = self._get_or_create_filegroupmetadata(
@@ -163,5 +163,6 @@ def add_file_to_request(
163163
# state that allows adding files.
164164
super().add_file_to_request(release_request, relpath, user, group_name)
165165

166-
# return a new request object with the updated groups
167-
return self._request(self._find_metadata(release_request.id))
166+
# update instance
167+
metadata = self._find_metadata(release_request.id)
168+
release_request.filegroups = self._get_filegroups(metadata)

tests/unit/test_api.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ def test_release_request_filegroups_with_no_files(api):
294294
def test_release_request_filegroups_default_filegroup(api):
295295
release_request, path, author = setup_empty_release_request()
296296
assert release_request.filegroups == {}
297-
release_request = api.add_file_to_request(release_request, path, author)
297+
api.add_file_to_request(release_request, path, author)
298298
assert len(release_request.filegroups) == 1
299299
filegroup = release_request.filegroups["default"]
300300
assert filegroup.name == "default"
@@ -305,9 +305,7 @@ def test_release_request_filegroups_default_filegroup(api):
305305
def test_release_request_filegroups_named_filegroup(api):
306306
release_request, path, author = setup_empty_release_request()
307307
assert release_request.filegroups == {}
308-
release_request = api.add_file_to_request(
309-
release_request, path, author, "test_group"
310-
)
308+
api.add_file_to_request(release_request, path, author, "test_group")
311309
assert len(release_request.filegroups) == 1
312310
filegroup = release_request.filegroups["test_group"]
313311
assert filegroup.name == "test_group"
@@ -317,9 +315,7 @@ def test_release_request_filegroups_named_filegroup(api):
317315

318316
def test_release_request_filegroups_multiple_filegroups(api):
319317
release_request, path, author = setup_empty_release_request()
320-
release_request = api.add_file_to_request(
321-
release_request, path, author, "test_group"
322-
)
318+
api.add_file_to_request(release_request, path, author, "test_group")
323319
assert len(release_request.filegroups) == 1
324320

325321
workspace = api.get_workspace("workspace")
@@ -347,7 +343,7 @@ def test_release_request_filegroups_multiple_filegroups(api):
347343
def test_release_request_add_same_file(api):
348344
release_request, path, author = setup_empty_release_request()
349345
assert release_request.filegroups == {}
350-
release_request = api.add_file_to_request(release_request, path, author)
346+
api.add_file_to_request(release_request, path, author)
351347
assert len(release_request.filegroups) == 1
352348
assert len(release_request.filegroups["default"].files) == 1
353349

0 commit comments

Comments
 (0)