samplekit 0.1.2__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {samplekit-0.1.2/samplekit.egg-info → samplekit-0.2.0}/PKG-INFO +7 -6
- {samplekit-0.1.2 → samplekit-0.2.0}/README.md +6 -5
- {samplekit-0.1.2 → samplekit-0.2.0}/pyproject.toml +1 -1
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit/__init__.py +1 -1
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit/sample.py +36 -26
- {samplekit-0.1.2 → samplekit-0.2.0/samplekit.egg-info}/PKG-INFO +7 -6
- {samplekit-0.1.2 → samplekit-0.2.0}/LICENSE +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit/converters.py +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit/property.py +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit/report.py +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit/sample_list.py +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit/table.py +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit.egg-info/SOURCES.txt +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit.egg-info/dependency_links.txt +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit.egg-info/requires.txt +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/samplekit.egg-info/top_level.txt +0 -0
- {samplekit-0.1.2 → samplekit-0.2.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: samplekit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Lightweight Python framework for documenting scientific samples with bidirectional Markdown I/O
|
|
5
5
|
Author-email: zelyph <github@zelyph.fr>
|
|
6
6
|
License: MIT
|
|
@@ -119,8 +119,8 @@ from samplekit import Sample, Property, Table, Column, report
|
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
class Experiment(Sample):
|
|
122
|
-
def __init__(self,
|
|
123
|
-
super().__init__(
|
|
122
|
+
def __init__(self, path=None, name=None):
|
|
123
|
+
super().__init__(path, name)
|
|
124
124
|
|
|
125
125
|
self.temperature = Property(
|
|
126
126
|
value=25.0, uncertainty=0.5,
|
|
@@ -341,17 +341,18 @@ Column(
|
|
|
341
341
|
### `Sample`
|
|
342
342
|
|
|
343
343
|
```python
|
|
344
|
-
Sample(
|
|
344
|
+
Sample(path=None, name=None)
|
|
345
345
|
```
|
|
346
346
|
|
|
347
347
|
Subclass it and declare Properties and Tables in `__init__`. Assignment auto-registers them and wires names, symbols, and dependencies.
|
|
348
348
|
|
|
349
349
|
| Member | Description |
|
|
350
350
|
|---|---|
|
|
351
|
+
| `.path` | `Path` — file path (set at construction or after save). |
|
|
351
352
|
| `.props` | `dict[str, Property]` — all registered properties. |
|
|
352
353
|
| `.tables` | `dict[str, Table]` — all registered tables. |
|
|
353
|
-
| `.save(
|
|
354
|
-
| `.load(
|
|
354
|
+
| `.save(path, style="math")` | Write YAML frontmatter + template body to `.md`. |
|
|
355
|
+
| `.load(path)` | classmethod — load from `.md` file. |
|
|
355
356
|
| `.template(style="math")` | Override for custom Markdown body. |
|
|
356
357
|
| `.to_dict()` | Export all data as a plain dict. |
|
|
357
358
|
| `.to_dataframe()` | Export scalar properties as a single-row DataFrame. |
|
|
@@ -94,8 +94,8 @@ from samplekit import Sample, Property, Table, Column, report
|
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
class Experiment(Sample):
|
|
97
|
-
def __init__(self,
|
|
98
|
-
super().__init__(
|
|
97
|
+
def __init__(self, path=None, name=None):
|
|
98
|
+
super().__init__(path, name)
|
|
99
99
|
|
|
100
100
|
self.temperature = Property(
|
|
101
101
|
value=25.0, uncertainty=0.5,
|
|
@@ -316,17 +316,18 @@ Column(
|
|
|
316
316
|
### `Sample`
|
|
317
317
|
|
|
318
318
|
```python
|
|
319
|
-
Sample(
|
|
319
|
+
Sample(path=None, name=None)
|
|
320
320
|
```
|
|
321
321
|
|
|
322
322
|
Subclass it and declare Properties and Tables in `__init__`. Assignment auto-registers them and wires names, symbols, and dependencies.
|
|
323
323
|
|
|
324
324
|
| Member | Description |
|
|
325
325
|
|---|---|
|
|
326
|
+
| `.path` | `Path` — file path (set at construction or after save). |
|
|
326
327
|
| `.props` | `dict[str, Property]` — all registered properties. |
|
|
327
328
|
| `.tables` | `dict[str, Table]` — all registered tables. |
|
|
328
|
-
| `.save(
|
|
329
|
-
| `.load(
|
|
329
|
+
| `.save(path, style="math")` | Write YAML frontmatter + template body to `.md`. |
|
|
330
|
+
| `.load(path)` | classmethod — load from `.md` file. |
|
|
330
331
|
| `.template(style="math")` | Override for custom Markdown body. |
|
|
331
332
|
| `.to_dict()` | Export all data as a plain dict. |
|
|
332
333
|
| `.to_dataframe()` | Export scalar properties as a single-row DataFrame. |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "samplekit"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.2.0"
|
|
4
4
|
description = "Lightweight Python framework for documenting scientific samples with bidirectional Markdown I/O"
|
|
5
5
|
authors = [{ name = "zelyph", email = "github@zelyph.fr" }]
|
|
6
6
|
readme = "README.md"
|
|
@@ -67,33 +67,43 @@ class Sample:
|
|
|
67
67
|
"""
|
|
68
68
|
Named container of Properties and Tables.
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
Parameters
|
|
71
|
+
----------
|
|
72
|
+
path : str or Path, optional
|
|
73
|
+
Path to a Markdown file. If the file exists, properties and
|
|
74
|
+
tables are loaded automatically. The name defaults to the
|
|
75
|
+
file stem when not provided.
|
|
76
|
+
name : str, optional
|
|
77
|
+
Display name. If omitted, inferred from *path* or set to
|
|
78
|
+
``"Unnamed"``.
|
|
72
79
|
|
|
73
80
|
Examples
|
|
74
81
|
--------
|
|
82
|
+
Load from file:
|
|
83
|
+
|
|
84
|
+
>>> sample = Sample("data/my_sample.md")
|
|
85
|
+
>>> sample.name
|
|
86
|
+
'my_sample'
|
|
87
|
+
|
|
88
|
+
Define a subclass with fixed properties:
|
|
89
|
+
|
|
75
90
|
>>> class MySample(Sample):
|
|
76
|
-
... def __init__(self,
|
|
77
|
-
... super().__init__(
|
|
91
|
+
... def __init__(self, path=None, name=None):
|
|
92
|
+
... super().__init__(path, name)
|
|
78
93
|
... self.temperature = Property(value=25.0, unit="°C", symbol_math="T")
|
|
79
|
-
... self.pressure = Property(value=101.3, unit="kPa", symbol_math="P")
|
|
80
94
|
...
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
... return properties_table(self, ["temperature", "pressure"], style=style)
|
|
84
|
-
>>>
|
|
85
|
-
>>> sample = MySample("EXP_001")
|
|
86
|
-
>>> sample.save("sample.md")
|
|
95
|
+
>>> s = MySample(name="EXP_001")
|
|
96
|
+
>>> s.save("sample.md")
|
|
87
97
|
>>> loaded = MySample.load("sample.md")
|
|
88
98
|
"""
|
|
89
99
|
|
|
90
|
-
def __init__(self,
|
|
100
|
+
def __init__(self, path: str | Path | None = None, name: str | None = None):
|
|
91
101
|
# Use object.__setattr__ to bypass our custom __setattr__
|
|
92
102
|
object.__setattr__(self, '_props', {})
|
|
93
103
|
object.__setattr__(self, '_tables', {})
|
|
94
104
|
object.__setattr__(self, '_order', [])
|
|
95
|
-
fp = Path(
|
|
96
|
-
object.__setattr__(self, '
|
|
105
|
+
fp = Path(path) if path else None
|
|
106
|
+
object.__setattr__(self, 'path', fp)
|
|
97
107
|
n = name if name is not None else (fp.stem if fp else "Unnamed")
|
|
98
108
|
object.__setattr__(self, 'name', n)
|
|
99
109
|
object.__setattr__(self, '_hydrating', False)
|
|
@@ -101,8 +111,8 @@ class Sample:
|
|
|
101
111
|
self._auto_hydrate()
|
|
102
112
|
|
|
103
113
|
def _auto_hydrate(self):
|
|
104
|
-
"""Load data from
|
|
105
|
-
fp = object.__getattribute__(self, '
|
|
114
|
+
"""Load data from path if the file exists."""
|
|
115
|
+
fp = object.__getattribute__(self, 'path')
|
|
106
116
|
if fp is not None and fp.exists():
|
|
107
117
|
object.__setattr__(self, '_hydrating', True)
|
|
108
118
|
try:
|
|
@@ -125,7 +135,7 @@ class Sample:
|
|
|
125
135
|
|
|
126
136
|
def __setattr__(self, name: str, value):
|
|
127
137
|
object.__setattr__(self, name, value)
|
|
128
|
-
if name.startswith('_') or name
|
|
138
|
+
if name.startswith('_') or name in ('name', 'path'):
|
|
129
139
|
return
|
|
130
140
|
if isinstance(value, Property):
|
|
131
141
|
props = object.__getattribute__(self, '_props')
|
|
@@ -239,19 +249,19 @@ class Sample:
|
|
|
239
249
|
object.__setattr__(self, 'name', name)
|
|
240
250
|
self._hydrate_from_yaml(yaml_data)
|
|
241
251
|
|
|
242
|
-
def save(self,
|
|
252
|
+
def save(self, path: str | Path | None = None, style: str = "math") -> Path:
|
|
243
253
|
"""Save to markdown file with YAML frontmatter.
|
|
244
254
|
|
|
245
255
|
Parameters
|
|
246
256
|
----------
|
|
247
|
-
|
|
248
|
-
Defaults to the
|
|
257
|
+
path : path, optional
|
|
258
|
+
Defaults to the path used at construction.
|
|
249
259
|
style : "math" or "text"
|
|
250
260
|
Controls math rendering in the body.
|
|
251
261
|
"""
|
|
252
|
-
fp = Path(
|
|
262
|
+
fp = Path(path) if path else self.path
|
|
253
263
|
if fp is None:
|
|
254
|
-
raise ValueError("No
|
|
264
|
+
raise ValueError("No path specified")
|
|
255
265
|
|
|
256
266
|
yaml_data = self._build_yaml_data()
|
|
257
267
|
yaml_str = yaml.dump(
|
|
@@ -270,20 +280,20 @@ class Sample:
|
|
|
270
280
|
|
|
271
281
|
fp.parent.mkdir(parents=True, exist_ok=True)
|
|
272
282
|
fp.write_text(content, encoding="utf-8")
|
|
273
|
-
self.
|
|
283
|
+
self.path = fp
|
|
274
284
|
return fp
|
|
275
285
|
|
|
276
286
|
@classmethod
|
|
277
|
-
def load(cls,
|
|
287
|
+
def load(cls, path: str | Path) -> Sample:
|
|
278
288
|
"""Load from a markdown file with YAML frontmatter.
|
|
279
289
|
|
|
280
290
|
Creates an instance of *cls* (calling its __init__ to define
|
|
281
291
|
properties), then hydrates from the YAML data via _auto_hydrate.
|
|
282
292
|
"""
|
|
283
|
-
fp = Path(
|
|
293
|
+
fp = Path(path)
|
|
284
294
|
# _auto_hydrate (called by __init_subclass__ wrapper) will read
|
|
285
295
|
# the file and hydrate since fp exists on disk.
|
|
286
|
-
return cls(
|
|
296
|
+
return cls(path=fp)
|
|
287
297
|
|
|
288
298
|
# ── Converters (delegated to samplekit.converters) ──
|
|
289
299
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: samplekit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Lightweight Python framework for documenting scientific samples with bidirectional Markdown I/O
|
|
5
5
|
Author-email: zelyph <github@zelyph.fr>
|
|
6
6
|
License: MIT
|
|
@@ -119,8 +119,8 @@ from samplekit import Sample, Property, Table, Column, report
|
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
class Experiment(Sample):
|
|
122
|
-
def __init__(self,
|
|
123
|
-
super().__init__(
|
|
122
|
+
def __init__(self, path=None, name=None):
|
|
123
|
+
super().__init__(path, name)
|
|
124
124
|
|
|
125
125
|
self.temperature = Property(
|
|
126
126
|
value=25.0, uncertainty=0.5,
|
|
@@ -341,17 +341,18 @@ Column(
|
|
|
341
341
|
### `Sample`
|
|
342
342
|
|
|
343
343
|
```python
|
|
344
|
-
Sample(
|
|
344
|
+
Sample(path=None, name=None)
|
|
345
345
|
```
|
|
346
346
|
|
|
347
347
|
Subclass it and declare Properties and Tables in `__init__`. Assignment auto-registers them and wires names, symbols, and dependencies.
|
|
348
348
|
|
|
349
349
|
| Member | Description |
|
|
350
350
|
|---|---|
|
|
351
|
+
| `.path` | `Path` — file path (set at construction or after save). |
|
|
351
352
|
| `.props` | `dict[str, Property]` — all registered properties. |
|
|
352
353
|
| `.tables` | `dict[str, Table]` — all registered tables. |
|
|
353
|
-
| `.save(
|
|
354
|
-
| `.load(
|
|
354
|
+
| `.save(path, style="math")` | Write YAML frontmatter + template body to `.md`. |
|
|
355
|
+
| `.load(path)` | classmethod — load from `.md` file. |
|
|
355
356
|
| `.template(style="math")` | Override for custom Markdown body. |
|
|
356
357
|
| `.to_dict()` | Export all data as a plain dict. |
|
|
357
358
|
| `.to_dataframe()` | Export scalar properties as a single-row DataFrame. |
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|