Files
fejkdata/CHANGELOG.md
T

9.4 KiB

Changelog

Format: Keep a Changelog. A release's Breaking section comes first and names each rejected spelling with its replacement, and each removed path, column or flag.

[Unreleased]

Added

  • Step up: .. after a row steps up to the row its link column names, so {/city[Oslo]..country.name} renders Norway, and . after it steps down again, drawing afresh. New refuses a .. naming anything but the parent table, and a selector after a ...
  • A path, given to Fake or referenced in a template, may not read into a level carrying a repeat, and List advertises no such path: where x carries "repeat": 3, Fake("x.a") fails naming the level x, and Fake("x") renders it whole.
  • Every {…} draws afresh, and a name is the one way to keep a pick: {p.a} {p.b}, {w} {uppercase(w)} and {/person.first} {/person.last} are two draws each, which {p as q}{q.a} {q.b} and {/person as n}{n.first} {n.last} make one. {/misc.territory as t} binds one row of misc.territory to t and prints nothing; {t}, {t.capital} and {lowercase(t.name)} read that one row. {x as n} binds a reference, a sibling field or a path into one; a name lives in the category binding it, and picks again on every iteration of a repeat, or every draw of a choice item, binding it. A struct's tags share its names, {/sv_SE.person as p}{p.first} beside {p.sex}. A name is a {calc()} operand: {/misc.coordinate.lat as lat}{calc(lat * 60)}. What New refuses is listed under Names.
  • First release: the CLI, the library and the shipped data set.
  • The CLI renders exactly the template on its stdin, echo '{/sv_SE.person} hihi' | fejkdata, and adds nothing under --format text: echo's newline ends the render, and --separator defaults to empty. Whitespace around a JSON object, array or string template is dropped, and a bare number or boolean is a format string, printed as written. A lone reference, {/users}, is the record users under --format. An argument other than a flag, or nothing piped in, exits 2; an empty or blank stdin is a format string, and renders as sent.
  • A template or data file loads whatever is well-formed and means one thing, even where part of it does nothing: a default written out; a one-item choice; an object holding only a format; a constant sample such as {int(5,5)}; a weight, separator or datatype where it does nothing; a name nothing reads; a repeated item, which counts as written; a weight of 0, which is never drawn; a repeat or count of 0, which renders nothing; +5, 05 and -0; and a reference into the category it sits in. A rows file no category names is ignored. New with no data loads, and renders templates that read none. The CLI's -n takes 0; --list ignores --repeat, --separator, --format and --table, and --table is ignored without --format sql.
  • Table categories: a category JSON naming a rows TSV beside it, with the options key, name, weight and parent; a path selects a row by key or name, misc.territory[SE], and descends to a linked table by name, one path drawing each row inside the row above it. rows is an option, so no template may carry a field of that name. A name without a key resolves inside the table's parent. Refused at New: a name without a key or a parent, a name repeating inside one parent row, a name spelling another row's key, and a table named like a column of any table above it.
  • misc.territory, misc.currency, misc.language, misc.httpstatus and misc.mimetype are tables. misc.territory is every ISO 3166-1 territory that has a capital, a currency and a TLD, with the columns calling-code, capital, country, currency, flag, languages, numeric and tld added, country holding the alpha-2 code of the sovereign state it belongs to and its own where it is one; misc.currency the current ISO 4217 currencies with a minor unit, with decimals and numeric added, and its symbols from CLDR; misc.language every ISO 639-2 entry carrying a 639-1 code, with a code3 column holding its 639-2/T code; misc.httpstatus each code the IANA registry lists with a plain reason phrase; and misc.mimetype each type mime-db records as IANA-registered and gives a filename extension. DATA-LICENSES.md lists each source.
  • misc.timezone, misc.car and misc.useragent are tables too. misc.timezone is every zone tzdb zone.tab gives a shipped territory, with offset holding the zone's standard UTC offset and territory linking to misc.territory, so misc.territory[SE].timezone draws Europe/Stockholm; zones of a territory misc.territory does not ship, Antarctica's among them, and the constant UTC are gone; spell that one as the text "UTC". A weight column carries the population GeoNames records in each zone, so a draw favours the zones people live in. misc.useragent is the top-user-agents desktop and mobile lists with browser, device and os columns. misc.car keeps its makes and models in a make and a model column.
  • misc.httpmethod, misc.protocol and misc.port are IANA's registries as tables. misc.httpmethod is the eight methods RFC 9110 defines and PATCH, carrying safe and idempotent as true or false; misc.protocol the keyword, its number and its name, selectable by either; misc.port renders a TCP port number, with the IANA service name beside it, keeping the first service the registry describes for a port so a number selects one row.
  • misc.tld is the IANA root zone as a table: every delegated TLD keyed with its leading dot, .se and .xn--p1ai, the register's type beside it, and a unicode column holding the form the register displays, so misc.tld[.рф] selects the row .xn--p1ai renders. A delegation the register marks "Not assigned" does not ship.
  • misc.loglevel is the eight syslog severities: the keyword a configuration writes, err and info, keyed by the numerical code a PRI encodes and selectable by either, with the severity RFC 5424 spells beside it.
  • geo.SE and geo.US: five linked tables per country, region, municipality, locality, postal-code and street, weighted by population and address counts and built from SCB, GeoNames, Trafikverket NVDB and the US Census Bureau, and an address record binding one locality and drawing its street and postal code inside it. sv_SE.address and en_US.address bind those records once, so en_US.address.street no longer carries name and suffix, and a locale folder loads only beside geo.
  • {date(from,to,'layout')} and {time('layout')}: a second between two days, or within one, in a single-quoted Go layout, drawn in UTC; from may equal to. sv_SE.date, en_US.date, sv_SE.time and en_US.time render through them, so date.year, date.month, date.day, time.hour, time.minute, time.minute.t, time.sec and time.ampm are no longer paths — a part of a date is now its own {date(…,'2006')}. misc.datetime is an RFC 3339 instant.
  • sex, first-name and last-name tables in sv_SE and en_US, weighted by bearers from SCB, the SSA and the Census Bureau; first-name links to sex, and a name both sexes carry is a row under each. person binds one first name and reads its sex through it, and its columns are first, last, prefix and sex; person.femalefirst and person.malefirst are no longer paths — draw sex[f].first-name and sex[m].first-name instead. en_US.title links to sex as well, so en_US.person.prefix draws Mr or Ms without contradicting the record's sex; sv_SE.title is an unsexed table of the same shape.
  • sv_SE.personnummer and sv_SE.samordningsnummer, Skatteverket's test series from a sv_SE.birth-number table under sex, in place of sv_SE.ssn, whose ssn.mmdd, ssn.mmdd.m and ssn.mmdd.d go with it. en_US.ssn now draws the ranges the SSA assigns and carries the columns area, group and serial, so echo '{/en_US.ssn}' | fejkdata --format csv writes a header where it used to fail; en_US.itin is new and carries the same three. person.prefix is null where a person has no title, where it used to be an empty string, so --format sql writes NULL and a string struct field reading it becomes *string.
  • en_US.phone-exchange draws the three digits after a US area code evenly from the codes NANPA may assign: 200 to 999, except 211, 311 … 911, 555, 950, 958, 959 and 976. en_US.phone draws its exchange from it.
  • ErrNoColumns is exported, so a caller can tell the one record fence a path can answer from the rest.
  • An error names a spelling that runs: a layout is named single-quoted and free of its own quotes, a row of a table with no key is named as the path that selects it, sv_SE.sex[f].first-name[Kim], and a category with no columns names the record that gives it one.
  • A data source whose root holds a .fejkdata.json manifest with an index loads each category on the first call reaching it, as the shipped set does, and a category failing there returns an error wrapping ErrLoad, on which the CLI exits 1. A source without one loads in New, with the shipped categories it reads and every shipped category depending on one it replaces; the rest of the shipped set still loads on first reach.