labnotes 0.0.1__tar.gz → 0.0.2__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.
@@ -0,0 +1,25 @@
1
+ Metadata-Version: 2.5
2
+ Name: labnotes
3
+ Version: 0.0.2
4
+ Summary: Browse experiment designs, notes, and run data from a folder.
5
+ Project-URL: Repository, https://github.com/thekevinscott/labnotes
6
+ Author-email: Kevin Scott <me@thekevinscott.com>
7
+ License-Expression: MIT
8
+ Requires-Python: >=3.12
9
+ Requires-Dist: dirsql>=0.4.110
10
+ Requires-Dist: pyyaml>=6.0.3
11
+ Description-Content-Type: text/markdown
12
+
13
+ # labnotes
14
+
15
+ Browse experiment designs, notes, and run data from a folder.
16
+
17
+ ```sh
18
+ uvx labnotes --experiments-folder experiments --data-folder data
19
+ ```
20
+
21
+ - `--experiments-folder` holds one subfolder per experiment, each with a
22
+ `design.yaml` (with a `study` key) and any number of markdown notes.
23
+ - `--data-folder` holds the run data and a `.dirsql.toml` that declares a
24
+ `runs` table with a `study` column. An experiment's runs are the rows whose
25
+ `study` matches its design's.
@@ -0,0 +1,13 @@
1
+ # labnotes
2
+
3
+ Browse experiment designs, notes, and run data from a folder.
4
+
5
+ ```sh
6
+ uvx labnotes --experiments-folder experiments --data-folder data
7
+ ```
8
+
9
+ - `--experiments-folder` holds one subfolder per experiment, each with a
10
+ `design.yaml` (with a `study` key) and any number of markdown notes.
11
+ - `--data-folder` holds the run data and a `.dirsql.toml` that declares a
12
+ `runs` table with a `study` column. An experiment's runs are the rows whose
13
+ `study` matches its design's.
@@ -10,6 +10,10 @@ readme = "README.md"
10
10
  requires-python = ">=3.12"
11
11
  license = "MIT"
12
12
  authors = [{ name = "Kevin Scott", email = "me@thekevinscott.com" }]
13
+ dependencies = [
14
+ "dirsql>=0.4.110",
15
+ "pyyaml>=6.0.3",
16
+ ]
13
17
 
14
18
  [project.urls]
15
19
  Repository = "https://github.com/thekevinscott/labnotes"
@@ -22,6 +26,7 @@ dev = [
22
26
  "mypy>=2.4.0",
23
27
  "pytest>=8.0",
24
28
  "ruff==0.8.4",
29
+ "types-pyyaml>=6.0.12.20260906",
25
30
  ]
26
31
 
27
32
  [tool.hatch.version]
@@ -0,0 +1,29 @@
1
+ import argparse
2
+ import asyncio
3
+ import json
4
+ from importlib.metadata import version
5
+ from pathlib import Path
6
+
7
+ from labnotes.list_experiments import list_experiments
8
+
9
+
10
+ def main(argv: list[str] | None = None) -> None:
11
+ parser = argparse.ArgumentParser(prog="labnotes")
12
+ parser.add_argument("--version", action="version", version=version("labnotes"))
13
+ parser.add_argument(
14
+ "--experiments-folder",
15
+ type=Path,
16
+ required=True,
17
+ help="one subfolder per experiment, each with a design.yaml and markdown notes",
18
+ )
19
+ parser.add_argument(
20
+ "--data-folder",
21
+ type=Path,
22
+ required=True,
23
+ help="run data, with a .dirsql.toml declaring a runs table that has a study column",
24
+ )
25
+ args = parser.parse_args(argv)
26
+ experiments = asyncio.run(
27
+ list_experiments(args.experiments_folder, args.data_folder)
28
+ )
29
+ print(json.dumps(experiments, indent=2))
@@ -0,0 +1,17 @@
1
+ from pathlib import Path
2
+
3
+ from labnotes.open_experiments import open_experiments
4
+ from labnotes.open_runs import open_runs
5
+
6
+
7
+ async def list_experiments(
8
+ experiments_folder: Path, data_folder: Path
9
+ ) -> list[dict[str, object]]:
10
+ experiments = open_experiments(experiments_folder)
11
+ runs = open_runs(data_folder)
12
+ await experiments.ready()
13
+ await runs.ready()
14
+ rows = await experiments.query("SELECT name, study FROM experiments ORDER BY name")
15
+ counts = await runs.query("SELECT study, COUNT(*) AS n FROM runs GROUP BY study")
16
+ runs_by_study = {count["study"]: count["n"] for count in counts}
17
+ return [{**row, "runs": runs_by_study.get(row["study"], 0)} for row in rows]
@@ -0,0 +1,26 @@
1
+ from pathlib import Path
2
+
3
+ from dirsql import DirSQL, Table
4
+
5
+ from labnotes.read_design import read_design
6
+ from labnotes.read_note import read_note
7
+
8
+
9
+ def open_experiments(folder: Path) -> DirSQL:
10
+ return DirSQL(
11
+ str(folder),
12
+ tables=[
13
+ Table(
14
+ name="experiments",
15
+ ddl="CREATE TABLE experiments (name TEXT, study TEXT, design TEXT)",
16
+ glob="*/design.yaml",
17
+ on_file=read_design,
18
+ ),
19
+ Table(
20
+ name="notes",
21
+ ddl="CREATE TABLE notes (experiment TEXT, name TEXT, content TEXT)",
22
+ glob="*/*.md",
23
+ on_file=read_note,
24
+ ),
25
+ ],
26
+ )
@@ -0,0 +1,13 @@
1
+ from pathlib import Path
2
+
3
+ from dirsql import DirSQL
4
+
5
+
6
+ def open_runs(folder: Path) -> DirSQL:
7
+ config = folder / ".dirsql.toml"
8
+ if not config.is_file():
9
+ raise FileNotFoundError(
10
+ f"{config} not found; the data folder needs a dirsql config"
11
+ )
12
+ # Run data is usually gitignored (DVC, large outputs), so scan it anyway.
13
+ return DirSQL(str(folder), config=[str(config)], no_ignore=True)
@@ -0,0 +1,15 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+ import yaml
5
+
6
+
7
+ def read_design(path: str) -> list[dict[str, object]]:
8
+ design = yaml.safe_load(Path(path).read_text(encoding="utf-8")) or {}
9
+ return [
10
+ {
11
+ "name": Path(path).parent.name,
12
+ "study": design.get("study"),
13
+ "design": json.dumps(design),
14
+ }
15
+ ]
@@ -0,0 +1,12 @@
1
+ from pathlib import Path
2
+
3
+
4
+ def read_note(path: str) -> list[dict[str, object]]:
5
+ note = Path(path)
6
+ return [
7
+ {
8
+ "experiment": note.parent.name,
9
+ "name": note.name,
10
+ "content": note.read_text(encoding="utf-8"),
11
+ }
12
+ ]
@@ -74,6 +74,12 @@ wheels = [
74
74
  { url = "https://files.pythonhosted.org/packages/d6/85/c1c583ec96be412c4119a0ba4354c1e3519464036dd8d2909536661bed6a/ast_serialize-0.13.0-cp39-abi3-win_arm64.whl", hash = "sha256:8aff1682f9fa3e119a1cf8ef47504d38f7019b22b79e0f2b5c2135b9532d14db", size = 1138203, upload-time = "2026-10-12T17:06:20.466Z" },
75
75
  ]
76
76
 
77
+ [[package]]
78
+ name = "bin-shim"
79
+ version = "0.1.1"
80
+ source = { registry = "https://pypi.org/simple" }
81
+ sdist = { url = "https://files.pythonhosted.org/packages/6a/fc/2e09f2de12c0937834fc3f2bacde597f6e25499b0bf4b3d71292b7dbf822/bin_shim-0.1.1.tar.gz", hash = "sha256:9972911c22754a5370f666245cbe5d9d9aa04d9f7289d166142c9c3c6ee3b8c3", size = 10431, upload-time = "2026-08-20T21:45:24.392Z" }
82
+
77
83
  [[package]]
78
84
  name = "colorama"
79
85
  version = "0.4.6"
@@ -83,6 +89,22 @@ wheels = [
83
89
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
84
90
  ]
85
91
 
92
+ [[package]]
93
+ name = "dirsql"
94
+ version = "0.4.110"
95
+ source = { registry = "https://pypi.org/simple" }
96
+ dependencies = [
97
+ { name = "bin-shim" },
98
+ ]
99
+ sdist = { url = "https://files.pythonhosted.org/packages/f7/c3/f7eb9b968d56dcf304397143bdfacd663d83049a602f12e64d4046209cb0/dirsql-0.4.110.tar.gz", hash = "sha256:e2f1f1c4e50a0e87b9f0e9998acd523b6fd4d4f5cb4b9ad4e9e4751ccf8e53be", size = 631753, upload-time = "2026-10-12T00:18:09.726Z" }
100
+ wheels = [
101
+ { url = "https://files.pythonhosted.org/packages/2e/54/411dd9318c237aa3f47ba4d63e8b16e5f0d6816b7008183bb9ddc0da12f0/dirsql-0.4.110-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ece09a7a01efc17dbbefbf1d28c6f4ee02531e9e4f471ec295d7c71e9c2108b4", size = 3383557, upload-time = "2026-10-12T00:17:58.935Z" },
102
+ { url = "https://files.pythonhosted.org/packages/bb/a1/4f644d7d0be2518ece529fb3823b56651d704e940fb93144327b6edc17d6/dirsql-0.4.110-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:5150ebdde0417a07ea1321661bb49881cd3e27839171bb90a4866664569e685a", size = 3201876, upload-time = "2026-10-12T00:18:01.002Z" },
103
+ { url = "https://files.pythonhosted.org/packages/00/c4/12ec3a423548e71baf41e0f8cc09af8cedb86fa5d81bebb2a5f9aab7a15e/dirsql-0.4.110-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b90c67f3a12baf67be49a1e4350b0c270fe9205e402b61b1c2c9dd727d008904", size = 3446719, upload-time = "2026-10-12T00:18:02.729Z" },
104
+ { url = "https://files.pythonhosted.org/packages/f5/f0/238323109f3eda47b2ea1b04da919bfce2b47a643ef0a40bf1372b857f04/dirsql-0.4.110-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5b17655cc50fc54ef40b49cafd7848adee49ad563fa99c8dbe525962441f5681", size = 3633435, upload-time = "2026-10-12T00:18:04.819Z" },
105
+ { url = "https://files.pythonhosted.org/packages/76/9e/bef62ace1e918c1c033c137e8bb45504aa26c4539ac6f0166727bd55bd4f/dirsql-0.4.110-cp310-abi3-win_amd64.whl", hash = "sha256:f018505dc63d36b5afa2ceacd484cd534db0acff1487e671830d08f5953f2d4a", size = 3578021, upload-time = "2026-10-12T00:18:07.383Z" },
106
+ ]
107
+
86
108
  [[package]]
87
109
  name = "iniconfig"
88
110
  version = "2.3.1"
@@ -95,21 +117,31 @@ wheels = [
95
117
  [[package]]
96
118
  name = "labnotes"
97
119
  source = { editable = "." }
120
+ dependencies = [
121
+ { name = "dirsql" },
122
+ { name = "pyyaml" },
123
+ ]
98
124
 
99
125
  [package.dev-dependencies]
100
126
  dev = [
101
127
  { name = "mypy" },
102
128
  { name = "pytest" },
103
129
  { name = "ruff" },
130
+ { name = "types-pyyaml" },
104
131
  ]
105
132
 
106
133
  [package.metadata]
134
+ requires-dist = [
135
+ { name = "dirsql", specifier = ">=0.4.110" },
136
+ { name = "pyyaml", specifier = ">=6.0.3" },
137
+ ]
107
138
 
108
139
  [package.metadata.requires-dev]
109
140
  dev = [
110
141
  { name = "mypy", specifier = ">=2.4.0" },
111
142
  { name = "pytest", specifier = ">=8.0" },
112
143
  { name = "ruff", specifier = "==0.8.4" },
144
+ { name = "types-pyyaml", specifier = ">=6.0.12.20260906" },
113
145
  ]
114
146
 
115
147
  [[package]]
@@ -328,6 +360,52 @@ wheels = [
328
360
  { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
329
361
  ]
330
362
 
363
+ [[package]]
364
+ name = "pyyaml"
365
+ version = "6.0.3"
366
+ source = { registry = "https://pypi.org/simple" }
367
+ sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
368
+ wheels = [
369
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
370
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
371
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
372
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
373
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
374
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
375
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
376
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
377
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
378
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
379
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
380
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
381
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
382
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
383
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
384
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
385
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
386
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
387
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
388
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
389
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
390
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
391
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
392
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
393
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
394
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
395
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
396
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
397
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
398
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
399
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
400
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
401
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
402
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
403
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
404
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
405
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
406
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
407
+ ]
408
+
331
409
  [[package]]
332
410
  name = "ruff"
333
411
  version = "0.8.4"
@@ -353,6 +431,15 @@ wheels = [
353
431
  { url = "https://files.pythonhosted.org/packages/13/9f/026e18ca7d7766783d779dae5e9c656746c6ede36ef73c6d934aaf4a6dec/ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08", size = 9074500, upload-time = "2024-12-19T13:36:23.92Z" },
354
432
  ]
355
433
 
434
+ [[package]]
435
+ name = "types-pyyaml"
436
+ version = "6.0.12.20260906"
437
+ source = { registry = "https://pypi.org/simple" }
438
+ sdist = { url = "https://files.pythonhosted.org/packages/90/6e/abec85b9013db5b934b0280a6dd104904d84f7bcbaab2e2f3def87ac7463/types_pyyaml-6.0.12.20260906.tar.gz", hash = "sha256:f59c1cc05010b833d2d72287bbaa72610106b28d42d89a907313117faba85212", size = 18649, upload-time = "2026-09-06T06:35:35.362Z" }
439
+ wheels = [
440
+ { url = "https://files.pythonhosted.org/packages/15/c0/fc0644b7ddcfb969e95845837143cb5173ddd6e06ee4ba5fc493cd9329b7/types_pyyaml-6.0.12.20260906-py3-none-any.whl", hash = "sha256:bca893ff0d51df5c9053137d5d0e6ccd36e939a196356f1d5c16372422f5137b", size = 21282, upload-time = "2026-09-06T06:35:34.372Z" },
441
+ ]
442
+
356
443
  [[package]]
357
444
  name = "typing-extensions"
358
445
  version = "4.16.0"
labnotes-0.0.1/PKG-INFO DELETED
@@ -1,17 +0,0 @@
1
- Metadata-Version: 2.5
2
- Name: labnotes
3
- Version: 0.0.1
4
- Summary: Browse experiment designs, notes, and run data from a folder.
5
- Project-URL: Repository, https://github.com/thekevinscott/labnotes
6
- Author-email: Kevin Scott <me@thekevinscott.com>
7
- License-Expression: MIT
8
- Requires-Python: >=3.12
9
- Description-Content-Type: text/markdown
10
-
11
- # labnotes
12
-
13
- Browse experiment designs, notes, and run data from a folder.
14
-
15
- ```sh
16
- uvx labnotes --version
17
- ```
labnotes-0.0.1/README.md DELETED
@@ -1,7 +0,0 @@
1
- # labnotes
2
-
3
- Browse experiment designs, notes, and run data from a folder.
4
-
5
- ```sh
6
- uvx labnotes --version
7
- ```
@@ -1,8 +0,0 @@
1
- import argparse
2
- from importlib.metadata import version
3
-
4
-
5
- def main(argv: list[str] | None = None) -> None:
6
- parser = argparse.ArgumentParser(prog="labnotes")
7
- parser.add_argument("--version", action="version", version=version("labnotes"))
8
- parser.parse_args(argv)
File without changes
File without changes
File without changes