Record the release decisions and the work they set #11
@@ -354,9 +354,9 @@ without naming `sv_SE`:
|
||||
```
|
||||
|
||||
Renders e.g. `Hej, Pat Smith!`. A reference into a category is held like a
|
||||
[correlated](#correlated-fields) path — `{.person.first} {.person.last}` name one
|
||||
person, `{lowercase(.person.first)}` reads that same draw, and `{.person.first}`
|
||||
beside `{/sv_SE.person.last}` in `sv_SE` is one person too — while a bare
|
||||
[correlated](#correlated-fields) path — `{.person.femalefirst} {.person.last}` name
|
||||
one person, `{lowercase(.person.femalefirst)}` reads that same draw, and
|
||||
`{.person.femalefirst}` beside `{/sv_SE.person.last}` in `sv_SE` is one person too — while a bare
|
||||
`{/misc.uuid} {/misc.uuid}` is two draws. Rejected at `New`: a path that is
|
||||
unknown, names a folder, has no folder above, or reads a field not every variant
|
||||
of a choice carries, and a reference that leads back to its own value, directly,
|
||||
|
||||
@@ -1,28 +1,56 @@
|
||||
# Release checklist
|
||||
|
||||
What to settle before the first tag, then the work that follows in a later,
|
||||
data-heavy release.
|
||||
## Before v0.1.0
|
||||
|
||||
## Before the first release — settle the record flag and API contract
|
||||
The record API lands first, so the data update can use it.
|
||||
|
||||
- `--format` vocabulary — confirm `text`, `json`, `ndjson`, `csv`, `sql`; the
|
||||
`json`-as-array vs `ndjson`-as-lines split; `--table` (the SQL INSERT target);
|
||||
the `--separator` rejection on record formats; and the exit codes (misuse 2,
|
||||
runtime 1).
|
||||
- Library surface — confirm `Record`, `FakeRecord`, `NewRecordTemplate`,
|
||||
`RecordTemplate`, `Column`/`Columns()`, and the `JSON()`, `CSVHeader()`,
|
||||
`CSVLine()`, `SQLInsert()` serializers.
|
||||
- Typed scalars — columns are strings today (`"42"`, quoted SQL). Confirm that
|
||||
stays out of scope, or add a per-column `kind` before the tag.
|
||||
- Struct-filling — `fake:"..."` tags (reflection over an arbitrary struct) stay
|
||||
out of scope; `Columns()` hands the caller the values to map themselves.
|
||||
Confirm.
|
||||
- Independent reference draw — within one record every tailed reference to a
|
||||
category is one draw, with no spelling for "these columns should disagree".
|
||||
Confirm the per-record contract, or add the spelling.
|
||||
### Record API
|
||||
|
||||
## Later, in a data-heavy release
|
||||
- Rename the record entry points after the string ones: `Record(path)` becomes
|
||||
`FakeRecord(path)`, and `FakeRecord(inline)` becomes `FakeRecordTemplate(inline)`.
|
||||
- Typed columns — a column declares its type, so `json` writes `42` rather than
|
||||
`"42"` and `sql` an unquoted literal: string, integer, number, boolean, and a
|
||||
way to write null. A template that can render a value its type rejects is a
|
||||
load error. The option key is reserved from then on, so a common column name
|
||||
like `type` is a poor pick.
|
||||
- Struct-filling — fill a Go struct from `fake:"…"` tags holding a path or an
|
||||
inline template, for parity with gofakeit and go-faker. The field's Go type is
|
||||
the column type, through the same conversion and load checks as typed columns,
|
||||
and a nested struct is its own draw group. Revise the Decision "A record is a
|
||||
template seen as columns, not a second schema format" with that reason.
|
||||
- Draw groups — references into one category share one draw per render (one
|
||||
record, or one `Fake`) in both views; each `repeat` iteration draws anew, and a
|
||||
bare reference draws each time. An option naming a draw group splits a render
|
||||
into several entities. Replaces the Decision "A record shares one reference draw
|
||||
per category". Each expectation becomes a test:
|
||||
- `first`, `last` and `email` reading `person` → one person
|
||||
- `from_first`/`from_last` grouped `from`, `to_first`/`to_last` grouped `to` → two people
|
||||
- `host`, plus `guests` repeated 3 times → four people
|
||||
- `code` and `symbol` sibling fields reading `currency`, as `{code} {symbol}` → a matching pair
|
||||
- `{a} & {b}`, each reading `person` → one person, or two when `a` and `b` name different groups
|
||||
- two bare `{/sv_SE.word}` → two words
|
||||
|
||||
- Shipped-data de-duplication — `email.json`'s `local` is a drifted copy of
|
||||
`username.json`; fold it in when the shipped set grows and we add lots more
|
||||
data.
|
||||
### Data
|
||||
|
||||
- Major data update. Shipped categories render as records with their building
|
||||
blocks as columns (`sv_SE.person` → `femalefirst`, `malefirst`; `misc.uuid` →
|
||||
`variant`), and `sv_SE.address` draws its postal code apart from its locality.
|
||||
It also settles what a version promises about shipped data: its paths, its
|
||||
record columns, and whether a seed renders the same output across versions.
|
||||
- `email.local` and `username` share their handle lists, while their name
|
||||
variants differ on purpose. Share the lists only if that is a clean win.
|
||||
|
||||
### Release
|
||||
|
||||
- Versioning — semver tags, starting at `v0.1.0`; `v1.0.0` once the grammar
|
||||
settles. From v2 the module path carries `/vN` (`go.mod`, imports, the README's
|
||||
install lines), so fences ship batched into as few majors as possible. Reword
|
||||
the Decision "After the first tag, a new fence is a major version" to match:
|
||||
before `v1.0.0` a fence ships in a minor.
|
||||
- Changelog — `CHANGELOG.md`, started with `v0.1.0`; the fence Decision's
|
||||
"changelog" links there.
|
||||
- CLI without Go — investigate prebuilt binaries: GoReleaser publishing to Gitea
|
||||
releases, a container image, Homebrew and Scoop.
|
||||
- Homepage — a simple page for fejkdata with an in-browser generator: the library
|
||||
compiled to WebAssembly, so visitors generate as much data as they like in their
|
||||
own browser.
|
||||
|
||||
Reference in New Issue
Block a user