Skip to content

Commit 0601013

Browse files
authored
Project adjustments (#190)
* minor adjustments * fix to create * slight renaming * set created when project is loaded * pr response * ruff * change test comparing files * test file changes
1 parent 14d172f commit 0601013

File tree

2 files changed

+123
-54
lines changed

2 files changed

+123
-54
lines changed

src/easyreflectometry/project.py

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
class Project:
2323
def __init__(self):
2424
self._info = self._default_info()
25-
self._path = Path(os.path.expanduser('~'))
25+
self._path_project_parent = Path(os.path.expanduser('~'))
2626
self._models = ModelCollection(populate_if_none=False, unique_name='project_models')
2727
self._materials = MaterialCollection(populate_if_none=False, unique_name='project_materials')
2828
self._calculator = None
@@ -32,8 +32,8 @@ def __init__(self):
3232
self._report = None
3333

3434
# Project flags
35-
self._project_created = False
36-
self._project_with_experiments = False
35+
self._created = False
36+
self._with_experiments = False
3737

3838
def reset(self):
3939
del self._models
@@ -44,24 +44,27 @@ def reset(self):
4444
self._materials = MaterialCollection(populate_if_none=False, unique_name='project_materials')
4545

4646
self._info = self._default_info()
47-
self._path = Path(os.path.expanduser('~'))
47+
self._path_project_parent = Path(os.path.expanduser('~'))
4848
self._calculator = None
4949
self._minimizer = None
5050
self._experiments = None
5151
self._colors = None
5252
self._report = None
5353

5454
# Project flags
55-
self._project_created = False
56-
self._project_with_experiments = False
55+
self._created = False
56+
self._with_experiments = False
57+
58+
@property
59+
def created(self) -> bool:
60+
return self._created
5761

5862
@property
5963
def path(self):
60-
return self._path
64+
return self._path_project_parent / self._info['name']
6165

62-
@path.setter
63-
def path(self, path: Union[Path, str]):
64-
self._path = Path(path)
66+
def set_path_project_parent(self, path: Union[Path, str]):
67+
self._path_project_parent = Path(path)
6568

6669
@property
6770
def models(self) -> ModelCollection:
@@ -90,7 +93,7 @@ def experiments(self, experiments: List[DataSet1D]) -> None:
9093

9194
@property
9295
def path_json(self):
93-
return self._path / 'project.json'
96+
return self.path / 'project.json'
9497

9598
def default_model(self):
9699
self._replace_collection(MaterialCollection(), self._materials)
@@ -132,26 +135,28 @@ def _default_info(self):
132135
modified=datetime.datetime.now().strftime('%d.%m.%Y %H:%M'),
133136
)
134137

135-
def create_project_dir(self):
136-
if not os.path.exists(self._path):
137-
os.makedirs(self._path)
138-
os.makedirs(self._path / 'experiments')
138+
def create(self):
139+
if not os.path.exists(self.path):
140+
os.makedirs(self.path)
141+
os.makedirs(self.path / 'experiments')
142+
self._created = True
143+
self._timestamp_modification()
139144
else:
140-
print(f'ERROR: Directory {self._path} already exists')
145+
print(f'ERROR: Directory {self.path} already exists')
141146

142-
def save_project_json(self, overwrite=False):
143-
if self.path_json.exists() and not overwrite:
147+
def save_as_json(self, overwrite=False):
148+
if self.path_json.exists() and overwrite:
144149
print(f'File already exists {self.path_json}. Overwriting...')
145150
self.path_json.unlink()
146151
try:
147152
project_json = json.dumps(self.as_dict(include_materials_not_in_model=True), indent=4)
148153
self.path_json.parent.mkdir(exist_ok=True, parents=True)
149-
with open(self.path_json, 'w') as file:
154+
with open(self.path_json, mode='x') as file:
150155
file.write(project_json)
151156
except Exception as exception:
152157
print(exception)
153158

154-
def load_project_json(self, path: Optional[Union[Path, str]] = None):
159+
def load_from_json(self, path: Optional[Union[Path, str]] = None):
155160
path = Path(path)
156161
if path is None:
157162
path = self.path_json
@@ -160,20 +165,20 @@ def load_project_json(self, path: Optional[Union[Path, str]] = None):
160165
project_dict = json.load(file)
161166
self.reset()
162167
self.from_dict(project_dict)
163-
self._path = path.parent
168+
self._path_project_parent = path.parents[1]
169+
self._created = True
164170
else:
165171
print(f'ERROR: File {path} does not exist')
166172

167173
def as_dict(self, include_materials_not_in_model=False):
168174
project_dict = {}
169175
project_dict['info'] = self._info
170-
project_dict['project_with_experiments'] = self._project_with_experiments
171-
project_dict['project_created'] = self._project_created
176+
project_dict['with_experiments'] = self._with_experiments
172177
if self._models is not None:
173178
project_dict['models'] = self._models.as_dict(skip=['interface'])
174179
if include_materials_not_in_model:
175180
self._as_dict_add_materials_not_in_model_dict(project_dict)
176-
if self._project_with_experiments:
181+
if self._with_experiments:
177182
self._as_dict_add_experiments(project_dict)
178183
if self._minimizer is not None:
179184
project_dict['minimizer'] = self._minimizer.name
@@ -206,7 +211,7 @@ def _as_dict_add_experiments(self, project_dict: dict):
206211
def from_dict(self, project_dict: dict):
207212
keys = list(project_dict.keys())
208213
self._info = project_dict['info']
209-
self._project_with_experiments = project_dict['project_with_experiments']
214+
self._with_experiments = project_dict['with_experiments']
210215
if 'models' in keys:
211216
self._models = None
212217
self._models = ModelCollection.from_dict(project_dict['models'])
@@ -259,3 +264,6 @@ def _replace_collection(self, src_collection: BaseCollection, dst_collection: Ba
259264

260265
for element in src_collection:
261266
dst_collection.append(element)
267+
268+
def _timestamp_modification(self):
269+
self._info['modified'] = datetime.datetime.now().strftime('%d.%m.%Y %H:%M')

tests/test_project.py

Lines changed: 90 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ def test_constructor(self):
2525
'experiments': 'None',
2626
'modified': datetime.datetime.now().strftime('%d.%m.%Y %H:%M'),
2727
}
28-
assert project._path == Path(os.path.expanduser('~'))
28+
assert project._path_project_parent == Path(os.path.expanduser('~'))
2929
assert len(project._materials) == 0
3030
assert len(project._models) == 0
3131
assert project._calculator is None
3232
assert project._minimizer is None
3333
assert project._experiments is None
3434
assert project._report is None
35-
assert project._project_created is False
36-
assert project._project_with_experiments is False
35+
assert project._created is False
36+
assert project._with_experiments is False
3737

3838
def test_reset(self):
3939
# When
@@ -45,9 +45,9 @@ def test_reset(self):
4545
project._minimizer = 'minimizer'
4646
project._experiments = 'experiments'
4747
project._report = 'report'
48-
project._project_created = True
49-
project._project_with_experiments = True
50-
project._path = 'project_path'
48+
project._created = True
49+
project._with_experiments = True
50+
project._path_project_parent = 'project_path'
5151

5252
# Then
5353
project.reset()
@@ -65,13 +65,13 @@ def test_reset(self):
6565
assert project._materials.unique_name == 'project_materials'
6666
assert len(project._materials) == 0
6767

68-
assert project._path == Path(os.path.expanduser('~'))
68+
assert project._path_project_parent == Path(os.path.expanduser('~'))
6969
assert project._calculator is None
7070
assert project._minimizer is None
7171
assert project._experiments is None
7272
assert project._report is None
73-
assert project._project_created is False
74-
assert project._project_with_experiments is False
73+
assert project._created is False
74+
assert project._with_experiments is False
7575
assert global_object.map.vertices() == ['project_models', 'project_materials']
7676

7777
def test_models(self):
@@ -132,10 +132,10 @@ def test_experiments(self):
132132
def test_path_json(self, tmp_path):
133133
# When
134134
project = Project()
135-
project.path = tmp_path
135+
project.set_path_project_parent(tmp_path)
136136

137137
# Then Expect
138-
assert project.path_json == Path(tmp_path) / 'project.json'
138+
assert project.path_json == Path(tmp_path) / 'Example Project' / 'project.json'
139139

140140
def test_add_material(self):
141141
# When
@@ -203,8 +203,7 @@ def test_as_dict(self):
203203
assert keys == [
204204
'info',
205205
'models',
206-
'project_created',
207-
'project_with_experiments',
206+
'with_experiments',
208207
]
209208
assert project_dict['info'] == {
210209
'name': 'Example Project',
@@ -214,8 +213,7 @@ def test_as_dict(self):
214213
'modified': datetime.datetime.now().strftime('%d.%m.%Y %H:%M'),
215214
}
216215
assert project_dict['models']['data'] == []
217-
assert project_dict['project_created'] is False
218-
assert project_dict['project_with_experiments'] is False
216+
assert project_dict['with_experiments'] is False
219217

220218
def test_as_dict_models(self):
221219
# When
@@ -315,41 +313,104 @@ def test_dict_round_trip(self):
315313
assert project_dict[key] == new_project_dict[key]
316314
assert project_materials_dict == new_project_materials_dict
317315

318-
def test_save_project(self, tmp_path):
316+
def test_save_as_json(self, tmp_path):
319317
# When
320318
global_object.map._clear()
321319
project = Project()
322-
project.path = tmp_path
320+
project.set_path_project_parent(tmp_path)
323321
project._models.append(Model())
324322
project._info['name'] = 'Test Project'
325-
project.save_project_json(overwrite=True)
326323

327324
# Then
328-
project_path = project.path_json
325+
project.save_as_json()
326+
project.path_json
329327

330328
# Expect
331-
assert project_path.exists()
329+
assert project.path_json.exists()
332330

333-
def test_load_project(self, tmp_path):
331+
def test_save_as_json_overwrite(self, tmp_path):
334332
# When
335333
global_object.map._clear()
336334
project = Project()
337-
project.path = tmp_path
335+
project.set_path_project_parent(tmp_path)
336+
project.save_as_json()
337+
file_info = project.path_json.stat()
338+
339+
# Then
340+
project._info['short_description'] = 'short_description'
338341
project._models.append(Model())
339-
project._info['name'] = 'Test Project'
340-
project.save_project_json()
342+
project.save_as_json(overwrite=True)
343+
344+
# Expect
345+
assert str(file_info) != str(project.path_json.stat())
346+
347+
def test_save_as_json_dont_overwrite(self, tmp_path):
348+
# When
349+
global_object.map._clear()
350+
project = Project()
351+
project.set_path_project_parent(tmp_path)
352+
project.save_as_json()
353+
file_info = project.path_json.stat()
354+
355+
# Then
356+
project._info['short_description'] = 'short_description'
357+
project._models.append(Model())
358+
project.save_as_json()
359+
360+
# Expect
361+
assert str(file_info) == str(project.path_json.stat())
362+
363+
def test_load_from_json(self, tmp_path):
364+
# When
365+
global_object.map._clear()
366+
project = Project()
367+
project.set_path_project_parent(tmp_path)
368+
project._models.append(Model())
369+
project._info['name'] = 'name'
370+
project._info['short_description'] = 'short_description'
371+
project._info['samples'] = 'samples'
372+
project._info['experiments'] = 'experiments'
373+
374+
project.save_as_json()
341375
project_dict = project.as_dict()
342376

343377
global_object.map._clear()
344378
new_project = Project()
345379

346380
# Then
347-
new_project.load_project_json(tmp_path / 'project.json')
381+
new_project.load_from_json(tmp_path / 'name' / 'project.json')
348382
# Do it twice to ensure that potential global objects don't collide
349-
new_project.load_project_json(tmp_path / 'project.json')
383+
new_project.load_from_json(tmp_path / 'name' / 'project.json')
350384

351385
# Expect
352386
assert len(new_project._models) == 1
353-
assert new_project._info['name'] == 'Test Project'
354-
assert new_project.as_dict() == project_dict
355-
assert new_project.path == tmp_path
387+
assert new_project._info['name'] == 'name'
388+
assert new_project._info['short_description'] == 'short_description'
389+
assert new_project._info['samples'] == 'samples'
390+
assert new_project._info['experiments'] == 'experiments'
391+
assert project_dict == new_project.as_dict()
392+
assert new_project._path_project_parent == tmp_path
393+
assert new_project.created is True
394+
395+
def test_create(self, tmp_path):
396+
# When
397+
project = Project()
398+
project.set_path_project_parent(tmp_path)
399+
project._info['modified'] = 'modified'
400+
project._info['name'] = 'Test Project'
401+
402+
# Then
403+
project.create()
404+
405+
# Expect
406+
assert project.path == tmp_path / 'Test Project'
407+
assert project.path.exists()
408+
assert (project.path / 'experiments').exists()
409+
assert project.created is True
410+
assert project._info == {
411+
'name': 'Test Project',
412+
'short_description': 'reflectometry, 1D',
413+
'samples': 'None',
414+
'experiments': 'None',
415+
'modified': datetime.datetime.now().strftime('%d.%m.%Y %H:%M'),
416+
}

0 commit comments

Comments
 (0)