Skip to content

Commit aa99abf

Browse files
Merge pull request #62 from quantori/add-report
Add report
2 parents 6e44fe1 + bd78634 commit aa99abf

39 files changed

+257
-107
lines changed

src/signals_notebook/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class PatchedModel(BaseModel):
1212
https://github.com/samuelcolvin/pydantic/issues/1577
1313
Adds ability to use properties with setters
1414
"""
15+
1516
@no_type_check
1617
def __setattr__(self, name, value):
1718
try:

src/signals_notebook/entities/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from signals_notebook.entities.image import Image # noqa
1010
from signals_notebook.entities.word import Word # noqa
1111
from signals_notebook.entities.excel import Excel # noqa
12-
from signals_notebook.entities.biological_sequence import BiologicalSequence # noqa
12+
from signals_notebook.entities.biological_sequence import BiologicalSequence # noqa
1313
from signals_notebook.entities.samples.sample import Sample, SampleCell # noqa
1414
from signals_notebook.entities.samples.samples_container import SamplesContainer # noqa
1515
from signals_notebook.entities.todo_list.task import Task, TaskCell # noqa

src/signals_notebook/entities/admin_defined_object.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
import logging
33
from functools import cached_property
4-
from typing import ClassVar, Literal, Optional
4+
from typing import ClassVar, Literal, Optional, Tuple
55

66
from pydantic import BaseModel, Field
77

@@ -135,12 +135,13 @@ def get_html(self) -> str:
135135

136136
return template.render(data=data)
137137

138-
def dump(self, base_path: str, fs_handler: FSHandler) -> None: # type: ignore[override]
138+
def dump(self, base_path: str, fs_handler: FSHandler, alias: Optional[Tuple[str]] = None) -> None: # type: ignore[override]
139139
"""Dump AdminDefinedObject entity
140140
141141
Args:
142142
base_path: content path where create dump
143143
fs_handler: FSHandler
144+
alias: Backup alias
144145
145146
Returns:
146147
@@ -152,6 +153,13 @@ def dump(self, base_path: str, fs_handler: FSHandler) -> None: # type: ignore[o
152153
fs_handler.write(
153154
fs_handler.join_path(base_path, self.eid, 'metadata.json'),
154155
json.dumps(metadata),
156+
alias
157+
+ (
158+
self.name,
159+
'__Metadata',
160+
)
161+
if alias
162+
else None,
155163
)
156164
for child in self.get_children():
157165
child.dump(fs_handler.join_path(base_path, self.eid), fs_handler)

src/signals_notebook/entities/chemical_drawing.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33
from enum import Enum
44
from functools import cached_property
5-
from typing import cast, ClassVar, Literal, Optional, Union
5+
from typing import cast, ClassVar, Literal, Optional, Union, Tuple
66

77
from pydantic import BaseModel, Field
88

@@ -246,16 +246,21 @@ def dump_templates(cls, base_path: str, fs_handler: FSHandler) -> None:
246246
)
247247
try:
248248
for template in templates:
249-
template.dump(fs_handler.join_path(base_path, 'templates', entity_type), fs_handler)
249+
template.dump(
250+
fs_handler.join_path(base_path, 'templates', entity_type),
251+
fs_handler,
252+
('Templates', entity_type.value),
253+
)
250254
except TypeError:
251255
pass
252256

253-
def dump(self, base_path: str, fs_handler: FSHandler) -> None:
257+
def dump(self, base_path: str, fs_handler: FSHandler, alias: Optional[Tuple[str]] = None) -> None:
254258
"""Dump ChemicalDrawing
255259
256260
Args:
257261
base_path: content path where create dump
258262
fs_handler: FSHandler
263+
alias: Backup alias
259264
260265
Returns:
261266
@@ -281,7 +286,14 @@ def dump(self, base_path: str, fs_handler: FSHandler) -> None:
281286
},
282287
}
283288

284-
fs_handler.write(fs_handler.join_path(base_path, self.eid, 'metadata.json'), json.dumps(metadata))
289+
fs_handler.write(
290+
fs_handler.join_path(base_path, self.eid, 'metadata.json'),
291+
json.dumps(metadata),
292+
alias + (self.name, '__Metadata') if alias else None
293+
)
285294
file_name = content.name
286295
data = content.content
287-
fs_handler.write(fs_handler.join_path(base_path, self.eid, file_name), data)
296+
fs_handler.write(fs_handler.join_path(
297+
base_path, self.eid, file_name), data,
298+
alias + (self.name, file_name) if alias else None
299+
)

src/signals_notebook/entities/container.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import logging
44
import mimetypes
55
import os
6-
from typing import cast, Generator, Optional, Union
6+
from typing import cast, Generator, Optional, Union, Tuple
77

88
from signals_notebook.api import SignalsNotebookApi
99
from signals_notebook.common_types import EntityType, Response, ResponseData
@@ -92,13 +92,21 @@ def get_children(self, order: Optional[str] = None) -> Generator[Entity, None, N
9292
result = Response[Union[entity_classes]](**response.json()) # type: ignore
9393
yield from [cast(ResponseData, item).body for item in result.data]
9494

95-
def dump(self, base_path: str, fs_handler: FSHandler) -> None: # type: ignore[override]
95+
def dump(self, base_path: str, fs_handler: FSHandler, alias: Optional[Tuple[str]] = None) -> None:
96+
metadata = {k: v for k, v in self.dict().items() if k in ('name', 'description', 'eid')}
9697
fs_handler.write(
9798
fs_handler.join_path(base_path, self.eid, 'metadata.json'),
98-
json.dumps({k: v for k, v in self.dict().items() if k in ('name', 'description', 'eid')}),
99+
json.dumps(metadata),
100+
alias
101+
+ (
102+
self.name,
103+
'__Metadata',
104+
)
105+
if alias
106+
else None,
99107
)
100108
for child in self.get_children():
101-
child.dump(fs_handler.join_path(base_path, self.eid), fs_handler)
109+
child.dump(fs_handler.join_path(base_path, self.eid), fs_handler, alias + (self.name,) if alias else None)
102110

103111
@classmethod
104112
def dump_templates(cls, base_path: str, fs_handler: FSHandler) -> None:
@@ -120,6 +128,14 @@ def dump_templates(cls, base_path: str, fs_handler: FSHandler) -> None:
120128
)
121129
try:
122130
for template in templates:
123-
template.dump(fs_handler.join_path(base_path, 'templates', entity_type), fs_handler)
131+
template.dump(
132+
fs_handler.join_path(base_path, 'templates', entity_type),
133+
fs_handler,
134+
(
135+
'Templates',
136+
entity_type.value,
137+
),
138+
)
139+
124140
except TypeError:
125141
pass

src/signals_notebook/entities/contentful_entity.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import json
44
import logging
55
from enum import Enum
6-
from typing import Optional
6+
from typing import Optional, Tuple
77

88
from signals_notebook.api import SignalsNotebookApi
99
from signals_notebook.common_types import EntityType, File
@@ -76,12 +76,13 @@ def get_html(self) -> str:
7676

7777
return template.render(data=data)
7878

79-
def dump(self, base_path: str, fs_handler: FSHandler) -> None: # type: ignore[override]
79+
def dump(self, base_path: str, fs_handler: FSHandler, alias: Optional[Tuple[str]] = None) -> None:
8080
"""Dump ContentfulEntity entity
8181
8282
Args:
8383
base_path: content path where create dump
8484
fs_handler: FSHandler
85+
alias: Backup alias
8586
8687
Returns:
8788
@@ -92,10 +93,30 @@ def dump(self, base_path: str, fs_handler: FSHandler) -> None: # type: ignore[o
9293
'content_type': content.content_type,
9394
**{k: v for k, v in self.dict().items() if k in ('name', 'description', 'eid')},
9495
}
95-
fs_handler.write(fs_handler.join_path(base_path, self.eid, 'metadata.json'), json.dumps(metadata))
96+
fs_handler.write(
97+
fs_handler.join_path(base_path, self.eid, 'metadata.json'),
98+
json.dumps(metadata),
99+
alias
100+
+ (
101+
self.name,
102+
'__Metadata',
103+
)
104+
if alias
105+
else None,
106+
)
96107
file_name = content.name
97108
data = content.content
98-
fs_handler.write(fs_handler.join_path(base_path, self.eid, file_name), data)
109+
fs_handler.write(
110+
fs_handler.join_path(base_path, self.eid, file_name),
111+
data,
112+
alias
113+
+ (
114+
self.name,
115+
file_name,
116+
)
117+
if alias
118+
else None,
119+
)
99120

100121
@classmethod
101122
def load(cls, path: str, fs_handler: FSHandler, parent: Container) -> None: # type: ignore[override]

src/signals_notebook/entities/entity.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ def dump_templates(cls, base_path: str, fs_handler: FSHandler) -> None:
332332
fs_handler.write(
333333
fs_handler.join_path(base_path, 'templates', entity_type, f'metadata_{template.name}.json'),
334334
json.dumps({k: v for k, v in template.dict().items() if k in ('name', 'description', 'eid')}),
335+
('Templates', entity_type, template.name),
335336
)
337+
336338
except TypeError:
337339
pass

src/signals_notebook/entities/entity_store.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,7 @@ def dump_templates(cls, base_path: str, fs_handler: FSHandler) -> None:
172172
"""
173173

174174
for item in Entity.get_subclasses():
175-
item.dump_templates(base_path, fs_handler)
175+
try:
176+
item.dump_templates(base_path, fs_handler)
177+
except Exception as e:
178+
log.error('Failed to dump templates for %s with error %s' % (str(item), str(e)))

src/signals_notebook/entities/experiment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def create(
106106

107107
@cached_property
108108
def stoichiometry(self) -> Union[Stoichiometry, list[Stoichiometry]]:
109-
""" Fetch stoichiometry data of experiment
109+
"""Fetch stoichiometry data of experiment
110110
111111
Returns:
112112
Stoichiometry object or list of Stoichiometry objects

src/signals_notebook/entities/notebook.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import json
22
import logging
3-
from typing import Literal, Optional
3+
from typing import Literal, Optional, Tuple
44

55
from pydantic import BaseModel, Field
66

@@ -70,16 +70,17 @@ def create(
7070
request=request,
7171
)
7272

73-
def dump(self, base_path: str, fs_handler: FSHandler) -> None: # type: ignore[override]
73+
def dump(self, base_path: str, fs_handler: FSHandler, alias: Optional[Tuple[str]]) -> None:
7474
fs_handler.write(
7575
fs_handler.join_path(base_path, self.eid, 'metadata.json'),
7676
json.dumps({k: v for k, v in self.dict().items() if k in ('name', 'description', 'eid')}),
77+
alias + (self.name, '__Metadata') if alias else None,
7778
)
78-
for child in self.get_children():
79-
child.dump(base_path + '/' + self.eid, fs_handler)
79+
for child in self.get_children(order=None):
80+
child.dump(base_path + '/' + self.eid, fs_handler, alias + (self.name,) if alias else None)
8081

8182
@classmethod
82-
def load(cls, path: str, fs_handler: FSHandler) -> None: # type: ignore[override]
83+
def load(cls, path: str, fs_handler: FSHandler) -> None:
8384
from signals_notebook.item_mapper import ItemMapper
8485

8586
metadata = json.loads(fs_handler.read(fs_handler.join_path(path, 'metadata.json')))

0 commit comments

Comments
 (0)