edfcore 0.2.45 → 0.2.47

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,7 +6,30 @@ 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.44
9
+ ## 0.2.47
10
+
11
+ - **Fixed** this changelog. Every heading from `0.2.36` down to `0.2.45` named a version one lower
12
+ than the release that actually shipped it: `0.2.36` was consumed by a release run that failed its
13
+ typecheck after bumping the version, and I kept writing the next entry against the number I
14
+ expected rather than the tag that got cut. So the `cachedSource` fix was labelled `0.2.36` and
15
+ shipped in `0.2.37`, and everything after it was off by one — including the MNE claim in the
16
+ README, which named `0.2.43` for work that is in `0.2.44`. Verified against the tags rather than
17
+ reasoned about: `git show <tag>:CHANGELOG.md` for each. `0.2.36` is now listed as never released,
18
+ the way `0.2.29` already was.
19
+
20
+ ## 0.2.46
21
+
22
+ - **Added** `scripts/golden/README.md`: how to regenerate every parity fixture, and — more usefully
23
+ — what each of the three harnesses actually claims and how strong that claim is. Bit-for-bit for
24
+ pyEDFlib physical values, exact-to-the-tick for pyEDFlib annotation onsets, 1e-12 relative for
25
+ MNE, with the reason the last one is weaker stated where someone would otherwise assume it was an
26
+ oversight. Also records the rule for adding a case: pick where the two candidate expressions
27
+ diverge or where a mistake would be least visible, and remember that a value comparison alone
28
+ cannot catch a mistake both libraries make.
29
+ - **Documented** the same table on the physical-values page, so a reader who never opens the
30
+ repository sees which claims are load-bearing and which are approximate.
31
+
32
+ ## 0.2.45
10
33
 
11
34
  - **Added** annotation parity against pyEDFlib — the other axis, and the one edfcore has got wrong
12
35
  most. The scaling harness checks arithmetic; this checks WHICH AXIS an onset is on. Six releases
@@ -21,7 +44,7 @@ defect; those are called out below.
21
44
  recorded from that would have made the parity test compare an incomplete set and pass while doing
22
45
  it.
23
46
 
24
- ## 0.2.43
47
+ ## 0.2.44
25
48
 
26
49
  - **Added** parity against MNE — a second, independent reader. pyEDFlib and edfcore both descend
27
50
  from EDFlib's arithmetic, so agreement between them shows edfcore copied it correctly rather than
@@ -37,7 +60,7 @@ defect; those are called out below.
37
60
  other. Channels MNE does not rescale — it leaves `degC` alone — are excluded rather than pushed
38
61
  through a factor that would make the comparison an artefact of the test.
39
62
 
40
- ## 0.2.42
63
+ ## 0.2.43
41
64
 
42
65
  - **Added** three cases to the pyEDFlib parity harness, chosen for where the two scaling
43
66
  expressions diverge most or where a mistake would be least visible:
@@ -49,7 +72,7 @@ defect; those are called out below.
49
72
  set.
50
73
  - **a full 16-bit range** mapped to one millivolt — the finest.
51
74
 
52
- ## 0.2.41
75
+ ## 0.2.42
53
76
 
54
77
  - **Added** a `samplesPerRecord` column to `edfcore signals`, and **fixed** the documentation,
55
78
  which claimed the command emitted it when it emitted `kind` instead. That left the authoritative
@@ -60,7 +83,7 @@ defect; those are called out below.
60
83
  five columns by position moved. The full six-column list is now pinned by a test, not only
61
84
  described.
62
85
 
63
- ## 0.2.40
86
+ ## 0.2.41
64
87
 
65
88
  - **Added** the types `edfcore/validate`'s own signatures mention to that subpath's exports:
66
89
  `EdfHeader`, `EdfDiagnostic`, `EdfDiagnosticCode`, `EdfSeverity`, `EdfSignal`, `EdfRecordIndex`
@@ -71,7 +94,7 @@ defect; those are called out below.
71
94
  of anything they passed or got back. A type-only test now pins the set, so it fails at
72
95
  `npm run typecheck` rather than in a consumer's project.
73
96
 
74
- ## 0.2.39
97
+ ## 0.2.40
75
98
 
76
99
  - **Added** tests pinning which date defect produces which diagnostic. `DATE_IMPLAUSIBLE` is
77
100
  documented as covering two conditions with only the second reachable, and that was prose about an
@@ -82,7 +105,7 @@ defect; those are called out below.
82
105
  dead. The branch itself is kept, with the reason written next to it — a missing guard is harder
83
106
  to notice than an idle one.
84
107
 
85
- ## 0.2.38
108
+ ## 0.2.39
86
109
 
87
110
  - **Fixed** `onsetSecondsFromFirstRecord` and `onsetTicksFromFirstRecord` disagreeing about the
88
111
  same event at the edge of the int64 tick range. The exact field saturated and the float field was
@@ -91,7 +114,7 @@ defect; those are called out below.
91
114
  with the exact field in 0.2.10. Both are now derived from one rebased value, which is what the
92
115
  float field was always documented to be: the lossy view of the exact one.
93
116
 
94
- ## 0.2.37
117
+ ## 0.2.38
95
118
 
96
119
  - **Fixed** `fileHandleSource` and `fileSource` ignoring an abort signal that flipped while a read
97
120
  was in flight. The abort check ran at the top of each loop iteration, and the common case is one
@@ -100,7 +123,7 @@ defect; those are called out below.
100
123
  test saying why; one adapter honouring a signal that another quietly ignores is worse than either
101
124
  rule alone.
102
125
 
103
- ## 0.2.36
126
+ ## 0.2.37
104
127
 
105
128
  - **Fixed** `cachedSource` repopulating itself after `close()`. A read already in flight when close
106
129
  was called still resolves, and its continuation still runs — after `blocks.clear()` — so the
@@ -114,6 +137,12 @@ defect; those are called out below.
114
137
  cache entirely and retains nothing. The path is exactly as safe as calling the wrapped source
115
138
  directly, which is what it does.
116
139
 
140
+ ## 0.2.36
141
+
142
+ Never released. A release run failed its typecheck after bumping the version, which consumed the
143
+ number before a tag was cut — the same way `0.2.29` was lost earlier. The `cachedSource` fix that
144
+ carried this heading while it was being written shipped in `0.2.37`, and is listed there.
145
+
117
146
  ## 0.2.35
118
147
 
119
148
  - **Fixed** `byteSource` building a source over an argument that is not bytes, so the caller's
package/README.md CHANGED
@@ -299,7 +299,7 @@ back with pyEDFlib, and records every sample as its exact IEEE-754 bit pattern;
299
299
  `tests/corpus/golden/` was produced by edfcore. Substituting the numerically better textbook
300
300
  expression fails it on 140 of 256 samples — which is why the EDFlib form is pinned.
301
301
 
302
- **MNE, as of 0.2.43.** edfcore agrees with MNE to within 1e-12 relative — a weaker claim than the
302
+ **MNE, as of 0.2.44.** edfcore agrees with MNE to within 1e-12 relative — a weaker claim than the
303
303
  one above, and deliberately so. MNE returns SI units, so a microvolt channel arrives divided by
304
304
  1e6, and that division is lossy; the residue is MNE's unit conversion rather than a disagreement
305
305
  about the sample. Bit-parity is claimed for pyEDFlib alone. Both readers also agree with the file's
package/dist/cli-run.js CHANGED
@@ -221,7 +221,7 @@ export async function runCli(args, io) {
221
221
  case 'signals': {
222
222
  // Tab-separated and one line per signal: `header` is for reading, this is for piping.
223
223
  //
224
- // `samplesPerRecord` is last and was missing until 0.2.41. It is the AUTHORITATIVE field —
224
+ // `samplesPerRecord` is last and was missing until 0.2.42. It is the AUTHORITATIVE field —
225
225
  // `sampleRateHz` is derived from it and the record duration, and is empty for the legal
226
226
  // zero-duration file — so a listing meant for a script that omitted it forced the reader
227
227
  // back to `json` for the one number they could safely index by. Appended rather than
@@ -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.45";
112
+ export declare const VERSION = "0.2.47";
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.45';
82
+ export const VERSION = '0.2.47';
83
83
  //# sourceMappingURL=constants.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edfcore",
3
- "version": "0.2.45",
3
+ "version": "0.2.47",
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/cli-run.ts CHANGED
@@ -263,7 +263,7 @@ export async function runCli(args: Args, io: CliIo): Promise<number> {
263
263
  case 'signals': {
264
264
  // Tab-separated and one line per signal: `header` is for reading, this is for piping.
265
265
  //
266
- // `samplesPerRecord` is last and was missing until 0.2.41. It is the AUTHORITATIVE field —
266
+ // `samplesPerRecord` is last and was missing until 0.2.42. It is the AUTHORITATIVE field —
267
267
  // `sampleRateHz` is derived from it and the record duration, and is empty for the legal
268
268
  // zero-duration file — so a listing meant for a script that omitted it forced the reader
269
269
  // back to `json` for the one number they could safely index by. Appended rather than
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.45';
96
+ export const VERSION = '0.2.47';