@finbheara/archive-client 0.24.0 → 0.26.0

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/README.md CHANGED
@@ -95,6 +95,15 @@ c.features; // [{ feature: "dancers", state: "full" | "missing", missing: [...
95
95
  | `teams` | `teams.results`, `teams.rosters`, `teams.resultRosters` | 260 |
96
96
  | `teams.fields` | the fields `teams.results` (`age`, `gender`, `printed_status`) and `teams.rosters` (`dance`, `school_printed_as_of`, a member's `gender`) carry; absent, never refused, without it | 266 |
97
97
  | `events` | `events.years` | 260 |
98
+ | `upcoming.feises` | `upcoming.feises`, and the `next` of `feises.series` (null with the reason without it) | 285 |
99
+ | `upcoming.fields`, `upcoming.entrants` | `upcoming.fields`, `upcoming.entrants` (285 and 290 carry the tables empty) | 291 |
100
+ | `tabs`, `panels` | `tabs.query`, `tabs.stream`; `panels.query` | 184 |
101
+ | `feis-panels` | `feisPanels.query` | 260 |
102
+ | `staff.adjudicators` | `staff.adjudicators` | 230 |
103
+ | `schools.registry` | `schools.list` | 260 |
104
+ | `schools.prints`, `schools.redirects` | `schools.prints`; `schools.redirects` | 184 |
105
+ | `schools.lineage` | `schools.links`, `schools.line`, `schools.lineage` | 184 |
106
+ | `schools.associations` | `schools.associations` | 215 |
98
107
 
99
108
  A spec is `pinned` (the default: the user-local pin, else the latest), `latest`, a cut number
100
109
  (`42`, or `42.1` for a fraction) or a tag (`archive-YYYY.MM.DD-N`).
@@ -201,8 +210,11 @@ s.next; // the next scheduled instance where the release knows one, else n
201
210
  A series is asked by any id of it (a feis, instance or brand id, a retired one followed), by a
202
211
  host code with or without its year (held codes `<stem><yy>` whose two digits are their own year,
203
212
  never a host id of digits alone, which is a sequence number), or by a name (a glob, or a plain word read as `*word*`). Two series answer `ambiguous` with both.
204
- A release holds a feis-year once its results are captured and carries no calendar, so `next` is
205
- `null` today, with the reason.
213
+ `next` is the series' earliest occurrence of the feis-index dated on or after the cut's day
214
+ (`rel.upcoming.feises`, state `upcoming`), under its brand id or one retired onto it: `{ feis_id,
215
+ date, date_hi, occurrence_id, name_printed, hosts, captured_id, series_basis }`, `feis_id` the
216
+ first listing's that names one. It is `null` with `next_why` where the feis-index lists none, and
217
+ on a release without `upcoming_feises` (feature `upcoming.feises`).
206
218
 
207
219
  ## Schools
208
220
 
@@ -227,6 +239,29 @@ rows were published under and their rows, so it agrees with each print lookup of
227
239
 
228
240
  Every answer carries the release tag it came from.
229
241
 
242
+ ### The schools in bulk
243
+
244
+ ```ts
245
+ await rel.schools.list(); // { schools: [{ school_id, display, regions, places }] }: the registry
246
+ await rel.schools.prints({ event: "<event>", year: 2024 });
247
+ // { prints: [{ event, year, print, school_id, rows }] }
248
+ await rel.schools.redirects(); // { redirects: [{ old_id, new_id, kind, since }] }
249
+ await rel.schools.lineage(); // { edges: [{ id, direction, other, shape, year, provisional,
250
+ // decision, confidence }] }
251
+ await rel.schools.associations({ school_id: "<id>" });
252
+ // { associations: [{ at, seq, date, person, person_printed,
253
+ // person_type, credentials, caption, school_printed, school_id,
254
+ // association_type, src_type, src, candidate_school_id, candidate_rung, ... }] }
255
+ ```
256
+
257
+ `prints` is every (print, school id) pair the release's result rows attach in an event-year (the
258
+ print trimmed), with the rows that carry it: an event's (case-blind), a year's, both or every one.
259
+ A row attached to no school is in no pair, and a team result's school is `rel.teams.results`'.
260
+ `lineage` is each edge end as the release publishes it (an edge may carry both ends): `links` and
261
+ `line` are the graph over them. `associations` is the people a directory lists beside a school, as
262
+ evidence of an association, never an identity: `school_id` is the school the print attached to,
263
+ `candidate_school_id` one it reached without attaching.
264
+
230
265
  ### How two schools are linked
231
266
 
232
267
  ```ts
@@ -550,6 +585,33 @@ await rel.feises.dates(); // every feis id with its first a
550
585
  await rel.majors.tabulated({ min_true_round: 3 }); // the majors addresses marked to round 3 or later
551
586
  ```
552
587
 
588
+ ## Marks sheets and panels
589
+
590
+ ```ts
591
+ const s = await rel.tabs.query({ competition: "<competition>" }); // or { address }, and a { round }
592
+ s.rows; // [{ address, competition, card, line, event, year, tier, round, true_round, seat_index,
593
+ // section, panel_size, column_order, drop_rule, the judge (name, print, TD number,
594
+ // id, unmatched reason), mark, mark_printed, place, place_printed, tie, points,
595
+ // points_printed }]
596
+ for await (const t of rel.tabs.stream({ tier: ["T1", "T2", "T3"], year: [2015, 2025] })) ...
597
+ await rel.panels.query({ competition: "<competition>" }); // { seats: [{ competition, panel, round,
598
+ // seat_index, address, the judge (print, TD number, id, unmatched reason) }] }
599
+ await rel.feisPanels.query({ address: "fweb:<code>.<comp>" }); // { seats: [{ address, platform, round,
600
+ // seat_index, panel_size, panel_kind, the judge (print, state printed, TD number, id,
601
+ // unmatched reason, basis) }] }
602
+ ```
603
+
604
+ A marks sheet is a row per card, round and seat, with the seat's mark, place and points as read
605
+ beside their prints, from `results.sqlite` (every tabulated sheet, the T4 events' too). The stream
606
+ takes an event (or several, case-blind), a year or an inclusive range, tiers, competitions, or
607
+ nothing (every cell), and yields one competition's rows together. A sheet's `event`, `year` and
608
+ `tier` are its competition's: a solo competition's from the results, a team competition's from the
609
+ team results (with the tier the release gives that event-year's solo competitions). A sheet the
610
+ release places in neither carries nulls, and a filter on them never reaches it. `panels` and
611
+ `feisPanels` with nothing named answer every seat. `round` is `rx` where one panel sat every round.
612
+ A seat carries its judge's TD number where the release linked one, else a judge id, else the
613
+ reason it is linked to neither (`TabRow`, `PanelSeat` and `FeisPanelSeat` name the fields).
614
+
553
615
  ## Teams and event-years
554
616
 
555
617
  ```ts
@@ -591,11 +653,52 @@ every release the `teams` feature names, and `(await rel.capability("teams.field
591
653
  a release has. The rows are read once per
592
654
  release into the `teams` and `events` indexes.
593
655
 
656
+ ## Upcoming feiseanna and their competitor lists
657
+
658
+ ```ts
659
+ const o = await rel.upcoming.feises({ state: "upcoming", from: "2026-11-01" });
660
+ o.feises; // [{ occurrence_id, occurrence_ids, name_printed, date_lo, date_hi, year, hosts,
661
+ // feis_brand_id, feis_instance_id, series_basis, brand_candidates, captured_id, state }]
662
+ const f = await rel.upcoming.fields({ state: "pending" }); // state, feis, field_id, from, to
663
+ f.fields; // [{ field_id, feis_id, source, host_id, competition_code, count_only, occurrence_id,
664
+ // name_printed, date_lo, date_hi, year, feis_brand_id, comp, state,
665
+ // results_competitions, results_feis_ids, version, versions, captured_date, sha256,
666
+ // limits, entrants, stated_rows, printed_total }]
667
+ const e = await rel.upcoming.entrants({ field_id: "fweb:ABC26/101" }); // version: an older capture
668
+ e.entrants; // [{ name_printed, school_printed, school_id, yob, arm, candidates, flags,
669
+ // competitions, field_ids, captured_id, row_id, ... }]
670
+ ```
671
+
672
+ `upcoming.feises` is every occurrence of the cut's feis-index the release holds no results of:
673
+ `upcoming` (dated on or after the cut's day) or `no-results` (before it), each with every
674
+ platform's or calendar's listing (`hosts`) and its feis series where one was named (`series_basis`
675
+ says how; `none` leaves `feis_brand_id` null, the unjoined ones).
676
+
677
+ A FIELD is one competition a competitor list names, `<feis_id>/<code>`, the same id on every cut. A later capture of the host is a new `version`
678
+ (a capture id; `versions` lists them), never a new field. `state` says how it stands on the cut:
679
+ `pending` (on the list), `results` (the release holds its results, `results_competitions` the
680
+ join), `passed` (its first day is before the cut's day and no result is held) or `withdrawn` (the
681
+ host's newest capture no longer lists it). `comp` is the competition reading of its code (`arm`,
682
+ `level`, `feis_level`, `age`, `population`, `kind`, `title`, `why`), null on a count list.
683
+ `limits` names what the capture cannot show (`registered-not-danced`, `paid-in-full-only`, ...).
684
+
685
+ `upcoming.entrants` answers a field's rows in one version, its current one by default. A
686
+ registrant carries the resolver's `arm` and `candidates`, NEVER A `dancer_id`: a list shows who
687
+ registered, not who danced, and a `unique` row's one candidate is read with its `flags`
688
+ (`initial-only`: a FeisWeb print is a surname and an initial). `count_only` marks a field read from
689
+ a registration-by-school page of the corpus `entrants/` part: its rows are schools' counts
690
+ (`level_counts`), with no names. A QuickFeis registrant list (`transcripts/*.registrationlist.jsonl`)
691
+ is not read into these tables yet. An unknown field or version answers no rows and says
692
+ why. On a release without the tables each call refuses by name.
693
+
594
694
  ## Teachers and adjudicators
595
695
 
596
696
  ```ts
597
697
  await rel.staff.teacher("<name>"); // or a TD number
598
698
  await rel.staff.adjudicator("<name>");
699
+ await rel.staff.adjudicators({ year: 2025 }); // the register's rows (or a TD number's, or every one):
700
+ // [{ the TD number, year, cat, name_printed, country, country_printed, country_code, region,
701
+ // region_printed, region_code, geohash, src }] (`RegisterRow`)
599
702
  ```
600
703
 
601
704
  One person per TD number (else per judge id, else per name): the schools taught at (role,
@@ -747,8 +850,18 @@ is passed to the dancer resolver as asked (`rel.dancers`, above).
747
850
  idq records --years [--release <spec>] [--dancer <id,...>] [--year <y>]
748
851
  idq feis-dates [--release <spec>]
749
852
  idq tabulated [--release <spec>] [--min-round <n>]
853
+ idq tabs [--release <spec>] --comp <competition> | --address <address> [--round <r>]
854
+ idq tabs --stream [--release <spec>] [--comp <c,...>] [--event <e,...>] [--year <y> | --year <from>..<to>] [--tier <t,...>]
855
+ idq panels [--release <spec>] [--comp <competition>]
856
+ idq feis-panels [--release <spec>] [--address <feis competition>] [--platform <p>]
857
+ idq register [--release <spec>] [--year <y>] [--td <TD number>]
858
+ idq schools [--release <spec>] [--prints [--event <e>] [--year <y>] | --redirects | --lineage
859
+ | --associations [--school <school_id>]]
750
860
  idq teams [--release <spec>] [--event <e>] [--year <y>] [--rosters | --joins]
751
861
  idq events [--release <spec>] [--event <e>] [--year <y>]
862
+ idq upcoming [--release <spec>] [--state <s,...>] [--feis <id>] [--from <date>] [--to <date>]
863
+ idq upcoming --entrants <field_id> [--version <capture id>]
864
+ idq upcoming --feises [--state upcoming|no-results] [--brand <series>] [--from <date>] [--to <date>]
752
865
  idq teacher [--release <spec>] <name|TD number>
753
866
  idq adjudicator [--release <spec>] <name|TD number>
754
867
  idq comp [--release <spec>] <feis> <code> [--year y] [--title t]
@@ -759,7 +872,7 @@ is passed to the dancer resolver as asked (`rel.dancers`, above).
759
872
  [--oireachtas <region>[:<year>]]
760
873
  idq resolve registrations
761
874
 
762
- `stream` prints one JSON line per row (or entry), as it reads them. `dancer` prints the results of the one dancer where the answer is unique (every candidate's with
875
+ `stream` (and `tabs --stream`) prints one JSON line per row (or entry, or cell), as it reads them. `dancer` prints the results of the one dancer where the answer is unique (every candidate's with
763
876
  `--rows`). `--json` prints the call's answer as it is. `--cache` and `--repo` override the defaults.
764
877
 
765
878
  `update` moves to the newest published release, as a package manager's `update` moves to the newest