edfcore 0.2.55 → 0.2.57

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,32 @@ alone does not tell you whether you were affected.
6
6
  edfcore is pre-1.0. Patch releases have carried behaviour changes where the old behaviour was a
7
7
  defect; those are called out below.
8
8
 
9
+ ## 0.2.57
10
+
11
+ - **Documented** what the corpus work of 0.2.49-0.2.55 actually established. The README's
12
+ interop section stopped at sample parity, which was the state at 0.2.48 and has not been the
13
+ state since — annotation onsets, the zero-record-duration scoring file, the 1985-2084 year rule,
14
+ faithful decimation over 7,950,000 samples, chunk-independence, the memory bound, streaming
15
+ equivalence, HTTP random access costing under 64 KB for a window twelve hours into a 48 MB file,
16
+ and `validate` exiting 0 on a real clinical recording were all verified and none of them were
17
+ claimed. A reader deciding whether to trust this package should not have to reconstruct that
18
+ from a changelog.
19
+ - Each row names how it is checked rather than only what it asserts, because "we test that" is the
20
+ kind of claim this project has spent forty releases learning not to make without saying how.
21
+
22
+ ## 0.2.56
23
+
24
+ - **Fixed** `tests/README.md`, which said "There are no binary fixtures in this repository" and
25
+ listed Tier 2 of its own fixture policy as "Not used". Both stopped being true in 0.2.34, when
26
+ the parity harness committed six small EDF/BDF files and their goldens — about 1.4 MB. I added
27
+ those without revisiting the policy that forbade them.
28
+ - The policy is now stated as it actually is, with the reason: a parity fixture has to be bytes a
29
+ DIFFERENT implementation wrote, so regenerating it in memory with this project's own writer
30
+ would make the comparison circular and prove nothing. The licence rule is unchanged and was
31
+ never at risk — the committed files are generated locally by pyEDFlib, the downloaded corpus is
32
+ still gitignored, and only the JSON goldens reference it, by name and hash. None of it ships:
33
+ the package contains `dist`, `src` and the changelog.
34
+
9
35
  ## 0.2.55
10
36
 
11
37
  - **Added** CLI coverage against the real corpus. Every existing CLI fixture is a few hundred bytes
package/README.md CHANGED
@@ -310,7 +310,25 @@ establish.
310
310
  chose: a **22-hour clinical polysomnogram** from sleep-edfx, and the teuniz generator files in EDF,
311
311
  EDF+ and 24-bit BDF+. Sampled at the start, the middle and the end of every signal — the end window
312
312
  being the one that catches record arithmetic drifting with distance, which a sample near record 0
313
- cannot. Those tests need the corpus and skip without it:
313
+ cannot.
314
+
315
+ What else those files establish, which synthetic fixtures cannot:
316
+
317
+ | Claim | Checked how |
318
+ |---|---|
319
+ | Annotation onsets match pyEDFlib | 154 sleep stages from a real scoring file, to the tick |
320
+ | A legally **zero** record duration works | that same file — where `sampleRateHz` is `undefined` and any rate-derived expression yields `NaN` |
321
+ | The 1985–2084 year rule is right | a 1989 recording, against a reader that implements it independently |
322
+ | Decimation keeps every extreme | 7,950,000 samples reduced to 1,000 buckets, compared with an exhaustive reduction |
323
+ | The bucket grid ignores chunk size | 265 chunks versus a handful |
324
+ | Memory is bounded by the chunk | that 22-hour envelope produced under a 512 KiB budget |
325
+ | Streaming equals reading | 42 streamed chunks concatenated and compared sample by sample |
326
+ | **Random access is real** | a 30-second window twelve hours in costs **under 64 KB** over HTTP |
327
+ | `validate` is usable as a CI gate | exits 0 on a real recording from a real sleep lab |
328
+ | The sample scan sees what pyEDFlib sees | whole-signal digital extremes, all five files |
329
+
330
+ Those tests need the corpus and skip without it. `coverage.test.ts` always runs and says which
331
+ state you are in, because a skipped test and a passing one look identical in a summary line:
314
332
 
315
333
  ```bash
316
334
  npm run corpus:fetch
@@ -109,5 +109,5 @@ export declare const SIGNAL_FIELD_BLOCK_OFFSETS: {
109
109
  readonly reserved: 224;
110
110
  };
111
111
  /** Published package version. Kept in sync with package.json by a test. */
112
- export declare const VERSION = "0.2.55";
112
+ export declare const VERSION = "0.2.57";
113
113
  //# sourceMappingURL=constants.d.ts.map
package/dist/constants.js CHANGED
@@ -79,5 +79,5 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
79
79
  reserved: 224,
80
80
  };
81
81
  /** Published package version. Kept in sync with package.json by a test. */
82
- export const VERSION = '0.2.55';
82
+ export const VERSION = '0.2.57';
83
83
  //# sourceMappingURL=constants.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edfcore",
3
- "version": "0.2.55",
3
+ "version": "0.2.57",
4
4
  "description": "Modern, typed, zero-dependency reader for EDF, EDF+, BDF and BDF+ biosignal files. Works in browsers and Node with true random access.",
5
5
  "keywords": [
6
6
  "edf",
package/src/constants.ts CHANGED
@@ -93,4 +93,4 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
93
93
  } as const;
94
94
 
95
95
  /** Published package version. Kept in sync with package.json by a test. */
96
- export const VERSION = '0.2.55';
96
+ export const VERSION = '0.2.57';