From 054f99c94f1e136d3c7eeb80744265c3ac5481aa Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Wed, 2 Sep 2026 12:38:59 +0200 Subject: [PATCH] One spelling per shape: reject a one-item choice, a repeated item and an inert object; reshape the data --- .gitignore | 1 + README.md | 49 +++++++++++---------- data/en_US/address.json | 41 ++++++++--------- data/en_US/company.json | 26 +++++------ data/en_US/date.json | 28 ++++++------ data/en_US/email.json | 55 +++++++++++------------ data/en_US/ip.json | 10 +++-- data/en_US/person.json | 23 +++------- data/en_US/phone.json | 8 ++-- data/en_US/price.json | 31 +++++-------- data/en_US/sentence.json | 4 +- data/en_US/ssn.json | 4 +- data/en_US/time.json | 14 +++--- data/en_US/url.json | 29 ++++++++----- data/en_US/username.json | 11 +++-- data/en_US/version.json | 14 +++--- data/misc/car.json | 16 +++---- data/misc/coordinate.json | 8 +--- data/misc/country.json | 40 ++++++++--------- data/misc/creditcard.json | 19 ++++++-- data/misc/currency.json | 32 +++++++------- data/misc/emoji.json | 7 +-- data/misc/httpstatus.json | 32 +++++++------- data/misc/language.json | 32 +++++++------- data/misc/mac.json | 4 +- data/misc/mimetype.json | 30 ++++++------- data/misc/objectid.json | 4 +- data/misc/timezone.json | 30 +------------ data/misc/useragent.json | 11 +---- data/misc/uuid.json | 7 +-- data/sv_SE/address.json | 46 +++++++++----------- data/sv_SE/company.json | 26 +++++------ data/sv_SE/date.json | 28 ++++++------ data/sv_SE/email.json | 55 +++++++++++------------ data/sv_SE/ip.json | 10 +++-- data/sv_SE/person.json | 73 ++++++++++++++----------------- data/sv_SE/phone.json | 12 ++--- data/sv_SE/price.json | 24 +++++----- data/sv_SE/sentence.json | 2 +- data/sv_SE/ssn.json | 47 ++++++++++---------- data/sv_SE/time.json | 25 +++++++---- data/sv_SE/url.json | 29 ++++++++----- data/sv_SE/username.json | 11 +++-- data/sv_SE/version.json | 14 +++--- fejkdata.go | 12 ++--- format-migration/reshape.py | 87 +++++++++++++++++++++++++++++++++++++ node.go | 70 +++++++++++++++++++++-------- reference.go | 16 +++---- render.go | 6 +-- 49 files changed, 620 insertions(+), 593 deletions(-) create mode 100755 format-migration/reshape.py diff --git a/.gitignore b/.gitignore index 71fd48f..28f4f54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .claude *.out +__pycache__/ todo.md \ No newline at end of file diff --git a/README.md b/README.md index a65c822..5c647bb 100644 --- a/README.md +++ b/README.md @@ -219,10 +219,11 @@ within a choice: ] ``` -Only template (object) nodes carry `weight` — a bare string or nested array in a -choice always counts as `1`. Weights are checked when you create the generator: a -negative, non-numeric, or all-zero set is rejected at `New`, so a typo fails -fast instead of silently skewing output. +A bare string or nested array in a choice counts as `1`; to weight a string, +write it as `{ "format": "AB", "weight": 3 }`. A repeated item is a load error +naming that spelling, and so is a `weight` of `1`. Weights are checked when you +create the generator: a negative, non-numeric, or all-zero set is rejected at +`New`, so a typo fails fast instead of silently skewing output. **Repeat.** A template node may carry a `repeat` (default `1`) to render its `format` that many times — each render an independent pick — joined by @@ -232,14 +233,16 @@ fast instead of silently skewing output. { "format": "{word}", "repeat": 3, "separator": " ", "word": ["foo", "bar", "baz"] } ``` -This yields e.g. `bar foo baz`. `repeat` must be a positive integer and +This yields e.g. `bar foo baz`. `repeat` must be an integer above `1` and `separator` a string, both checked at `New`. `format`, `weight`, `repeat` and `separator` are the only options; **any other key is a field**. So write `seperator` and you get a field by that name while the option stays unset. `New` rejects an option that cannot take effect — a -`separator` without a `repeat` above 1, a `weight` outside a choice — and a name -using a character the grammars reserve: `.` separates the segments of a path, `|` +`separator` without a `repeat`, a `weight` outside a choice, a `weight` or +`repeat` of `1` — an object holding only a `format` (that is a string; write it), +a one-item choice (that is its item; write it), and a name using a character the +grammars reserve: `.` separates the segments of a path, `|` the arms of a token, `(` opens a function call and `{` `}` delimit the token, so a name carrying one is a name no format could ever spell. An empty name goes the same way — it is no path segment at all, so `List` never offers it. That holds for a @@ -337,7 +340,7 @@ data dirs: ``` renders e.g. `Hej, Pat Smith!`. References are bound when you create the generator, so -a path that is unknown, names a folder, or steps through a multi-variant choice +a path that is unknown, names a folder, or steps through a choice fails at `New`. A reference that leads back to its own value (directly, mutually, or through a chain) is a cycle that would never finish rendering, so it too is rejected at `New`. @@ -401,7 +404,7 @@ The binding lasts for one expansion, so each `repeat` iteration draws again and nested template keeps its own. A field no dotted token addresses is unaffected: `{word} {word}` still draws twice. -`New` checks a path the way `Fake` resolves one: every variant of a multi-variant +`New` checks a path the way `Fake` resolves one: every variant of a choice must carry the whole path, so a row missing a field is named at load: ```text @@ -435,21 +438,19 @@ A lone `}` is a load error naming `}}`. **Putting it together** (`person.json`): ```json -[ - { - "format": "{prefix}{femalefirst|malefirst} {last}", - "femalefirst": ["Anna", "Astrid", "Elin"], - "malefirst": ["Anders", "Erik", "Gustav"], - "last": [ - { "format": "{first}sson", "first": ["Ander", "Erik", "Karl"] }, - ["Berg", "von Flemming"] - ], - "prefix": [ - "", - { "format": "{string} ", "string": ["dr", "prof"], "weight": 0.05 } - ] - } -] +{ + "format": "{prefix}{femalefirst|malefirst} {last}", + "femalefirst": ["Anna", "Astrid", "Elin"], + "malefirst": ["Anders", "Erik", "Gustav"], + "last": [ + { "format": "{first}sson", "first": ["Ander", "Erik", "Karl"] }, + ["Berg", "von Flemming"] + ], + "prefix": [ + "", + { "format": "{string} ", "string": ["dr", "prof"], "weight": 0.05 } + ] +} ``` This yields e.g. `Anna Eriksson`, `Erik Berg`, or rarely `dr Astrid von Flemming`. diff --git a/data/en_US/address.json b/data/en_US/address.json index bf71c64..d48eebe 100644 --- a/data/en_US/address.json +++ b/data/en_US/address.json @@ -1,24 +1,17 @@ -[ - { - "format": "{street-number} {street}\n{locality}, {region} {postal-code}", - "street": [ - { - "format": "{name} {suffix}", - "name": ["Adams", "Ashby", "Aspen", "Bay", "Birch", "Bridge", "Cedar", "Chestnut", "Church", "Clark", "Cypress", "Dogwood", "Elm", "Forest", "Franklin", "Garden", "Grove", "Hawthorn", "Hickory", "Highland", "Jackson", "Jefferson", "Juniper", "Lake", "Laurel", "Liberty", "Lincoln", "Madison", "Magnolia", "Maple", "Market", "Meadow", "Mill", "Oak", "Park", "Pine", "Poplar", "Prospect", "Ridge", "River", "Spruce", "Sunset", "Sycamore", "Union", "Walnut", "Washington", "Willow", "Wilson"], - "suffix": ["Avenue", "Boulevard", "Circle", "Court", "Drive", "Lane", "Place", "Road", "Street", "Terrace", "Trail", "Way"] - } - ], - "street-number": [ - { "format": "{int(10,99)}" }, - { "format": "{int(100,999)}", "weight": 2 }, - { "format": "{int(1000,9999)}", "weight": 0.5 }, - { "format": "{int(10,99)}{int(100,999)}", "weight": 0.3 } - ], - "locality": ["Albany", "Atlanta", "Austin", "Baltimore", "Boston", "Charlotte", "Chicago", "Cincinnati", "Cleveland", "Columbus", "Dallas", "Denver", "Detroit", "El Paso", "Fort Worth", "Fresno", "Houston", "Indianapolis", "Jacksonville", "Kansas City", "Las Vegas", "Long Beach", "Los Angeles", "Memphis", "Mesa", "Miami", "Milwaukee", "Minneapolis", "Nashville", "New Orleans", "Oakland", "Oklahoma City", "Omaha", "Orlando", "Philadelphia", "Phoenix", "Pittsburgh", "Portland", "Raleigh", "Sacramento", "San Antonio", "San Diego", "San Jose", "Seattle", "St. Louis", "Tampa", "Tucson", "Tulsa"], - "region": ["AL", "AZ", "CA", "CO", "CT", "FL", "GA", "IL", "IN", "KY", "LA", "MA", "MD", "MI", "MN", "MO", "NC", "NJ", "NV", "NY", "OH", "OK", "OR", "PA", "TN", "TX", "VA", "WA", "WI"], - "postal-code": [ - { "format": "{int(10000,99999)}" }, - { "format": "{int(10000,99999)}-{digits(4)}", "weight": 0.3 } - ] - } -] +{ + "format": "{street-number} {street}\n{locality}, {region} {postal-code}", + "street": { + "format": "{name} {suffix}", + "name": ["Adams", "Ashby", "Aspen", "Bay", "Birch", "Bridge", "Cedar", "Chestnut", "Church", "Clark", "Cypress", "Dogwood", "Elm", "Forest", "Franklin", "Garden", "Grove", "Hawthorn", "Hickory", "Highland", "Jackson", "Jefferson", "Juniper", "Lake", "Laurel", "Liberty", "Lincoln", "Madison", "Magnolia", "Maple", "Market", "Meadow", "Mill", "Oak", "Park", "Pine", "Poplar", "Prospect", "Ridge", "River", "Spruce", "Sunset", "Sycamore", "Union", "Walnut", "Washington", "Willow", "Wilson"], + "suffix": ["Avenue", "Boulevard", "Circle", "Court", "Drive", "Lane", "Place", "Road", "Street", "Terrace", "Trail", "Way"] + }, + "street-number": [ + "{int(10,99)}", + { "format": "{int(100,999)}", "weight": 2 }, + { "format": "{int(1000,9999)}", "weight": 0.5 }, + { "format": "{int(10,99)}{int(100,999)}", "weight": 0.3 } + ], + "locality": ["Albany", "Atlanta", "Austin", "Baltimore", "Boston", "Charlotte", "Chicago", "Cincinnati", "Cleveland", "Columbus", "Dallas", "Denver", "Detroit", "El Paso", "Fort Worth", "Fresno", "Houston", "Indianapolis", "Jacksonville", "Kansas City", "Las Vegas", "Long Beach", "Los Angeles", "Memphis", "Mesa", "Miami", "Milwaukee", "Minneapolis", "Nashville", "New Orleans", "Oakland", "Oklahoma City", "Omaha", "Orlando", "Philadelphia", "Phoenix", "Pittsburgh", "Portland", "Raleigh", "Sacramento", "San Antonio", "San Diego", "San Jose", "Seattle", "St. Louis", "Tampa", "Tucson", "Tulsa"], + "region": ["AL", "AZ", "CA", "CO", "CT", "FL", "GA", "IL", "IN", "KY", "LA", "MA", "MD", "MI", "MN", "MO", "NC", "NJ", "NV", "NY", "OH", "OK", "OR", "PA", "TN", "TX", "VA", "WA", "WI"], + "postal-code": ["{int(10000,99999)}", { "format": "{int(10000,99999)}-{digits(4)}", "weight": 0.3 }] +} diff --git a/data/en_US/company.json b/data/en_US/company.json index ab045a4..5b27b76 100644 --- a/data/en_US/company.json +++ b/data/en_US/company.json @@ -1,14 +1,12 @@ -[ - { - "format": "{base} {suffix}", - "base": [ - { - "format": "{a}{b}", - "a": ["Acme", "Apex", "Atlas", "Aurora", "Blue", "Bright", "Cedar", "Crest", "Delta", "Eagle", "Ever", "Fair", "Falcon", "Iron", "Maple", "North", "Onyx", "Pioneer", "Polar", "Prime", "Quartz", "River", "Silver", "Solar", "Summit", "Sun", "Swift", "True", "Vertex", "West"], - "b": ["bridge", "core", "field", "flow", "forge", "gate", "grid", "hub", "line", "logic", "mark", "nest", "path", "point", "scape", "soft", "span", "spark", "stone", "tech", "ware", "wave", "works", "yard"] - }, - ["Atlas Industries", "Beacon Labs", "Cedar & Vine", "Compass Group", "Evergreen Trading", "Harbor Logistics", "Hudson Partners", "Liberty Holdings", "Meridian Capital", "Northgate Studios", "Pinnacle Systems", "Riverside", "Sequoia Foods", "Smith & Sons", "Stonebridge Ventures", "Sunrise Bakery", "Wexford Holdings"] - ], - "suffix": ["Co.", "Corp.", "Group", "Inc.", "Inc.", "LLC", "LLC", "Ltd."] - } -] +{ + "format": "{base} {suffix}", + "base": [ + { + "format": "{a}{b}", + "a": ["Acme", "Apex", "Atlas", "Aurora", "Blue", "Bright", "Cedar", "Crest", "Delta", "Eagle", "Ever", "Fair", "Falcon", "Iron", "Maple", "North", "Onyx", "Pioneer", "Polar", "Prime", "Quartz", "River", "Silver", "Solar", "Summit", "Sun", "Swift", "True", "Vertex", "West"], + "b": ["bridge", "core", "field", "flow", "forge", "gate", "grid", "hub", "line", "logic", "mark", "nest", "path", "point", "scape", "soft", "span", "spark", "stone", "tech", "ware", "wave", "works", "yard"] + }, + ["Atlas Industries", "Beacon Labs", "Cedar & Vine", "Compass Group", "Evergreen Trading", "Harbor Logistics", "Hudson Partners", "Liberty Holdings", "Meridian Capital", "Northgate Studios", "Pinnacle Systems", "Riverside", "Sequoia Foods", "Smith & Sons", "Stonebridge Ventures", "Sunrise Bakery", "Wexford Holdings"] + ], + "suffix": ["Co.", "Corp.", "Group", { "format": "Inc.", "weight": 2 }, { "format": "LLC", "weight": 2 }, "Ltd."] +} diff --git a/data/en_US/date.json b/data/en_US/date.json index 05e6167..cf3b880 100644 --- a/data/en_US/date.json +++ b/data/en_US/date.json @@ -1,15 +1,13 @@ -[ - { - "format": "{month}/{day}/{year}", - "month": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"], - "day": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"], - "year": [ - { "format": "197{digits(1)}" }, - { "format": "198{digits(1)}" }, - { "format": "199{digits(1)}", "weight": 2 }, - { "format": "200{digits(1)}", "weight": 3 }, - { "format": "201{digits(1)}", "weight": 3 }, - { "format": "202{digits(1)}", "weight": 2 } - ] - } -] +{ + "format": "{month}/{day}/{year}", + "month": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"], + "day": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"], + "year": [ + "197{digits(1)}", + "198{digits(1)}", + { "format": "199{digits(1)}", "weight": 2 }, + { "format": "200{digits(1)}", "weight": 3 }, + { "format": "201{digits(1)}", "weight": 3 }, + { "format": "202{digits(1)}", "weight": 2 } + ] +} diff --git a/data/en_US/email.json b/data/en_US/email.json index efd9e8f..a24823b 100644 --- a/data/en_US/email.json +++ b/data/en_US/email.json @@ -1,29 +1,26 @@ -[ - { - "format": "{local}@{domain}", - "local": [ - { - "format": "{first}{sep}{last}{n}", - "weight": 3, - "first": ["alex", "amelia", "andrew", "anna", "ava", "benjamin", "carter", "charlotte", "chloe", "chris", "daniel", "david", "dylan", "elijah", "ella", "emily", "emma", "ethan", "evelyn", "gabriel", "grace", "hannah", "harper", "henry", "isaac", "isabella", "jack", "jacob", "james", "john", "joseph", "julia", "leah", "liam", "linda", "lily", "logan", "lucas", "luke", "mary", "mason", "matthew", "maya", "mia", "michael", "natalie", "noah", "nora", "oliver", "olivia", "owen", "patricia", "robert", "ryan", "samuel", "sarah", "sofia", "sophia", "thomas", "victoria", "william", "zoe"], - "last": ["adams", "allen", "anderson", "bailey", "baker", "bennett", "brooks", "brown", "campbell", "carter", "clark", "collins", "cook", "cooper", "davis", "edwards", "evans", "fisher", "flores", "foster", "garcia", "gonzalez", "gray", "green", "hall", "harris", "hayes", "hernandez", "hill", "howard", "hughes", "jackson", "jenkins", "johnson", "jones", "kelly", "king", "lee", "lewis", "long", "lopez", "martin", "martinez", "miller", "mitchell", "moore", "morgan", "morris", "murphy", "nelson", "parker", "perez", "perry", "phillips", "powell", "price", "reed", "reyes", "rivera", "roberts", "robinson", "rodriguez", "rogers", "ross", "russell", "sanchez", "sanders", "scott", "smith", "stewart", "sullivan", "taylor", "thomas", "thompson", "torres", "turner", "walker", "ward", "watson", "white", "williams", "wilson", "wood", "wright", "young"], - "sep": [".", ".", "_", "-", ""], - "n": ["", "", "", "1", "7", "21", "42", "88", "99", "2024"] - }, - { - "format": "{adj}{noun}{n}", - "weight": 2, - "adj": ["blue", "cool", "dark", "epic", "fast", "fluffy", "frosty", "funky", "fuzzy", "golden", "grumpy", "happy", "hyper", "jazzy", "lazy", "lucky", "mega", "mighty", "neon", "ninja", "quiet", "rad", "rusty", "salty", "shiny", "silent", "sleepy", "snappy", "sneaky", "spicy", "super", "swift", "turbo", "wild", "witty", "zany"], - "noun": ["badger", "banana", "comet", "dragon", "falcon", "ferret", "goblin", "hamster", "koala", "llama", "mango", "muffin", "narwhal", "ninja", "noodle", "otter", "panda", "penguin", "pickle", "pirate", "pixel", "potato", "pretzel", "raccoon", "raptor", "robot", "taco", "toast", "trunk", "turtle", "unicorn", "viking", "waffle", "walrus", "wizard", "yeti"], - "n": ["", "", "7", "13", "14", "42", "77", "99", "123", "420", "2024"] - }, - { - "format": "{w}{n}", - "weight": 1, - "w": ["blooper", "blupp", "boop", "byteme", "coolcat", "derpina", "doomguy", "epicgamer", "fizzbuzz", "glitchlord", "glorptron", "gronkzilla", "kapowski", "lazerwolf", "megashark", "mooncat", "narfle", "nightowl", "noodlemaster", "oofster", "pixelfox", "pixelpusher", "plonkers", "retrowave", "snork", "splatmaster", "stardust", "superdog", "voidwalker", "vroom", "wahoo", "waooooh", "wootwoot", "yeetus", "zapper", "zoomzoom"], - "n": ["", "", "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] - } - ], - "domain": ["example.com", "example.org", "example.net", "example.io", "example.co", "example.dev", "example.app", "mail.example.com", "mail.example.org", "webmail.example.net", "inbox.example.com", "post.example.org", "demo.example.net", "test.example.org", "dev.example.io"] - } -] +{ + "format": "{local}@{domain}", + "local": [ + { + "format": "{first}{sep}{last}{n}", + "weight": 3, + "first": ["alex", "amelia", "andrew", "anna", "ava", "benjamin", "carter", "charlotte", "chloe", "chris", "daniel", "david", "dylan", "elijah", "ella", "emily", "emma", "ethan", "evelyn", "gabriel", "grace", "hannah", "harper", "henry", "isaac", "isabella", "jack", "jacob", "james", "john", "joseph", "julia", "leah", "liam", "linda", "lily", "logan", "lucas", "luke", "mary", "mason", "matthew", "maya", "mia", "michael", "natalie", "noah", "nora", "oliver", "olivia", "owen", "patricia", "robert", "ryan", "samuel", "sarah", "sofia", "sophia", "thomas", "victoria", "william", "zoe"], + "last": ["adams", "allen", "anderson", "bailey", "baker", "bennett", "brooks", "brown", "campbell", "carter", "clark", "collins", "cook", "cooper", "davis", "edwards", "evans", "fisher", "flores", "foster", "garcia", "gonzalez", "gray", "green", "hall", "harris", "hayes", "hernandez", "hill", "howard", "hughes", "jackson", "jenkins", "johnson", "jones", "kelly", "king", "lee", "lewis", "long", "lopez", "martin", "martinez", "miller", "mitchell", "moore", "morgan", "morris", "murphy", "nelson", "parker", "perez", "perry", "phillips", "powell", "price", "reed", "reyes", "rivera", "roberts", "robinson", "rodriguez", "rogers", "ross", "russell", "sanchez", "sanders", "scott", "smith", "stewart", "sullivan", "taylor", "thomas", "thompson", "torres", "turner", "walker", "ward", "watson", "white", "williams", "wilson", "wood", "wright", "young"], + "sep": [{ "format": ".", "weight": 2 }, "_", "-", ""], + "n": [{ "format": "", "weight": 3 }, "1", "7", "21", "42", "88", "99", "2024"] + }, + { + "format": "{adj}{noun}{n}", + "weight": 2, + "adj": ["blue", "cool", "dark", "epic", "fast", "fluffy", "frosty", "funky", "fuzzy", "golden", "grumpy", "happy", "hyper", "jazzy", "lazy", "lucky", "mega", "mighty", "neon", "ninja", "quiet", "rad", "rusty", "salty", "shiny", "silent", "sleepy", "snappy", "sneaky", "spicy", "super", "swift", "turbo", "wild", "witty", "zany"], + "noun": ["badger", "banana", "comet", "dragon", "falcon", "ferret", "goblin", "hamster", "koala", "llama", "mango", "muffin", "narwhal", "ninja", "noodle", "otter", "panda", "penguin", "pickle", "pirate", "pixel", "potato", "pretzel", "raccoon", "raptor", "robot", "taco", "toast", "trunk", "turtle", "unicorn", "viking", "waffle", "walrus", "wizard", "yeti"], + "n": [{ "format": "", "weight": 2 }, "7", "13", "14", "42", "77", "99", "123", "420", "2024"] + }, + { + "format": "{w}{n}", + "w": ["blooper", "blupp", "boop", "byteme", "coolcat", "derpina", "doomguy", "epicgamer", "fizzbuzz", "glitchlord", "glorptron", "gronkzilla", "kapowski", "lazerwolf", "megashark", "mooncat", "narfle", "nightowl", "noodlemaster", "oofster", "pixelfox", "pixelpusher", "plonkers", "retrowave", "snork", "splatmaster", "stardust", "superdog", "voidwalker", "vroom", "wahoo", "waooooh", "wootwoot", "yeetus", "zapper", "zoomzoom"], + "n": [{ "format": "", "weight": 2 }, "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] + } + ], + "domain": ["example.com", "example.org", "example.net", "example.io", "example.co", "example.dev", "example.app", "mail.example.com", "mail.example.org", "webmail.example.net", "inbox.example.com", "post.example.org", "demo.example.net", "test.example.org", "dev.example.io"] +} diff --git a/data/en_US/ip.json b/data/en_US/ip.json index e16c78a..c9bf575 100644 --- a/data/en_US/ip.json +++ b/data/en_US/ip.json @@ -2,9 +2,11 @@ { "format": "{o}.{o}.{o}.{o}", "weight": 8, - "o": [{ "format": "{digits(1)}", "weight": 3 }, { "format": "{int(10,99)}", "weight": 4 }, { "format": "1{digits(2)}", "weight": 2 }] + "o": [ + { "format": "{digits(1)}", "weight": 3 }, + { "format": "{int(10,99)}", "weight": 4 }, + { "format": "1{digits(2)}", "weight": 2 } + ] }, - { - "format": "{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}" - } + "{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}" ] diff --git a/data/en_US/person.json b/data/en_US/person.json index c6ff20f..3377a48 100644 --- a/data/en_US/person.json +++ b/data/en_US/person.json @@ -1,16 +1,7 @@ -[ - { - "format": "{prefix}{femalefirst|malefirst} {last}", - "femalefirst": ["Abigail", "Addison", "Amelia", "Aria", "Aubrey", "Audrey", "Aurora", "Ava", "Bella", "Brooklyn", "Camila", "Caroline", "Charlotte", "Chloe", "Claire", "Eleanor", "Elizabeth", "Ella", "Ellie", "Emily", "Emma", "Evelyn", "Gianna", "Grace", "Hannah", "Harper", "Hazel", "Isabella", "Layla", "Leah", "Lillian", "Lily", "Lucy", "Luna", "Madison", "Maya", "Mia", "Mila", "Naomi", "Natalie", "Nora", "Olivia", "Paisley", "Penelope", "Riley", "Savannah", "Scarlett", "Sofia", "Sophia", "Stella", "Victoria", "Violet", "Zoe"], - "malefirst": ["Aiden", "Alexander", "Andrew", "Anthony", "Asher", "Benjamin", "Caleb", "Carter", "Charles", "Christopher", "Daniel", "David", "Dylan", "Elijah", "Ethan", "Ezra", "Gabriel", "Grayson", "Henry", "Isaac", "Jack", "Jackson", "Jacob", "James", "Jayden", "John", "Joseph", "Joshua", "Julian", "Levi", "Liam", "Lincoln", "Logan", "Lucas", "Luke", "Mason", "Mateo", "Matthew", "Michael", "Nathan", "Noah", "Oliver", "Owen", "Samuel", "Sebastian", "Theodore", "Thomas", "William", "Wyatt"], - "last": ["Adams", "Allen", "Anderson", "Bailey", "Baker", "Bell", "Bennett", "Brooks", "Brown", "Campbell", "Carter", "Clark", "Collins", "Cook", "Cooper", "Cox", "Davis", "Edwards", "Evans", "Flores", "Foster", "Garcia", "Gonzalez", "Gray", "Green", "Hall", "Harris", "Hayes", "Hernandez", "Hill", "Howard", "Hughes", "Jackson", "James", "Jenkins", "Johnson", "Jones", "Kelly", "King", "Lee", "Lewis", "Long", "Lopez", "Martin", "Martinez", "Miller", "Mitchell", "Moore", "Morgan", "Morris", "Murphy", "Nelson", "Parker", "Perez", "Perry", "Peterson", "Phillips", "Powell", "Price", "Ramirez", "Reed", "Richardson", "Rivera", "Roberts", "Robinson", "Rodriguez", "Rogers", "Ross", "Russell", "Sanchez", "Sanders", "Scott", "Smith", "Stewart", "Sullivan", "Taylor", "Thomas", "Thompson", "Torres", "Turner", "Walker", "Ward", "Watson", "White", "Williams", "Wilson", "Wood", "Wright", "Young"], - "prefix": [ - "", - { - "format": "{title} ", - "title": ["Dr", "Miss", "Mr", "Mrs", "Ms", "Mx", "Prof"], - "weight": 0.1 - } - ] - } -] +{ + "format": "{prefix}{femalefirst|malefirst} {last}", + "femalefirst": ["Abigail", "Addison", "Amelia", "Aria", "Aubrey", "Audrey", "Aurora", "Ava", "Bella", "Brooklyn", "Camila", "Caroline", "Charlotte", "Chloe", "Claire", "Eleanor", "Elizabeth", "Ella", "Ellie", "Emily", "Emma", "Evelyn", "Gianna", "Grace", "Hannah", "Harper", "Hazel", "Isabella", "Layla", "Leah", "Lillian", "Lily", "Lucy", "Luna", "Madison", "Maya", "Mia", "Mila", "Naomi", "Natalie", "Nora", "Olivia", "Paisley", "Penelope", "Riley", "Savannah", "Scarlett", "Sofia", "Sophia", "Stella", "Victoria", "Violet", "Zoe"], + "malefirst": ["Aiden", "Alexander", "Andrew", "Anthony", "Asher", "Benjamin", "Caleb", "Carter", "Charles", "Christopher", "Daniel", "David", "Dylan", "Elijah", "Ethan", "Ezra", "Gabriel", "Grayson", "Henry", "Isaac", "Jack", "Jackson", "Jacob", "James", "Jayden", "John", "Joseph", "Joshua", "Julian", "Levi", "Liam", "Lincoln", "Logan", "Lucas", "Luke", "Mason", "Mateo", "Matthew", "Michael", "Nathan", "Noah", "Oliver", "Owen", "Samuel", "Sebastian", "Theodore", "Thomas", "William", "Wyatt"], + "last": ["Adams", "Allen", "Anderson", "Bailey", "Baker", "Bell", "Bennett", "Brooks", "Brown", "Campbell", "Carter", "Clark", "Collins", "Cook", "Cooper", "Cox", "Davis", "Edwards", "Evans", "Flores", "Foster", "Garcia", "Gonzalez", "Gray", "Green", "Hall", "Harris", "Hayes", "Hernandez", "Hill", "Howard", "Hughes", "Jackson", "James", "Jenkins", "Johnson", "Jones", "Kelly", "King", "Lee", "Lewis", "Long", "Lopez", "Martin", "Martinez", "Miller", "Mitchell", "Moore", "Morgan", "Morris", "Murphy", "Nelson", "Parker", "Perez", "Perry", "Peterson", "Phillips", "Powell", "Price", "Ramirez", "Reed", "Richardson", "Rivera", "Roberts", "Robinson", "Rodriguez", "Rogers", "Ross", "Russell", "Sanchez", "Sanders", "Scott", "Smith", "Stewart", "Sullivan", "Taylor", "Thomas", "Thompson", "Torres", "Turner", "Walker", "Ward", "Watson", "White", "Williams", "Wilson", "Wood", "Wright", "Young"], + "prefix": ["", { "format": "{title} ", "title": ["Dr", "Miss", "Mr", "Mrs", "Ms", "Mx", "Prof"], "weight": 0.1 }] +} diff --git a/data/en_US/phone.json b/data/en_US/phone.json index 20f65ab..b47298b 100644 --- a/data/en_US/phone.json +++ b/data/en_US/phone.json @@ -3,13 +3,13 @@ "format": "({area}) {exch}-{line}", "weight": 2, "area": ["202", "212", "213", "305", "312", "404", "415", "469", "503", "512", "602", "617", "646", "702", "718", "720", "737", "773", "786", "808", "917"], - "exch": [{ "format": "{int(100,999)}" }], - "line": [{ "format": "{digits(4)}" }] + "exch": "{int(100,999)}", + "line": "{digits(4)}" }, { "format": "{area}-{exch}-{line}", "area": ["202", "212", "213", "305", "312", "404", "415", "469", "503", "512", "602", "617", "646", "702", "718", "720", "737", "773", "786", "808", "917"], - "exch": [{ "format": "{int(100,999)}" }], - "line": [{ "format": "{digits(4)}" }] + "exch": "{int(100,999)}", + "line": "{digits(4)}" } ] diff --git a/data/en_US/price.json b/data/en_US/price.json index 84c3c87..2719fa0 100644 --- a/data/en_US/price.json +++ b/data/en_US/price.json @@ -1,19 +1,12 @@ -[ - { - "format": "${amt}.{cents}", - "amt": [ - { "format": "{int(1,9)}", "weight": 2 }, - { "format": "{int(10,99)}", "weight": 4 }, - { "format": "{int(100,999)}", "weight": 3 }, - { "format": "{int(1,9)},{digits(3)}", "weight": 1 }, - { "format": "{int(10,99)},{digits(3)}", "weight": 0.4 }, - { "format": "{int(100,999)},{digits(3)}", "weight": 0.1 } - ], - "cents": [ - { "format": "{digits(2)}", "weight": 3 }, - "49", - "95", - "99" - ] - } -] +{ + "format": "${amt}.{cents}", + "amt": [ + { "format": "{int(1,9)}", "weight": 2 }, + { "format": "{int(10,99)}", "weight": 4 }, + { "format": "{int(100,999)}", "weight": 3 }, + "{int(1,9)},{digits(3)}", + { "format": "{int(10,99)},{digits(3)}", "weight": 0.4 }, + { "format": "{int(100,999)},{digits(3)}", "weight": 0.1 } + ], + "cents": [{ "format": "{digits(2)}", "weight": 3 }, "49", "95", "99"] +} diff --git a/data/en_US/sentence.json b/data/en_US/sentence.json index d844cf6..2f02dfe 100644 --- a/data/en_US/sentence.json +++ b/data/en_US/sentence.json @@ -7,7 +7,7 @@ "noun": ["anchor", "archer", "beacon", "bridge", "captain", "cavern", "cottage", "ember", "engine", "falcon", "ferry", "forest", "fox", "garden", "glacier", "harbor", "hermit", "hollow", "island", "lantern", "lighthouse", "mariner", "meadow", "mountain", "orchard", "otter", "pilgrim", "prairie", "quarry", "raven", "ridge", "river", "sailor", "scholar", "signal", "sparrow", "stranger", "summit", "thicket", "tower", "traveler", "valley", "voyager", "wanderer", "willow", "woodland"], "verb": ["abandons", "anchors", "awakens", "befriends", "builds", "calms", "carries", "chases", "conceals", "crosses", "embraces", "follows", "gathers", "greets", "guards", "guides", "haunts", "heralds", "honors", "kindles", "leads", "mends", "mirrors", "outlasts", "ponders", "reveals", "salutes", "shapes", "shelters", "shields", "summons", "tends", "traces", "weathers"], "prep": ["above", "across", "against", "alongside", "amid", "around", "beneath", "beside", "between", "beyond", "near", "over", "past", "through", "toward", "under", "within"], - "end": [".", ".", ".", ".", "!"] + "end": [{ "format": ".", "weight": 4 }, "!"] }, { "format": "{lead} {noun} {adv} {verb} {prep} {adj} {noun}{end}", @@ -18,7 +18,7 @@ "verb": ["builds", "carries", "chases", "crosses", "follows", "gathers", "guards", "guides", "leads", "mirrors", "outlasts", "reveals", "shapes", "shelters", "summons", "tends", "traces", "weathers"], "adj": ["ancient", "bright", "distant", "fierce", "fragile", "gentle", "golden", "hidden", "lonely", "quiet", "restless", "rugged", "silent", "stormy", "weary", "wild"], "prep": ["across", "against", "alongside", "amid", "beneath", "between", "beyond", "near", "over", "past", "through", "toward", "within"], - "end": [".", ".", ".", "!"] + "end": [{ "format": ".", "weight": 3 }, "!"] }, { "format": "{q} {adj} {noun} {verb} {prep} {adj} {noun}?", diff --git a/data/en_US/ssn.json b/data/en_US/ssn.json index b114ca6..501335d 100644 --- a/data/en_US/ssn.json +++ b/data/en_US/ssn.json @@ -1,3 +1 @@ -[ - { "format": "{int(100,999)}-{digits(2)}-{digits(4)}" } -] +"{int(100,999)}-{digits(2)}-{digits(4)}" diff --git a/data/en_US/time.json b/data/en_US/time.json index 09fd32d..1c69ac9 100644 --- a/data/en_US/time.json +++ b/data/en_US/time.json @@ -1,8 +1,6 @@ -[ - { - "format": "{hour}:{minute} {ampm}", - "hour": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], - "minute": [{ "format": "{t}{digits(1)}", "t": ["0", "1", "2", "3", "4", "5"] }], - "ampm": ["AM", "PM"] - } -] +{ + "format": "{hour}:{minute} {ampm}", + "hour": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], + "minute": { "format": "{t}{digits(1)}", "t": ["0", "1", "2", "3", "4", "5"] }, + "ampm": ["AM", "PM"] +} diff --git a/data/en_US/url.json b/data/en_US/url.json index d033d72..29a784b 100644 --- a/data/en_US/url.json +++ b/data/en_US/url.json @@ -1,12 +1,17 @@ -[ - { - "format": "https://{host}{path}", - "host": ["example.com", "www.example.com", "example.org", "www.example.org", "example.net", "example.io", "example.co", "blog.example.com", "blog.example.net", "shop.example.com", "store.example.org", "app.example.io", "api.example.com", "docs.example.org", "news.example.net", "mail.example.com"], - "path": [ - "", - "", - { "format": "/{seg}", "seg": ["about", "account", "blog", "careers", "cart", "categories", "checkout", "contact", "dashboard", "downloads", "events", "faq", "features", "help", "home", "items", "login", "news", "order", "pricing", "privacy", "products", "profile", "register", "search", "settings", "signup", "support", "terms", "welcome"] }, - { "format": "/{seg}/{sub}", "weight": 0.5, "seg": ["blog", "docs", "help", "products", "category", "user"], "sub": ["getting-started", "overview", "guide", "2024", "latest", "popular", "archive", "details"] } - ] - } -] +{ + "format": "https://{host}{path}", + "host": ["example.com", "www.example.com", "example.org", "www.example.org", "example.net", "example.io", "example.co", "blog.example.com", "blog.example.net", "shop.example.com", "store.example.org", "app.example.io", "api.example.com", "docs.example.org", "news.example.net", "mail.example.com"], + "path": [ + { "format": "", "weight": 2 }, + { + "format": "/{seg}", + "seg": ["about", "account", "blog", "careers", "cart", "categories", "checkout", "contact", "dashboard", "downloads", "events", "faq", "features", "help", "home", "items", "login", "news", "order", "pricing", "privacy", "products", "profile", "register", "search", "settings", "signup", "support", "terms", "welcome"] + }, + { + "format": "/{seg}/{sub}", + "weight": 0.5, + "seg": ["blog", "docs", "help", "products", "category", "user"], + "sub": ["getting-started", "overview", "guide", "2024", "latest", "popular", "archive", "details"] + } + ] +} diff --git a/data/en_US/username.json b/data/en_US/username.json index 9aa8743..5624d8a 100644 --- a/data/en_US/username.json +++ b/data/en_US/username.json @@ -4,21 +4,20 @@ "weight": 2, "first": ["alex", "ash", "avery", "bailey", "blake", "cameron", "casey", "charlie", "chris", "dakota", "drew", "elliot", "emerson", "finley", "frankie", "harley", "hayden", "jamie", "jordan", "kai", "kendall", "lane", "logan", "morgan", "parker", "quinn", "reese", "riley", "rowan", "sam", "sawyer", "skyler", "spencer", "taylor"], "last": ["adams", "brooks", "carter", "cole", "evans", "fisher", "fox", "grant", "gray", "hayes", "hunt", "lane", "lowe", "marsh", "mason", "morris", "north", "page", "quinn", "reed", "rhodes", "shaw", "stone", "vale", "wells", "west", "wolfe"], - "sep": ["", "", "", ".", "_"], - "n": ["", "", "", "", "1", "7", "12", "23", "42", "77", "99", "2024"] + "sep": [{ "format": "", "weight": 3 }, ".", "_"], + "n": [{ "format": "", "weight": 4 }, "1", "7", "12", "23", "42", "77", "99", "2024"] }, { "format": "{adj}{sep}{noun}{n}", "weight": 2, "adj": ["bluish", "brave", "chill", "cosmic", "cool", "dizzy", "electric", "epic", "fluffy", "frosty", "funky", "fuzzy", "golden", "groovy", "grumpy", "happy", "hyper", "jazzy", "lucky", "mega", "mighty", "neon", "nimble", "quirky", "rad", "rusty", "salty", "shiny", "silent", "sleepy", "snappy", "sneaky", "sparkly", "spicy", "sunny", "super", "swift", "turbo", "wild", "witty", "zany"], "noun": ["badger", "biscuit", "cactus", "comet", "donut", "dragon", "falcon", "ferret", "gizmo", "goblin", "hamster", "koala", "llama", "mango", "muffin", "narwhal", "noodle", "otter", "panda", "penguin", "pickle", "pirate", "pixel", "potato", "pretzel", "raccoon", "raptor", "robot", "taco", "toast", "trunk", "turtle", "unicorn", "viking", "waffle", "walrus", "wizard", "yeti"], - "sep": ["", "", "", ".", "_"], - "n": ["", "", "7", "13", "42", "77", "99", "123", "420", "2024"] + "sep": [{ "format": "", "weight": 3 }, ".", "_"], + "n": [{ "format": "", "weight": 2 }, "7", "13", "42", "77", "99", "123", "420", "2024"] }, { "format": "{w}{n}", - "weight": 1, "w": ["blooper", "blupp", "boop", "byteme", "coolcat", "derpina", "doomguy", "epicgamer", "fizzbuzz", "glitchlord", "glorptron", "gronkzilla", "kapowski", "lazerwolf", "megashark", "mooncat", "narfle", "nightowl", "noodlemaster", "oofster", "pixelfox", "pixelpusher", "plonkers", "retrowave", "snork", "splatmaster", "stardust", "superdog", "voidwalker", "vroom", "wahoo", "waooooh", "wootwoot", "yeetus", "zapper", "zoomzoom"], - "n": ["", "", "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] + "n": [{ "format": "", "weight": 2 }, "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] } ] diff --git a/data/en_US/version.json b/data/en_US/version.json index f0806d4..43be399 100644 --- a/data/en_US/version.json +++ b/data/en_US/version.json @@ -1,8 +1,6 @@ -[ - { - "format": "{pre}{n}.{n}.{n}{suffix}", - "n": [{ "format": "{digits(1)}", "weight": 3 }, { "format": "{int(10,99)}" }], - "pre": ["", { "format": "v", "weight": 0.4 }], - "suffix": ["", { "format": "-{tag}.{m}", "tag": ["alpha", "beta", "rc"], "m": ["1", "2", "3"], "weight": 0.3 }] - } -] +{ + "format": "{pre}{n}.{n}.{n}{suffix}", + "n": [{ "format": "{digits(1)}", "weight": 3 }, "{int(10,99)}"], + "pre": ["", { "format": "v", "weight": 0.4 }], + "suffix": ["", { "format": "-{tag}.{m}", "tag": ["alpha", "beta", "rc"], "m": ["1", "2", "3"], "weight": 0.3 }] +} diff --git a/data/misc/car.json b/data/misc/car.json index 208e638..91886c6 100644 --- a/data/misc/car.json +++ b/data/misc/car.json @@ -1,10 +1,10 @@ [ - { "format": "{maker} {model}", "maker": ["BMW"], "model": ["3 Series", "5 Series", "X3", "X5"] }, - { "format": "{maker} {model}", "maker": ["Ford"], "model": ["Fiesta", "Focus", "Mustang", "Explorer"] }, - { "format": "{maker} {model}", "maker": ["Honda"], "model": ["Civic", "Accord", "CR-V", "Jazz"] }, - { "format": "{maker} {model}", "maker": ["Mercedes-Benz"], "model": ["A-Class", "C-Class", "E-Class", "GLC"] }, - { "format": "{maker} {model}", "maker": ["Tesla"], "model": ["Model 3", "Model S", "Model X", "Model Y"] }, - { "format": "{maker} {model}", "maker": ["Toyota"], "model": ["Corolla", "Camry", "RAV4", "Yaris"] }, - { "format": "{maker} {model}", "maker": ["Volkswagen"], "model": ["Golf", "Passat", "Polo", "Tiguan"] }, - { "format": "{maker} {model}", "maker": ["Volvo"], "model": ["XC40", "XC60", "XC90", "V60"] } + { "format": "{maker} {model}", "maker": "BMW", "model": ["3 Series", "5 Series", "X3", "X5"] }, + { "format": "{maker} {model}", "maker": "Ford", "model": ["Fiesta", "Focus", "Mustang", "Explorer"] }, + { "format": "{maker} {model}", "maker": "Honda", "model": ["Civic", "Accord", "CR-V", "Jazz"] }, + { "format": "{maker} {model}", "maker": "Mercedes-Benz", "model": ["A-Class", "C-Class", "E-Class", "GLC"] }, + { "format": "{maker} {model}", "maker": "Tesla", "model": ["Model 3", "Model S", "Model X", "Model Y"] }, + { "format": "{maker} {model}", "maker": "Toyota", "model": ["Corolla", "Camry", "RAV4", "Yaris"] }, + { "format": "{maker} {model}", "maker": "Volkswagen", "model": ["Golf", "Passat", "Polo", "Tiguan"] }, + { "format": "{maker} {model}", "maker": "Volvo", "model": ["XC40", "XC60", "XC90", "V60"] } ] diff --git a/data/misc/coordinate.json b/data/misc/coordinate.json index b00f222..d2a35a7 100644 --- a/data/misc/coordinate.json +++ b/data/misc/coordinate.json @@ -1,7 +1 @@ -[ - { - "format": "{lat}, {lon}", - "lat": { "format": "{float(-90,90,6)}" }, - "lon": { "format": "{float(-180,180,6)}" } - } -] +{ "format": "{lat}, {lon}", "lat": "{float(-90,90,6)}", "lon": "{float(-180,180,6)}" } diff --git a/data/misc/country.json b/data/misc/country.json index cf6ae99..dc58f22 100644 --- a/data/misc/country.json +++ b/data/misc/country.json @@ -1,22 +1,22 @@ [ - { "format": "{name}", "name": ["Australia"], "alpha2": ["AU"], "alpha3": ["AUS"] }, - { "format": "{name}", "name": ["Brazil"], "alpha2": ["BR"], "alpha3": ["BRA"] }, - { "format": "{name}", "name": ["Canada"], "alpha2": ["CA"], "alpha3": ["CAN"] }, - { "format": "{name}", "name": ["China"], "alpha2": ["CN"], "alpha3": ["CHN"] }, - { "format": "{name}", "name": ["Denmark"], "alpha2": ["DK"], "alpha3": ["DNK"] }, - { "format": "{name}", "name": ["Finland"], "alpha2": ["FI"], "alpha3": ["FIN"] }, - { "format": "{name}", "name": ["France"], "alpha2": ["FR"], "alpha3": ["FRA"] }, - { "format": "{name}", "name": ["Germany"], "alpha2": ["DE"], "alpha3": ["DEU"] }, - { "format": "{name}", "name": ["India"], "alpha2": ["IN"], "alpha3": ["IND"] }, - { "format": "{name}", "name": ["Italy"], "alpha2": ["IT"], "alpha3": ["ITA"] }, - { "format": "{name}", "name": ["Japan"], "alpha2": ["JP"], "alpha3": ["JPN"] }, - { "format": "{name}", "name": ["Mexico"], "alpha2": ["MX"], "alpha3": ["MEX"] }, - { "format": "{name}", "name": ["Netherlands"], "alpha2": ["NL"], "alpha3": ["NLD"] }, - { "format": "{name}", "name": ["Norway"], "alpha2": ["NO"], "alpha3": ["NOR"] }, - { "format": "{name}", "name": ["Poland"], "alpha2": ["PL"], "alpha3": ["POL"] }, - { "format": "{name}", "name": ["Spain"], "alpha2": ["ES"], "alpha3": ["ESP"] }, - { "format": "{name}", "name": ["Sweden"], "alpha2": ["SE"], "alpha3": ["SWE"] }, - { "format": "{name}", "name": ["Switzerland"], "alpha2": ["CH"], "alpha3": ["CHE"] }, - { "format": "{name}", "name": ["United Kingdom"], "alpha2": ["GB"], "alpha3": ["GBR"] }, - { "format": "{name}", "name": ["United States"], "alpha2": ["US"], "alpha3": ["USA"] } + { "format": "{name}", "name": "Australia", "alpha2": "AU", "alpha3": "AUS" }, + { "format": "{name}", "name": "Brazil", "alpha2": "BR", "alpha3": "BRA" }, + { "format": "{name}", "name": "Canada", "alpha2": "CA", "alpha3": "CAN" }, + { "format": "{name}", "name": "China", "alpha2": "CN", "alpha3": "CHN" }, + { "format": "{name}", "name": "Denmark", "alpha2": "DK", "alpha3": "DNK" }, + { "format": "{name}", "name": "Finland", "alpha2": "FI", "alpha3": "FIN" }, + { "format": "{name}", "name": "France", "alpha2": "FR", "alpha3": "FRA" }, + { "format": "{name}", "name": "Germany", "alpha2": "DE", "alpha3": "DEU" }, + { "format": "{name}", "name": "India", "alpha2": "IN", "alpha3": "IND" }, + { "format": "{name}", "name": "Italy", "alpha2": "IT", "alpha3": "ITA" }, + { "format": "{name}", "name": "Japan", "alpha2": "JP", "alpha3": "JPN" }, + { "format": "{name}", "name": "Mexico", "alpha2": "MX", "alpha3": "MEX" }, + { "format": "{name}", "name": "Netherlands", "alpha2": "NL", "alpha3": "NLD" }, + { "format": "{name}", "name": "Norway", "alpha2": "NO", "alpha3": "NOR" }, + { "format": "{name}", "name": "Poland", "alpha2": "PL", "alpha3": "POL" }, + { "format": "{name}", "name": "Spain", "alpha2": "ES", "alpha3": "ESP" }, + { "format": "{name}", "name": "Sweden", "alpha2": "SE", "alpha3": "SWE" }, + { "format": "{name}", "name": "Switzerland", "alpha2": "CH", "alpha3": "CHE" }, + { "format": "{name}", "name": "United Kingdom", "alpha2": "GB", "alpha3": "GBR" }, + { "format": "{name}", "name": "United States", "alpha2": "US", "alpha3": "USA" } ] diff --git a/data/misc/creditcard.json b/data/misc/creditcard.json index f2d1517..0bdce70 100644 --- a/data/misc/creditcard.json +++ b/data/misc/creditcard.json @@ -1,5 +1,18 @@ [ - { "format": "4{d}{luhn()}", "d": { "format": "{digits(1)}", "repeat": 14 }, "weight": 4 }, - { "format": "5{m}{d}{luhn()}", "m": ["1", "2", "3", "4", "5"], "d": { "format": "{digits(1)}", "repeat": 13 }, "weight": 3 }, - { "format": "3{m}{d}{luhn()}", "m": ["4", "7"], "d": { "format": "{digits(1)}", "repeat": 12 }, "weight": 1 } + { + "format": "4{d}{luhn()}", + "d": { "format": "{digits(1)}", "repeat": 14 }, + "weight": 4 + }, + { + "format": "5{m}{d}{luhn()}", + "m": ["1", "2", "3", "4", "5"], + "d": { "format": "{digits(1)}", "repeat": 13 }, + "weight": 3 + }, + { + "format": "3{m}{d}{luhn()}", + "m": ["4", "7"], + "d": { "format": "{digits(1)}", "repeat": 12 } + } ] diff --git a/data/misc/currency.json b/data/misc/currency.json index 7e79b8a..6427331 100644 --- a/data/misc/currency.json +++ b/data/misc/currency.json @@ -1,18 +1,18 @@ [ - { "format": "{code}", "code": ["AUD"], "name": ["Australian Dollar"], "symbol": ["$"] }, - { "format": "{code}", "code": ["BRL"], "name": ["Brazilian Real"], "symbol": ["R$"] }, - { "format": "{code}", "code": ["CAD"], "name": ["Canadian Dollar"], "symbol": ["$"] }, - { "format": "{code}", "code": ["CHF"], "name": ["Swiss Franc"], "symbol": ["CHF"] }, - { "format": "{code}", "code": ["CNY"], "name": ["Chinese Yuan"], "symbol": ["¥"] }, - { "format": "{code}", "code": ["DKK"], "name": ["Danish Krone"], "symbol": ["kr"] }, - { "format": "{code}", "code": ["EUR"], "name": ["Euro"], "symbol": ["€"] }, - { "format": "{code}", "code": ["GBP"], "name": ["Pound Sterling"], "symbol": ["£"] }, - { "format": "{code}", "code": ["INR"], "name": ["Indian Rupee"], "symbol": ["₹"] }, - { "format": "{code}", "code": ["JPY"], "name": ["Japanese Yen"], "symbol": ["¥"] }, - { "format": "{code}", "code": ["MXN"], "name": ["Mexican Peso"], "symbol": ["$"] }, - { "format": "{code}", "code": ["NOK"], "name": ["Norwegian Krone"], "symbol": ["kr"] }, - { "format": "{code}", "code": ["PLN"], "name": ["Polish Zloty"], "symbol": ["zł"] }, - { "format": "{code}", "code": ["SEK"], "name": ["Swedish Krona"], "symbol": ["kr"] }, - { "format": "{code}", "code": ["USD"], "name": ["US Dollar"], "symbol": ["$"] }, - { "format": "{code}", "code": ["ZAR"], "name": ["South African Rand"], "symbol": ["R"] } + { "format": "{code}", "code": "AUD", "name": "Australian Dollar", "symbol": "$" }, + { "format": "{code}", "code": "BRL", "name": "Brazilian Real", "symbol": "R$" }, + { "format": "{code}", "code": "CAD", "name": "Canadian Dollar", "symbol": "$" }, + { "format": "{code}", "code": "CHF", "name": "Swiss Franc", "symbol": "CHF" }, + { "format": "{code}", "code": "CNY", "name": "Chinese Yuan", "symbol": "¥" }, + { "format": "{code}", "code": "DKK", "name": "Danish Krone", "symbol": "kr" }, + { "format": "{code}", "code": "EUR", "name": "Euro", "symbol": "€" }, + { "format": "{code}", "code": "GBP", "name": "Pound Sterling", "symbol": "£" }, + { "format": "{code}", "code": "INR", "name": "Indian Rupee", "symbol": "₹" }, + { "format": "{code}", "code": "JPY", "name": "Japanese Yen", "symbol": "¥" }, + { "format": "{code}", "code": "MXN", "name": "Mexican Peso", "symbol": "$" }, + { "format": "{code}", "code": "NOK", "name": "Norwegian Krone", "symbol": "kr" }, + { "format": "{code}", "code": "PLN", "name": "Polish Zloty", "symbol": "zł" }, + { "format": "{code}", "code": "SEK", "name": "Swedish Krona", "symbol": "kr" }, + { "format": "{code}", "code": "USD", "name": "US Dollar", "symbol": "$" }, + { "format": "{code}", "code": "ZAR", "name": "South African Rand", "symbol": "R" } ] diff --git a/data/misc/emoji.json b/data/misc/emoji.json index 193f29a..6b3d096 100644 --- a/data/misc/emoji.json +++ b/data/misc/emoji.json @@ -1,6 +1 @@ -[ - "😀", "😂", "😍", "🤔", "😎", "😭", "😡", "👍", "👎", "🙏", - "👏", "🙌", "💪", "🔥", "✨", "🎉", "❤️", "💔", "💯", "👀", - "🚀", "⭐", "🌈", "☀️", "🌙", "⚡", "❄️", "🍕", "🍔", "🍺", - "☕", "🎂", "🐶", "🐱", "🦊", "🐢", "🦄", "🌸", "🌍", "💡" -] +["😀", "😂", "😍", "🤔", "😎", "😭", "😡", "👍", "👎", "🙏", "👏", "🙌", "💪", "🔥", "✨", "🎉", "❤️", "💔", "💯", "👀", "🚀", "⭐", "🌈", "☀️", "🌙", "⚡", "❄️", "🍕", "🍔", "🍺", "☕", "🎂", "🐶", "🐱", "🦊", "🐢", "🦄", "🌸", "🌍", "💡"] diff --git a/data/misc/httpstatus.json b/data/misc/httpstatus.json index b27e5ad..0a9af07 100644 --- a/data/misc/httpstatus.json +++ b/data/misc/httpstatus.json @@ -1,18 +1,18 @@ [ - { "format": "{code} {reason}", "code": ["200"], "reason": ["OK"] }, - { "format": "{code} {reason}", "code": ["201"], "reason": ["Created"] }, - { "format": "{code} {reason}", "code": ["204"], "reason": ["No Content"] }, - { "format": "{code} {reason}", "code": ["301"], "reason": ["Moved Permanently"] }, - { "format": "{code} {reason}", "code": ["302"], "reason": ["Found"] }, - { "format": "{code} {reason}", "code": ["304"], "reason": ["Not Modified"] }, - { "format": "{code} {reason}", "code": ["400"], "reason": ["Bad Request"] }, - { "format": "{code} {reason}", "code": ["401"], "reason": ["Unauthorized"] }, - { "format": "{code} {reason}", "code": ["403"], "reason": ["Forbidden"] }, - { "format": "{code} {reason}", "code": ["404"], "reason": ["Not Found"] }, - { "format": "{code} {reason}", "code": ["409"], "reason": ["Conflict"] }, - { "format": "{code} {reason}", "code": ["422"], "reason": ["Unprocessable Entity"] }, - { "format": "{code} {reason}", "code": ["429"], "reason": ["Too Many Requests"] }, - { "format": "{code} {reason}", "code": ["500"], "reason": ["Internal Server Error"] }, - { "format": "{code} {reason}", "code": ["502"], "reason": ["Bad Gateway"] }, - { "format": "{code} {reason}", "code": ["503"], "reason": ["Service Unavailable"] } + { "format": "{code} {reason}", "code": "200", "reason": "OK" }, + { "format": "{code} {reason}", "code": "201", "reason": "Created" }, + { "format": "{code} {reason}", "code": "204", "reason": "No Content" }, + { "format": "{code} {reason}", "code": "301", "reason": "Moved Permanently" }, + { "format": "{code} {reason}", "code": "302", "reason": "Found" }, + { "format": "{code} {reason}", "code": "304", "reason": "Not Modified" }, + { "format": "{code} {reason}", "code": "400", "reason": "Bad Request" }, + { "format": "{code} {reason}", "code": "401", "reason": "Unauthorized" }, + { "format": "{code} {reason}", "code": "403", "reason": "Forbidden" }, + { "format": "{code} {reason}", "code": "404", "reason": "Not Found" }, + { "format": "{code} {reason}", "code": "409", "reason": "Conflict" }, + { "format": "{code} {reason}", "code": "422", "reason": "Unprocessable Entity" }, + { "format": "{code} {reason}", "code": "429", "reason": "Too Many Requests" }, + { "format": "{code} {reason}", "code": "500", "reason": "Internal Server Error" }, + { "format": "{code} {reason}", "code": "502", "reason": "Bad Gateway" }, + { "format": "{code} {reason}", "code": "503", "reason": "Service Unavailable" } ] diff --git a/data/misc/language.json b/data/misc/language.json index 566825b..3e5689c 100644 --- a/data/misc/language.json +++ b/data/misc/language.json @@ -1,18 +1,18 @@ [ - { "format": "{name}", "name": ["Arabic"], "code": ["ar"] }, - { "format": "{name}", "name": ["Chinese"], "code": ["zh"] }, - { "format": "{name}", "name": ["Danish"], "code": ["da"] }, - { "format": "{name}", "name": ["Dutch"], "code": ["nl"] }, - { "format": "{name}", "name": ["English"], "code": ["en"] }, - { "format": "{name}", "name": ["Finnish"], "code": ["fi"] }, - { "format": "{name}", "name": ["French"], "code": ["fr"] }, - { "format": "{name}", "name": ["German"], "code": ["de"] }, - { "format": "{name}", "name": ["Italian"], "code": ["it"] }, - { "format": "{name}", "name": ["Japanese"], "code": ["ja"] }, - { "format": "{name}", "name": ["Norwegian"], "code": ["no"] }, - { "format": "{name}", "name": ["Polish"], "code": ["pl"] }, - { "format": "{name}", "name": ["Portuguese"], "code": ["pt"] }, - { "format": "{name}", "name": ["Russian"], "code": ["ru"] }, - { "format": "{name}", "name": ["Spanish"], "code": ["es"] }, - { "format": "{name}", "name": ["Swedish"], "code": ["sv"] } + { "format": "{name}", "name": "Arabic", "code": "ar" }, + { "format": "{name}", "name": "Chinese", "code": "zh" }, + { "format": "{name}", "name": "Danish", "code": "da" }, + { "format": "{name}", "name": "Dutch", "code": "nl" }, + { "format": "{name}", "name": "English", "code": "en" }, + { "format": "{name}", "name": "Finnish", "code": "fi" }, + { "format": "{name}", "name": "French", "code": "fr" }, + { "format": "{name}", "name": "German", "code": "de" }, + { "format": "{name}", "name": "Italian", "code": "it" }, + { "format": "{name}", "name": "Japanese", "code": "ja" }, + { "format": "{name}", "name": "Norwegian", "code": "no" }, + { "format": "{name}", "name": "Polish", "code": "pl" }, + { "format": "{name}", "name": "Portuguese", "code": "pt" }, + { "format": "{name}", "name": "Russian", "code": "ru" }, + { "format": "{name}", "name": "Spanish", "code": "es" }, + { "format": "{name}", "name": "Swedish", "code": "sv" } ] diff --git a/data/misc/mac.json b/data/misc/mac.json index 4b3d5b1..fe5ba69 100644 --- a/data/misc/mac.json +++ b/data/misc/mac.json @@ -1,3 +1 @@ -[ - { "format": "{hex(2)}:{hex(2)}:{hex(2)}:{hex(2)}:{hex(2)}:{hex(2)}" } -] +"{hex(2)}:{hex(2)}:{hex(2)}:{hex(2)}:{hex(2)}:{hex(2)}" diff --git a/data/misc/mimetype.json b/data/misc/mimetype.json index e7ffda2..dcbe676 100644 --- a/data/misc/mimetype.json +++ b/data/misc/mimetype.json @@ -1,17 +1,17 @@ [ - { "format": "{type}", "type": ["application/gzip"], "ext": [".gz"] }, - { "format": "{type}", "type": ["application/json"], "ext": [".json"] }, - { "format": "{type}", "type": ["application/pdf"], "ext": [".pdf"] }, - { "format": "{type}", "type": ["application/xml"], "ext": [".xml"] }, - { "format": "{type}", "type": ["application/zip"], "ext": [".zip"] }, - { "format": "{type}", "type": ["audio/mpeg"], "ext": [".mp3"] }, - { "format": "{type}", "type": ["image/gif"], "ext": [".gif"] }, - { "format": "{type}", "type": ["image/jpeg"], "ext": [".jpg"] }, - { "format": "{type}", "type": ["image/png"], "ext": [".png"] }, - { "format": "{type}", "type": ["image/svg+xml"], "ext": [".svg"] }, - { "format": "{type}", "type": ["image/webp"], "ext": [".webp"] }, - { "format": "{type}", "type": ["text/csv"], "ext": [".csv"] }, - { "format": "{type}", "type": ["text/html"], "ext": [".html"] }, - { "format": "{type}", "type": ["text/plain"], "ext": [".txt"] }, - { "format": "{type}", "type": ["video/mp4"], "ext": [".mp4"] } + { "format": "{type}", "type": "application/gzip", "ext": ".gz" }, + { "format": "{type}", "type": "application/json", "ext": ".json" }, + { "format": "{type}", "type": "application/pdf", "ext": ".pdf" }, + { "format": "{type}", "type": "application/xml", "ext": ".xml" }, + { "format": "{type}", "type": "application/zip", "ext": ".zip" }, + { "format": "{type}", "type": "audio/mpeg", "ext": ".mp3" }, + { "format": "{type}", "type": "image/gif", "ext": ".gif" }, + { "format": "{type}", "type": "image/jpeg", "ext": ".jpg" }, + { "format": "{type}", "type": "image/png", "ext": ".png" }, + { "format": "{type}", "type": "image/svg+xml", "ext": ".svg" }, + { "format": "{type}", "type": "image/webp", "ext": ".webp" }, + { "format": "{type}", "type": "text/csv", "ext": ".csv" }, + { "format": "{type}", "type": "text/html", "ext": ".html" }, + { "format": "{type}", "type": "text/plain", "ext": ".txt" }, + { "format": "{type}", "type": "video/mp4", "ext": ".mp4" } ] diff --git a/data/misc/objectid.json b/data/misc/objectid.json index 9681734..8174210 100644 --- a/data/misc/objectid.json +++ b/data/misc/objectid.json @@ -1,3 +1 @@ -[ - { "format": "{hex(24)}" } -] +"{hex(24)}" diff --git a/data/misc/timezone.json b/data/misc/timezone.json index 62d6cb5..5c14f62 100644 --- a/data/misc/timezone.json +++ b/data/misc/timezone.json @@ -1,29 +1 @@ -[ - "UTC", - "Africa/Cairo", - "Africa/Johannesburg", - "America/Chicago", - "America/Denver", - "America/Los_Angeles", - "America/Mexico_City", - "America/New_York", - "America/Sao_Paulo", - "America/Toronto", - "Asia/Dubai", - "Asia/Hong_Kong", - "Asia/Kolkata", - "Asia/Shanghai", - "Asia/Singapore", - "Asia/Tokyo", - "Australia/Sydney", - "Europe/Amsterdam", - "Europe/Berlin", - "Europe/London", - "Europe/Madrid", - "Europe/Moscow", - "Europe/Oslo", - "Europe/Paris", - "Europe/Stockholm", - "Europe/Warsaw", - "Pacific/Auckland" -] +["UTC", "Africa/Cairo", "Africa/Johannesburg", "America/Chicago", "America/Denver", "America/Los_Angeles", "America/Mexico_City", "America/New_York", "America/Sao_Paulo", "America/Toronto", "Asia/Dubai", "Asia/Hong_Kong", "Asia/Kolkata", "Asia/Shanghai", "Asia/Singapore", "Asia/Tokyo", "Australia/Sydney", "Europe/Amsterdam", "Europe/Berlin", "Europe/London", "Europe/Madrid", "Europe/Moscow", "Europe/Oslo", "Europe/Paris", "Europe/Stockholm", "Europe/Warsaw", "Pacific/Auckland"] diff --git a/data/misc/useragent.json b/data/misc/useragent.json index f42bf9f..e659a1b 100644 --- a/data/misc/useragent.json +++ b/data/misc/useragent.json @@ -1,10 +1 @@ -[ - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15", - "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0" -] +["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"] diff --git a/data/misc/uuid.json b/data/misc/uuid.json index 18cbf98..4fa8075 100644 --- a/data/misc/uuid.json +++ b/data/misc/uuid.json @@ -1,6 +1 @@ -[ - { - "format": "{hex(8)}-{hex(4)}-4{hex(3)}-{variant}{hex(3)}-{hex(12)}", - "variant": ["8", "9", "a", "b"] - } -] +{ "format": "{hex(8)}-{hex(4)}-4{hex(3)}-{variant}{hex(3)}-{hex(12)}", "variant": ["8", "9", "a", "b"] } diff --git a/data/sv_SE/address.json b/data/sv_SE/address.json index 81766cb..25e20ab 100644 --- a/data/sv_SE/address.json +++ b/data/sv_SE/address.json @@ -1,25 +1,21 @@ -[ - { - "format": "{street} {street-number}\n{postal-code} {locality}", - "street": [ - { - "format": "{first}{last}", - "first": ["Ängs", "Bergs", "Björk", "Drottning", "Eke", "Furu", "Hamn", "Köpmans", "Kungs", "Linné", "Norra", "Nybro", "Oden", "Öster", "Park", "Skogs", "Skol", "Slotts", "Söder", "Stations", "Stor", "Strand", "Trädgårds", "Vasa", "Väster"], - "last": ["gatan", "vägen", "stigen", "gränd", "backen", "torget", "allén"] - }, - ["Avenyn", "Birger Jarlsgatan", "Promenaden", "Staby", "Sveavägen", "Vintjärn"] - ], - "street-number": [ - { "format": "{int(1,9)}" }, - { "format": "{int(10,99)}" }, - { "format": "{int(100,999)}", "weight": 0.2 }, - { "format": "{int(1,9)}{upper(1)}", "weight": 0.2 }, - { "format": "{int(10,99)}{upper(1)}", "weight": 0.1 }, - { "format": "{int(100,999)}{upper(1)}", "weight": 0.05 } - ], - "postal-code": [ - { "format": "{int(100,999)} {int(10,99)}" } - ], - "locality": ["Alingsås", "Alvesta", "Ängelholm", "Arboga", "Arvika", "Avesta", "Boden", "Bollnäs", "Borås", "Borlänge", "Enköping", "Eskilstuna", "Eslöv", "Fagersta", "Falkenberg", "Falköping", "Falun", "Finspång", "Gällivare", "Gävle", "Göteborg", "Halmstad", "Haparanda", "Härnösand", "Hässleholm", "Helsingborg", "Huddinge", "Hudiksvall", "Jönköping", "Kalmar", "Karlshamn", "Karlskoga", "Karlskrona", "Karlstad", "Katrineholm", "Kiruna", "Köping", "Kramfors", "Kristianstad", "Kristinehamn", "Landskrona", "Lidingö", "Lidköping", "Lindesberg", "Linköping", "Ljungby", "Ludvika", "Luleå", "Lund", "Lycksele", "Malmö", "Mariestad", "Mjölby", "Mölndal", "Mora", "Motala", "Nacka", "Nässjö", "Norrköping", "Norrtälje", "Nyköping", "Nynäshamn", "Örebro", "Örnsköldsvik", "Oskarshamn", "Östersund", "Piteå", "Rabbalshede", "Ronneby", "Säffle", "Sandviken", "Sävsjö", "Sigtuna", "Skara", "Skellefteå", "Skövde", "Söderhamn", "Södertälje", "Sollentuna", "Solna", "Sölvesborg", "Stockholm", "Strängnäs", "Sundbyberg", "Sundsvall", "Täby", "Tierp", "Tranås", "Trelleborg", "Trollhättan", "Uddevalla", "Ulricehamn", "Umeå", "Upplands Väsby", "Uppsala", "Vänersborg", "Varberg", "Värnamo", "Västerås", "Västervik", "Växjö", "Vetlanda", "Vimmerby", "Visby", "Ystad"] - } -] +{ + "format": "{street} {street-number}\n{postal-code} {locality}", + "street": [ + { + "format": "{first}{last}", + "first": ["Ängs", "Bergs", "Björk", "Drottning", "Eke", "Furu", "Hamn", "Köpmans", "Kungs", "Linné", "Norra", "Nybro", "Oden", "Öster", "Park", "Skogs", "Skol", "Slotts", "Söder", "Stations", "Stor", "Strand", "Trädgårds", "Vasa", "Väster"], + "last": ["gatan", "vägen", "stigen", "gränd", "backen", "torget", "allén"] + }, + ["Avenyn", "Birger Jarlsgatan", "Promenaden", "Staby", "Sveavägen", "Vintjärn"] + ], + "street-number": [ + "{int(1,9)}", + "{int(10,99)}", + { "format": "{int(100,999)}", "weight": 0.2 }, + { "format": "{int(1,9)}{upper(1)}", "weight": 0.2 }, + { "format": "{int(10,99)}{upper(1)}", "weight": 0.1 }, + { "format": "{int(100,999)}{upper(1)}", "weight": 0.05 } + ], + "postal-code": "{int(100,999)} {int(10,99)}", + "locality": ["Alingsås", "Alvesta", "Ängelholm", "Arboga", "Arvika", "Avesta", "Boden", "Bollnäs", "Borås", "Borlänge", "Enköping", "Eskilstuna", "Eslöv", "Fagersta", "Falkenberg", "Falköping", "Falun", "Finspång", "Gällivare", "Gävle", "Göteborg", "Halmstad", "Haparanda", "Härnösand", "Hässleholm", "Helsingborg", "Huddinge", "Hudiksvall", "Jönköping", "Kalmar", "Karlshamn", "Karlskoga", "Karlskrona", "Karlstad", "Katrineholm", "Kiruna", "Köping", "Kramfors", "Kristianstad", "Kristinehamn", "Landskrona", "Lidingö", "Lidköping", "Lindesberg", "Linköping", "Ljungby", "Ludvika", "Luleå", "Lund", "Lycksele", "Malmö", "Mariestad", "Mjölby", "Mölndal", "Mora", "Motala", "Nacka", "Nässjö", "Norrköping", "Norrtälje", "Nyköping", "Nynäshamn", "Örebro", "Örnsköldsvik", "Oskarshamn", "Östersund", "Piteå", "Rabbalshede", "Ronneby", "Säffle", "Sandviken", "Sävsjö", "Sigtuna", "Skara", "Skellefteå", "Skövde", "Söderhamn", "Södertälje", "Sollentuna", "Solna", "Sölvesborg", "Stockholm", "Strängnäs", "Sundbyberg", "Sundsvall", "Täby", "Tierp", "Tranås", "Trelleborg", "Trollhättan", "Uddevalla", "Ulricehamn", "Umeå", "Upplands Väsby", "Uppsala", "Vänersborg", "Varberg", "Värnamo", "Västerås", "Västervik", "Växjö", "Vetlanda", "Vimmerby", "Visby", "Ystad"] +} diff --git a/data/sv_SE/company.json b/data/sv_SE/company.json index a79bb01..b40d001 100644 --- a/data/sv_SE/company.json +++ b/data/sv_SE/company.json @@ -1,14 +1,12 @@ -[ - { - "format": "{base} {suffix}", - "base": [ - { - "format": "{a}{b}", - "a": ["Berg", "Blå", "Eko", "Fjäll", "Grön", "Järn", "Nord", "Ny", "Sjö", "Skog", "Sol", "Sten", "Stor", "Syd", "Söder", "Trä", "Vind", "Väst", "Ås", "Öst"], - "b": ["bygg", "data", "design", "energi", "frakt", "gruppen", "handel", "konsult", "kraft", "logistik", "media", "produkter", "system", "teknik", "verkstad", "vård"] - }, - ["Aktiebolaget Vega", "Bröderna Lund", "Ekonomihuset", "Hantverkargruppen", "Lindberg", "Mälardalens Bygg", "Nordström", "Skandinaviska Handelshuset", "Sundbergs Verkstad", "Svensson & Co", "Vasa Logistik"] - ], - "suffix": ["AB", "AB", "AB", "AB", "HB", "KB"] - } -] +{ + "format": "{base} {suffix}", + "base": [ + { + "format": "{a}{b}", + "a": ["Berg", "Blå", "Eko", "Fjäll", "Grön", "Järn", "Nord", "Ny", "Sjö", "Skog", "Sol", "Sten", "Stor", "Syd", "Söder", "Trä", "Vind", "Väst", "Ås", "Öst"], + "b": ["bygg", "data", "design", "energi", "frakt", "gruppen", "handel", "konsult", "kraft", "logistik", "media", "produkter", "system", "teknik", "verkstad", "vård"] + }, + ["Aktiebolaget Vega", "Bröderna Lund", "Ekonomihuset", "Hantverkargruppen", "Lindberg", "Mälardalens Bygg", "Nordström", "Skandinaviska Handelshuset", "Sundbergs Verkstad", "Svensson & Co", "Vasa Logistik"] + ], + "suffix": [{ "format": "AB", "weight": 4 }, "HB", "KB"] +} diff --git a/data/sv_SE/date.json b/data/sv_SE/date.json index 18de4f5..a591bf7 100644 --- a/data/sv_SE/date.json +++ b/data/sv_SE/date.json @@ -1,15 +1,13 @@ -[ - { - "format": "{year}-{month}-{day}", - "month": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"], - "day": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"], - "year": [ - { "format": "197{digits(1)}" }, - { "format": "198{digits(1)}" }, - { "format": "199{digits(1)}", "weight": 2 }, - { "format": "200{digits(1)}", "weight": 3 }, - { "format": "201{digits(1)}", "weight": 3 }, - { "format": "202{digits(1)}", "weight": 2 } - ] - } -] +{ + "format": "{year}-{month}-{day}", + "month": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"], + "day": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"], + "year": [ + "197{digits(1)}", + "198{digits(1)}", + { "format": "199{digits(1)}", "weight": 2 }, + { "format": "200{digits(1)}", "weight": 3 }, + { "format": "201{digits(1)}", "weight": 3 }, + { "format": "202{digits(1)}", "weight": 2 } + ] +} diff --git a/data/sv_SE/email.json b/data/sv_SE/email.json index c1d3fbf..cadf729 100644 --- a/data/sv_SE/email.json +++ b/data/sv_SE/email.json @@ -1,29 +1,26 @@ -[ - { - "format": "{local}@{domain}", - "local": [ - { - "format": "{first}{sep}{last}{n}", - "weight": 3, - "first": ["agnes", "alice", "anders", "anna", "anton", "asa", "axel", "bjorn", "david", "ebba", "elin", "elsa", "emil", "emma", "erik", "ester", "frida", "fredrik", "gustav", "hampus", "hanna", "henrik", "hugo", "ida", "ingrid", "isak", "johan", "jonas", "julia", "karin", "kjell", "klara", "lars", "lena", "linus", "magnus", "maja", "mats", "mattias", "mikael", "moa", "nils", "olle", "oskar", "par", "patrik", "per", "pontus", "rasmus", "samuel", "sara", "sofia", "soren", "stina", "sven", "tobias", "tuva", "viktor", "wilma", "ylva"], - "last": ["ahlberg", "andersson", "berg", "berglund", "bergstrom", "blom", "dahlberg", "eklund", "ekstrom", "engstrom", "eriksson", "falk", "forsberg", "fredriksson", "gustafsson", "hellstrom", "holm", "holmberg", "jakobsson", "johansson", "jonsson", "karlsson", "larsson", "lind", "lindberg", "lindgren", "lindqvist", "lundberg", "lundgren", "lundqvist", "magnusson", "nilsson", "norberg", "nystrom", "olsson", "persson", "petersson", "samuelsson", "sandberg", "sjoberg", "sjogren", "strand", "strom", "sundberg", "svensson", "soderberg", "wallin", "aberg", "oberg"], - "sep": [".", ".", "_", "-", ""], - "n": ["", "", "", "1", "7", "42", "88", "99"] - }, - { - "format": "{adj}{noun}{n}", - "weight": 2, - "adj": ["blixt", "busig", "cool", "frisk", "galen", "glad", "kaxig", "kvick", "listig", "lugn", "mega", "modig", "mysig", "pigg", "rolig", "smart", "snabb", "stark", "super", "trygg", "turbo", "varm", "vild"], - "noun": ["abborren", "bamsen", "bjorn", "drake", "ekorre", "falken", "grodan", "hund", "igelkott", "kaninen", "katt", "korpen", "krabban", "musen", "nallen", "ninja", "orn", "panda", "pirat", "raven", "robot", "sillen", "sparven", "uggla", "varg", "vargen"], - "n": ["", "", "7", "13", "14", "42", "77", "99", "123", "420", "2024"] - }, - { - "format": "{w}{n}", - "weight": 1, - "w": ["blip", "blupp", "boop", "busigekorre", "coolkatten", "doot", "fizz", "floof", "galnaalgen", "gladgrodan", "glorp", "kapow", "kazoo", "kvickharen", "listigaraven", "megaraven", "mysmoln", "nattugglan", "pew", "pigghund", "pixelfox", "plonk", "rolighund", "snabbkatten", "snork", "splat", "superhunden", "turbohund", "vildvargen", "vroom", "wahoo", "waooooh", "woot", "yeet", "zap", "zoom"], - "n": ["", "", "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] - } - ], - "domain": ["example.com", "example.org", "example.net", "example.se", "example.nu", "example.io", "mail.example.se", "webmail.example.se", "inkorg.example.se", "post.example.se", "demo.example.se", "test.example.org", "dev.example.se"] - } -] +{ + "format": "{local}@{domain}", + "local": [ + { + "format": "{first}{sep}{last}{n}", + "weight": 3, + "first": ["agnes", "alice", "anders", "anna", "anton", "asa", "axel", "bjorn", "david", "ebba", "elin", "elsa", "emil", "emma", "erik", "ester", "frida", "fredrik", "gustav", "hampus", "hanna", "henrik", "hugo", "ida", "ingrid", "isak", "johan", "jonas", "julia", "karin", "kjell", "klara", "lars", "lena", "linus", "magnus", "maja", "mats", "mattias", "mikael", "moa", "nils", "olle", "oskar", "par", "patrik", "per", "pontus", "rasmus", "samuel", "sara", "sofia", "soren", "stina", "sven", "tobias", "tuva", "viktor", "wilma", "ylva"], + "last": ["ahlberg", "andersson", "berg", "berglund", "bergstrom", "blom", "dahlberg", "eklund", "ekstrom", "engstrom", "eriksson", "falk", "forsberg", "fredriksson", "gustafsson", "hellstrom", "holm", "holmberg", "jakobsson", "johansson", "jonsson", "karlsson", "larsson", "lind", "lindberg", "lindgren", "lindqvist", "lundberg", "lundgren", "lundqvist", "magnusson", "nilsson", "norberg", "nystrom", "olsson", "persson", "petersson", "samuelsson", "sandberg", "sjoberg", "sjogren", "strand", "strom", "sundberg", "svensson", "soderberg", "wallin", "aberg", "oberg"], + "sep": [{ "format": ".", "weight": 2 }, "_", "-", ""], + "n": [{ "format": "", "weight": 3 }, "1", "7", "42", "88", "99"] + }, + { + "format": "{adj}{noun}{n}", + "weight": 2, + "adj": ["blixt", "busig", "cool", "frisk", "galen", "glad", "kaxig", "kvick", "listig", "lugn", "mega", "modig", "mysig", "pigg", "rolig", "smart", "snabb", "stark", "super", "trygg", "turbo", "varm", "vild"], + "noun": ["abborren", "bamsen", "bjorn", "drake", "ekorre", "falken", "grodan", "hund", "igelkott", "kaninen", "katt", "korpen", "krabban", "musen", "nallen", "ninja", "orn", "panda", "pirat", "raven", "robot", "sillen", "sparven", "uggla", "varg", "vargen"], + "n": [{ "format": "", "weight": 2 }, "7", "13", "14", "42", "77", "99", "123", "420", "2024"] + }, + { + "format": "{w}{n}", + "w": ["blip", "blupp", "boop", "busigekorre", "coolkatten", "doot", "fizz", "floof", "galnaalgen", "gladgrodan", "glorp", "kapow", "kazoo", "kvickharen", "listigaraven", "megaraven", "mysmoln", "nattugglan", "pew", "pigghund", "pixelfox", "plonk", "rolighund", "snabbkatten", "snork", "splat", "superhunden", "turbohund", "vildvargen", "vroom", "wahoo", "waooooh", "woot", "yeet", "zap", "zoom"], + "n": [{ "format": "", "weight": 2 }, "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] + } + ], + "domain": ["example.com", "example.org", "example.net", "example.se", "example.nu", "example.io", "mail.example.se", "webmail.example.se", "inkorg.example.se", "post.example.se", "demo.example.se", "test.example.org", "dev.example.se"] +} diff --git a/data/sv_SE/ip.json b/data/sv_SE/ip.json index e16c78a..c9bf575 100644 --- a/data/sv_SE/ip.json +++ b/data/sv_SE/ip.json @@ -2,9 +2,11 @@ { "format": "{o}.{o}.{o}.{o}", "weight": 8, - "o": [{ "format": "{digits(1)}", "weight": 3 }, { "format": "{int(10,99)}", "weight": 4 }, { "format": "1{digits(2)}", "weight": 2 }] + "o": [ + { "format": "{digits(1)}", "weight": 3 }, + { "format": "{int(10,99)}", "weight": 4 }, + { "format": "1{digits(2)}", "weight": 2 } + ] }, - { - "format": "{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}" - } + "{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}:{hex(4)}" ] diff --git a/data/sv_SE/person.json b/data/sv_SE/person.json index ff0a9ba..2806e36 100644 --- a/data/sv_SE/person.json +++ b/data/sv_SE/person.json @@ -1,41 +1,32 @@ -[ - { - "format": "{prefix}{femalefirst|malefirst} {last}", - "femalefirst": ["Agnes", "Alice", "Alicia", "Alma", "Amanda", "Anna", "Astrid", "Cornelia", "Ebba", "Elin", "Ella", "Ellen", "Elsa", "Emilia", "Emma", "Ester", "Eva", "Frida", "Hanna", "Hedda", "Ida", "Ingrid", "Isabelle", "Julia", "Karin", "Klara", "Kristina", "Lena", "Linnéa", "Lova", "Maja", "Maria", "Moa", "Molly", "Märta", "Nellie", "Nora", "Olivia", "Saga", "Sara", "Selma", "Signe", "Siri", "Sofia", "Stina", "Tilde", "Tuva", "Wilma", "Ylva", "Åsa"], - "malefirst": ["Adam", "Albin", "Alexander", "Alfred", "Anders", "Anton", "Arvid", "Axel", "Bengt", "Bo", "Carl", "David", "Edvin", "Elias", "Emil", "Erik", "Filip", "Folke", "Fredrik", "Gustav", "Göran", "Hampus", "Hans", "Henrik", "Hugo", "Isak", "Johan", "Jonas", "Karl", "Kjell", "Lars", "Leo", "Linus", "Love", "Magnus", "Mats", "Mattias", "Mikael", "Nils", "Olle", "Oskar", "Otto", "Patrik", "Per", "Pontus", "Rasmus", "Samuel", "Sixten", "Stefan", "Sten", "Sven", "Theodor", "Tobias", "Viktor", "William", "Åke"], - "last": [ - { - "format": "{first}sson", - "weight": 5, - "first": ["Ander", "Arvid", "Bengt", "Daniel", "David", "Erik", "Fredrik", "Gustaf", "Henrik", "Håkan", "Isak", "Jakob", "Johan", "Jon", "Jön", "Karl", "Lar", "Magnu", "Matt", "Mikael", "Mårten", "Nil", "Ol", "Per", "Petter", "Samuel", "Sven"] - }, - { - "format": "{first}{last}", - "weight": 3.6, - "first": ["Ahl", "Berg", "Blom", "Ceder", "Dahl", "Ek", "Eng", "Falk", "Fors", "Gran", "Hag", "Hed", "Holm", "Lind", "Lund", "Mal", "Ny", "Rosen", "Sand", "Sjö", "Skog", "Söder", "Sten", "Strand", "Sund", "Wik", "Öst"], - "last": ["berg", "blad", "crona", "dahl", "ed", "fors", "gren", "holm", "in", "kvist", "löf", "lund", "man", "mark", "qvist", "roth", "stedt", "sten", "strand", "ström", "vall"] - }, - { - "format": "{first}{last}", - "weight": 0.267, - "first": ["Hell", "Wall"], - "last": ["berg", "blad", "crona", "dahl", "ed", "fors", "gren", "holm", "in", "kvist", "man", "mark", "qvist", "roth", "stedt", "sten", "strand", "ström", "vall"] - }, - { - "format": "{first}{last}", - "weight": 0.133, - "first": ["Norr"], - "last": ["berg", "blad", "crona", "dahl", "ed", "fors", "gren", "holm", "in", "kvist", "löf", "lund", "man", "mark", "qvist", "stedt", "sten", "strand", "ström", "vall"] - }, - ["Berg", "Blom", "Eismar", "Falk", "Holm", "Lind", "Norberg", "Strand", "Ström", "von Flemming", "Åberg", "Öberg"] - ], - "prefix": [ - "", - { - "format": "{string} ", - "string": ["dr", "prof"], - "weight": 0.05 - } - ] - } -] +{ + "format": "{prefix}{femalefirst|malefirst} {last}", + "femalefirst": ["Agnes", "Alice", "Alicia", "Alma", "Amanda", "Anna", "Astrid", "Cornelia", "Ebba", "Elin", "Ella", "Ellen", "Elsa", "Emilia", "Emma", "Ester", "Eva", "Frida", "Hanna", "Hedda", "Ida", "Ingrid", "Isabelle", "Julia", "Karin", "Klara", "Kristina", "Lena", "Linnéa", "Lova", "Maja", "Maria", "Moa", "Molly", "Märta", "Nellie", "Nora", "Olivia", "Saga", "Sara", "Selma", "Signe", "Siri", "Sofia", "Stina", "Tilde", "Tuva", "Wilma", "Ylva", "Åsa"], + "malefirst": ["Adam", "Albin", "Alexander", "Alfred", "Anders", "Anton", "Arvid", "Axel", "Bengt", "Bo", "Carl", "David", "Edvin", "Elias", "Emil", "Erik", "Filip", "Folke", "Fredrik", "Gustav", "Göran", "Hampus", "Hans", "Henrik", "Hugo", "Isak", "Johan", "Jonas", "Karl", "Kjell", "Lars", "Leo", "Linus", "Love", "Magnus", "Mats", "Mattias", "Mikael", "Nils", "Olle", "Oskar", "Otto", "Patrik", "Per", "Pontus", "Rasmus", "Samuel", "Sixten", "Stefan", "Sten", "Sven", "Theodor", "Tobias", "Viktor", "William", "Åke"], + "last": [ + { + "format": "{first}sson", + "weight": 5, + "first": ["Ander", "Arvid", "Bengt", "Daniel", "David", "Erik", "Fredrik", "Gustaf", "Henrik", "Håkan", "Isak", "Jakob", "Johan", "Jon", "Jön", "Karl", "Lar", "Magnu", "Matt", "Mikael", "Mårten", "Nil", "Ol", "Per", "Petter", "Samuel", "Sven"] + }, + { + "format": "{first}{last}", + "weight": 3.6, + "first": ["Ahl", "Berg", "Blom", "Ceder", "Dahl", "Ek", "Eng", "Falk", "Fors", "Gran", "Hag", "Hed", "Holm", "Lind", "Lund", "Mal", "Ny", "Rosen", "Sand", "Sjö", "Skog", "Söder", "Sten", "Strand", "Sund", "Wik", "Öst"], + "last": ["berg", "blad", "crona", "dahl", "ed", "fors", "gren", "holm", "in", "kvist", "löf", "lund", "man", "mark", "qvist", "roth", "stedt", "sten", "strand", "ström", "vall"] + }, + { + "format": "{first}{last}", + "weight": 0.267, + "first": ["Hell", "Wall"], + "last": ["berg", "blad", "crona", "dahl", "ed", "fors", "gren", "holm", "in", "kvist", "man", "mark", "qvist", "roth", "stedt", "sten", "strand", "ström", "vall"] + }, + { + "format": "{first}{last}", + "weight": 0.133, + "first": "Norr", + "last": ["berg", "blad", "crona", "dahl", "ed", "fors", "gren", "holm", "in", "kvist", "löf", "lund", "man", "mark", "qvist", "stedt", "sten", "strand", "ström", "vall"] + }, + ["Berg", "Blom", "Eismar", "Falk", "Holm", "Lind", "Norberg", "Strand", "Ström", "von Flemming", "Åberg", "Öberg"] + ], + "prefix": ["", { "format": "{string} ", "string": ["dr", "prof"], "weight": 0.05 }] +} diff --git a/data/sv_SE/phone.json b/data/sv_SE/phone.json index 0bef075..841d442 100644 --- a/data/sv_SE/phone.json +++ b/data/sv_SE/phone.json @@ -3,15 +3,15 @@ "format": "{prefix}-{a} {b} {c}", "weight": 10, "prefix": ["070", "072", "073", "076", "079"], - "a": [{ "format": "{digits(3)}" }], - "b": [{ "format": "{digits(2)}" }], - "c": [{ "format": "{digits(2)}" }] + "a": "{digits(3)}", + "b": "{digits(2)}", + "c": "{digits(2)}" }, { "format": "{prefix}-{a} {b} {c}", "prefix": ["08", "011", "013", "018", "019", "021", "023", "026", "031", "033", "035", "036", "040", "042", "044", "046", "054", "060", "063", "090"], - "a": [{ "format": "{digits(3)}" }], - "b": [{ "format": "{digits(2)}" }], - "c": [{ "format": "{digits(2)}" }] + "a": "{digits(3)}", + "b": "{digits(2)}", + "c": "{digits(2)}" } ] diff --git a/data/sv_SE/price.json b/data/sv_SE/price.json index 92a33db..12e369b 100644 --- a/data/sv_SE/price.json +++ b/data/sv_SE/price.json @@ -1,13 +1,11 @@ -[ - { - "format": "{amt}{ore} kr", - "amt": [ - { "format": "{int(1,9)}", "weight": 2 }, - { "format": "{int(10,99)}", "weight": 4 }, - { "format": "{int(100,999)}", "weight": 3 }, - { "format": "{int(1,9)} {digits(3)}", "weight": 1 }, - { "format": "{int(10,99)} {digits(3)}", "weight": 0.3 } - ], - "ore": ["", { "format": ",{c}", "c": [{ "format": "{digits(2)}" }], "weight": 0.4 }] - } -] +{ + "format": "{amt}{ore} kr", + "amt": [ + { "format": "{int(1,9)}", "weight": 2 }, + { "format": "{int(10,99)}", "weight": 4 }, + { "format": "{int(100,999)}", "weight": 3 }, + "{int(1,9)} {digits(3)}", + { "format": "{int(10,99)} {digits(3)}", "weight": 0.3 } + ], + "ore": ["", { "format": ",{c}", "c": "{digits(2)}", "weight": 0.4 }] +} diff --git a/data/sv_SE/sentence.json b/data/sv_SE/sentence.json index 0cc0414..1b1ede9 100644 --- a/data/sv_SE/sentence.json +++ b/data/sv_SE/sentence.json @@ -7,7 +7,7 @@ "noun": ["arkivet", "berget", "bäcken", "dalen", "eken", "fjället", "floden", "fyren", "fågeln", "gården", "glaciären", "hamnen", "holmen", "klippan", "kusten", "lampan", "lyktan", "motorn", "måsen", "ravinen", "räven", "seglaren", "signalen", "sjön", "skogen", "slätten", "stigen", "stjärnan", "stranden", "tornet", "trädgården", "vandraren", "vinden", "vågen", "ängen"], "verb": ["anar", "bevakar", "bygger", "bär", "döljer", "famnar", "följer", "formar", "gömmer", "hälsar", "korsar", "leder", "lockar", "lyser", "minns", "möter", "når", "skyddar", "speglar", "söker", "tänder", "vaktar", "väcker", "värnar", "återvänder"], "prep": ["bakom", "bland", "bortom", "framför", "genom", "intill", "kring", "längs", "mot", "nära", "ovanför", "runt", "under", "vid", "över"], - "end": [".", ".", ".", "!"] + "end": [{ "format": ".", "weight": 3 }, "!"] }, { "format": "{q} {adj} {noun} {verb} {prep} {noun}?", diff --git a/data/sv_SE/ssn.json b/data/sv_SE/ssn.json index 07ed245..90ab875 100644 --- a/data/sv_SE/ssn.json +++ b/data/sv_SE/ssn.json @@ -1,25 +1,22 @@ -[ - { - "format": "{digits(2)}{mmdd}-{digits(3)}{luhn()}", - "mmdd": [ - { - "format": "{m}{d}", - "weight": 7, - "m": ["01", "03", "05", "07", "08", "10", "12"], - "d": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"] - }, - { - "format": "{m}{d}", - "weight": 4, - "m": ["04", "06", "09", "11"], - "d": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30"] - }, - { - "format": "{m}{d}", - "weight": 1, - "m": ["02"], - "d": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"] - } - ] - } -] +{ + "format": "{digits(2)}{mmdd}-{digits(3)}{luhn()}", + "mmdd": [ + { + "format": "{m}{d}", + "weight": 7, + "m": ["01", "03", "05", "07", "08", "10", "12"], + "d": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"] + }, + { + "format": "{m}{d}", + "weight": 4, + "m": ["04", "06", "09", "11"], + "d": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30"] + }, + { + "format": "{m}{d}", + "m": "02", + "d": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"] + } + ] +} diff --git a/data/sv_SE/time.json b/data/sv_SE/time.json index 2084e19..af61b7d 100644 --- a/data/sv_SE/time.json +++ b/data/sv_SE/time.json @@ -1,8 +1,17 @@ -[ - { - "format": "{hour}:{minute}{sec}", - "hour": [{ "format": "0{digits(1)}", "weight": 4 }, { "format": "1{digits(1)}", "weight": 4 }, { "format": "2{t}", "t": ["0", "1", "2", "3"], "weight": 2 }], - "minute": [{ "format": "{t}{digits(1)}", "t": ["0", "1", "2", "3", "4", "5"] }], - "sec": ["", { "format": ":{s}", "s": [{ "format": "{t}{digits(1)}", "t": ["0", "1", "2", "3", "4", "5"] }], "weight": 0.4 }] - } -] +{ + "format": "{hour}:{minute}{sec}", + "hour": [ + { "format": "0{digits(1)}", "weight": 4 }, + { "format": "1{digits(1)}", "weight": 4 }, + { "format": "2{t}", "t": ["0", "1", "2", "3"], "weight": 2 } + ], + "minute": { "format": "{t}{digits(1)}", "t": ["0", "1", "2", "3", "4", "5"] }, + "sec": [ + "", + { + "format": ":{s}", + "s": { "format": "{t}{digits(1)}", "t": ["0", "1", "2", "3", "4", "5"] }, + "weight": 0.4 + } + ] +} diff --git a/data/sv_SE/url.json b/data/sv_SE/url.json index 6faca12..131e0b5 100644 --- a/data/sv_SE/url.json +++ b/data/sv_SE/url.json @@ -1,12 +1,17 @@ -[ - { - "format": "https://{host}{path}", - "host": ["example.com", "www.example.com", "example.org", "example.se", "www.example.se", "blogg.example.net", "butik.example.com", "shop.example.se", "api.example.se", "dokument.example.org", "nyheter.example.net", "mail.example.se"], - "path": [ - "", - "", - { "format": "/{seg}", "seg": ["om", "om-oss", "produkter", "blogg", "kontakt", "hjalp", "artiklar", "logga-in", "nyheter", "start", "sok", "kundvagn", "kassa", "villkor", "integritet", "priser", "tjanster", "foretag", "karriar", "support", "konto", "installningar", "registrera"] }, - { "format": "/{seg}/{sub}", "weight": 0.5, "seg": ["blogg", "produkter", "hjalp", "dokument", "kategori"], "sub": ["oversikt", "kom-igang", "guide", "2024", "senaste", "arkiv", "detaljer"] } - ] - } -] +{ + "format": "https://{host}{path}", + "host": ["example.com", "www.example.com", "example.org", "example.se", "www.example.se", "blogg.example.net", "butik.example.com", "shop.example.se", "api.example.se", "dokument.example.org", "nyheter.example.net", "mail.example.se"], + "path": [ + { "format": "", "weight": 2 }, + { + "format": "/{seg}", + "seg": ["om", "om-oss", "produkter", "blogg", "kontakt", "hjalp", "artiklar", "logga-in", "nyheter", "start", "sok", "kundvagn", "kassa", "villkor", "integritet", "priser", "tjanster", "foretag", "karriar", "support", "konto", "installningar", "registrera"] + }, + { + "format": "/{seg}/{sub}", + "weight": 0.5, + "seg": ["blogg", "produkter", "hjalp", "dokument", "kategori"], + "sub": ["oversikt", "kom-igang", "guide", "2024", "senaste", "arkiv", "detaljer"] + } + ] +} diff --git a/data/sv_SE/username.json b/data/sv_SE/username.json index d97df0e..cb8e4ce 100644 --- a/data/sv_SE/username.json +++ b/data/sv_SE/username.json @@ -4,21 +4,20 @@ "weight": 2, "first": ["agnes", "alice", "anders", "anna", "asa", "axel", "bjorn", "ebba", "elin", "emil", "emma", "erik", "frida", "gustav", "hanna", "hugo", "ida", "johan", "jonas", "julia", "karin", "klara", "lars", "lena", "magnus", "maja", "moa", "nils", "oskar", "per", "sara", "sofia", "viktor", "ylva"], "last": ["ahl", "alm", "berg", "bjork", "dahl", "ek", "falk", "gran", "hag", "hed", "holm", "lind", "lund", "mark", "nor", "ohman", "ros", "sand", "sjo", "skog", "sten", "strom", "vik"], - "sep": ["", "", ".", "_"], - "n": ["", "", "", "1", "7", "23", "99", "2024"] + "sep": [{ "format": "", "weight": 2 }, ".", "_"], + "n": [{ "format": "", "weight": 3 }, "1", "7", "23", "99", "2024"] }, { "format": "{adj}{sep}{noun}{n}", "weight": 2, "adj": ["blixt", "busig", "cool", "frisk", "galen", "glad", "kaxig", "kvick", "listig", "lugn", "mega", "modig", "mysig", "pigg", "rolig", "smart", "snabb", "stark", "super", "trygg", "turbo", "varm", "vild"], "noun": ["abborre", "bamse", "bjorn", "drake", "ekorre", "falk", "groda", "hund", "igelkott", "kanin", "katt", "korp", "krabba", "mus", "nalle", "ninja", "orn", "panda", "pirat", "rav", "robot", "sill", "sparv", "uggla", "varg"], - "sep": ["", "", ".", "_"], - "n": ["", "", "7", "13", "42", "77", "99", "123", "420", "2024"] + "sep": [{ "format": "", "weight": 2 }, ".", "_"], + "n": [{ "format": "", "weight": 2 }, "7", "13", "42", "77", "99", "123", "420", "2024"] }, { "format": "{w}{n}", - "weight": 1, "w": ["blip", "blupp", "boop", "busigekorre", "coolkatten", "fizz", "floof", "galnaalgen", "gladgrodan", "glorp", "kapow", "kazoo", "kvickharen", "listigaraven", "megaraven", "mysmoln", "nattugglan", "pigghund", "pixelfox", "plonk", "rolighund", "snabbkatten", "snork", "splat", "superhunden", "turbohund", "vildvargen", "vroom", "wahoo", "waooooh", "woot", "yeet", "zap", "zoom"], - "n": ["", "", "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] + "n": [{ "format": "", "weight": 2 }, "7", "14", "42", "69", "99", "123", "420", "1337", "2000", "9000"] } ] diff --git a/data/sv_SE/version.json b/data/sv_SE/version.json index f0806d4..43be399 100644 --- a/data/sv_SE/version.json +++ b/data/sv_SE/version.json @@ -1,8 +1,6 @@ -[ - { - "format": "{pre}{n}.{n}.{n}{suffix}", - "n": [{ "format": "{digits(1)}", "weight": 3 }, { "format": "{int(10,99)}" }], - "pre": ["", { "format": "v", "weight": 0.4 }], - "suffix": ["", { "format": "-{tag}.{m}", "tag": ["alpha", "beta", "rc"], "m": ["1", "2", "3"], "weight": 0.3 }] - } -] +{ + "format": "{pre}{n}.{n}.{n}{suffix}", + "n": [{ "format": "{digits(1)}", "weight": 3 }, "{int(10,99)}"], + "pre": ["", { "format": "v", "weight": 0.4 }], + "suffix": ["", { "format": "-{tag}.{m}", "tag": ["alpha", "beta", "rc"], "m": ["1", "2", "3"], "weight": 0.3 }] +} diff --git a/fejkdata.go b/fejkdata.go index b0fecb8..adff4aa 100644 --- a/fejkdata.go +++ b/fejkdata.go @@ -109,10 +109,9 @@ func New(opts ...Option) (*Generator, error) { } // List returns the sorted dotted paths Fake can render: every category, the dotted -// fields within a template, and folder segments — descending transparently through -// single-variant choices the way a reference does. A choice consumes no segment, so -// a path continues through a multi-variant one only where every variant carries it, -// which is the rule Fake applies too: List is the set of paths Fake accepts. +// fields within a template, and folder segments. A choice consumes no segment, so a +// path continues through one only where every variant carries it, which is the +// rule Fake applies too: List is the set of paths Fake accepts. func (f *Generator) List() []string { var out []string for _, name := range sortedNames(f.categories) { @@ -148,9 +147,6 @@ func paths(n node) []string { } return out case *choice: - if len(n.items) == 1 { - return paths(n.items[0]) - } out := []string{""} for p := range n.shared { out = append(out, p) @@ -161,7 +157,7 @@ func paths(n node) []string { } // sharedPaths is the sub-paths every item carries — the only ones a path may step -// through a multi-variant choice to reach. It intersects, bailing as soon as the set +// through a choice to reach. It intersects, bailing as soon as the set // is empty, which is immediate for a choice of plain strings. func sharedPaths(items []node) map[string]bool { shared := subPaths(items[0]) diff --git a/format-migration/reshape.py b/format-migration/reshape.py new file mode 100755 index 0000000..81e5d8d --- /dev/null +++ b/format-migration/reshape.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +"""Rewrite data files to the one spelling each shape has. + + reshape.py data/sv_SE/person.json ... + +A one-item choice becomes its item; an object holding only a format becomes that +string; weight 1 and repeat 1 are dropped; a repeated choice item becomes one +item with a weight. +""" +import json +import sys + +OPTIONS = ("format", "weight", "repeat", "separator") +WIDTH = 110 + + +def reshape(n): + if isinstance(n, list): + items = [reshape(x) for x in n] + if len(items) == 1: + return items[0] + out, at = [], {} + for x in items: + key = json.dumps(x, sort_keys=True) + if key in at: + i = at[key] + if isinstance(out[i], str): + out[i] = {"format": out[i], "weight": 2} + elif isinstance(out[i], dict): + out[i]["weight"] = out[i].get("weight", 1) + 1 + else: + out.append(x) + continue + at[key] = len(out) + out.append(x) + return out + if isinstance(n, dict): + d = {k: (v if k in OPTIONS else reshape(v)) for k, v in n.items()} + if d.get("weight") == 1: + del d["weight"] + if d.get("repeat") == 1: + del d["repeat"] + if list(d) == ["format"]: + return d["format"] + return d + return n + + +def scalar(v): + return json.dumps(v, ensure_ascii=False) + + +def one_line(n): + if isinstance(n, dict): + return "{ " + ", ".join(scalar(k) + ": " + one_line(v) for k, v in n.items()) + " }" + if isinstance(n, list): + return "[" + ", ".join(one_line(x) for x in n) + "]" + return scalar(n) + + +def dump(n, indent=0): + pad = " " * indent + if isinstance(n, dict): + line = one_line(n) + if len(pad) + len(line) <= WIDTH and not any(isinstance(v, dict) for v in n.values()): + return line + body = ",\n".join(pad + " " + scalar(k) + ": " + dump(v, indent + 1) for k, v in n.items()) + return "{\n" + body + "\n" + pad + "}" + if isinstance(n, list): + if all(isinstance(x, str) for x in n): + return one_line(n) + line = one_line(n) + if len(pad) + len(line) <= WIDTH: + return line + body = ",\n".join(pad + " " + dump(x, indent + 1) for x in n) + return "[\n" + body + "\n" + pad + "]" + return scalar(n) + + +if __name__ == "__main__": + for path in sys.argv[1:]: + with open(path) as fh: + before = json.load(fh) + after = dump(reshape(before)) + "\n" + with open(path, "w") as fh: + fh.write(after) + print("reshaped", path) diff --git a/node.go b/node.go index b9cda30..25cabb3 100644 --- a/node.go +++ b/node.go @@ -1,6 +1,7 @@ package fejkdata import ( + "encoding/json" "fmt" "math" "sort" @@ -107,6 +108,12 @@ func compileChoice(items []any) (node, error) { if len(items) == 0 { return nil, fmt.Errorf("empty choice") } + if len(items) == 1 { + return nil, fmt.Errorf("a one-item choice is its item; write the item") + } + if err := checkNoRepeatedItem(items); err != nil { + return nil, err + } c := &choice{items: make([]node, len(items))} cum := make([]float64, len(items)) var total float64 @@ -133,14 +140,33 @@ func compileChoice(items []any) (node, error) { } c.cum = cum } - if len(c.items) > 1 { - // Safe to precompute: a choice's items come from one file, so no group can - // appear inside one, and neither mergeChildren nor linkRefs can reach in. - c.shared = sharedPaths(c.items) - } + // Safe to precompute: a choice's items come from one file, so no group can + // appear inside one, and neither mergeChildren nor linkRefs can reach in. + c.shared = sharedPaths(c.items) return c, nil } +// checkNoRepeatedItem rejects a choice that lists one item twice: a pick is even +// over the items, so a repeat is a second spelling of weight. The error names the +// spelling that does skew a pick. +func checkNoRepeatedItem(items []any) error { + seen := make(map[string]int, len(items)) + for i, raw := range items { + key, err := json.Marshal(raw) + if err != nil { + return err + } + if j, dup := seen[string(key)]; dup { + if s, isString := raw.(string); isString { + return fmt.Errorf("choice item %q is repeated; skew the odds with a weight instead: { \"format\": %q, \"weight\": 2 }", s, s) + } + return fmt.Errorf("choice item %d repeats item %d; skew the odds with a weight on one of them instead", i, j) + } + seen[string(key)] = i + } + return nil +} + func compileTemplate(m map[string]any) (node, error) { format, ok := m["format"].(string) if !ok { @@ -181,6 +207,9 @@ func compileTemplate(m map[string]any) (node, error) { } t.fields[k] = n } + if _, weighted := m["weight"]; len(t.fields) == 0 && repeat == 1 && !weighted { + return nil, fmt.Errorf("an object holding only a format is a string; write %q", format) + } if err := checkTokens(format, t.fields); err != nil { return nil, err } @@ -212,27 +241,24 @@ func checkPath(n node, tail []string, level string) error { } return checkPath(child, tail[1:], level+"."+tail[0]) case *choice: - if len(n.items) > 1 { - if want := strings.Join(tail, "."); !n.shared[want] { - return unreachableInChoice(n, want) - } - // Reachability is settled; each variant still answers for itself, so a - // rule about the level (its repeat) holds behind a choice as in front. - for _, item := range n.items { - if err := checkPath(item, tail, level); err != nil { - return err - } - } - return nil + if want := strings.Join(tail, "."); !n.shared[want] { + return unreachableInChoice(n, want) } - return checkPath(n.items[0], tail, level) + // Reachability is settled; each variant still answers for itself, so a + // rule about the level (its repeat) holds behind a choice as in front. + for _, item := range n.items { + if err := checkPath(item, tail, level); err != nil { + return err + } + } + return nil default: return fmt.Errorf("cannot descend into %T at %q", n, tail[0]) } } // repeatOf reads a template's "repeat" (default 1): how many times its format -// is rendered and concatenated. A present one must be a positive integer. +// is rendered and concatenated. A present one must be an integer above 1. func repeatOf(m map[string]any) (int, error) { rv, ok := m["repeat"] if !ok { @@ -245,6 +271,9 @@ func repeatOf(m map[string]any) (int, error) { if math.IsNaN(r) || math.IsInf(r, 0) || r < 1 || r != math.Trunc(r) { return 0, fmt.Errorf("repeat must be a positive integer, got %v", rv) } + if r == 1 { + return 0, fmt.Errorf("repeat 1 is the default, so it has no effect; drop it") + } if r > maxLen { // cap so a fat-fingered repeat can't build a multi-GB string return 0, fmt.Errorf("repeat %v exceeds the maximum %d", rv, maxLen) } @@ -269,6 +298,9 @@ func weightOf(raw any) (float64, error) { if w < 0 || math.IsNaN(w) || math.IsInf(w, 0) { return 0, fmt.Errorf("weight must be finite and non-negative, got %v", w) } + if w == 1 { + return 0, fmt.Errorf("weight 1 is the default, so it has no effect; drop it") + } return w, nil } diff --git a/reference.go b/reference.go index 97d108e..c8dd03d 100644 --- a/reference.go +++ b/reference.go @@ -9,8 +9,7 @@ import ( // refPrefix marks a {..path} token: a reference to a node elsewhere in the data // root rather than a sibling field. The path is resolved across every loaded // directory (see linkRefs), and is stricter than the one Fake takes: a reference -// binds one node, so it cannot step through a multi-variant choice even where Fake -// and List can. +// binds one node, so it cannot step through a choice even where Fake and List can. const refPrefix = ".." func isRef(name string) bool { return strings.HasPrefix(name, refPrefix) } @@ -32,6 +31,9 @@ func linkRefs(root map[string]node) error { if err != nil { return fmt.Errorf("%s: reference {%s}: %w", path, name, err) } + if t.fields == nil { + t.fields = map[string]node{} + } t.fields[name] = target } return nil @@ -231,9 +233,8 @@ func sortedNames(m map[string]node) []string { } // lookup finds the single node a reference path names, walking groups and -// template fields by segment and descending a single-variant choice as a -// transparent wrapper. A missing segment, a folder target, or a step through a -// multi-variant choice (which has no one value to bind) is an error. +// template fields by segment. A missing segment, a folder target, or a step +// through a choice (which has no one value to bind) is an error. func lookup(root map[string]node, segments []string) (node, error) { var n node = &group{children: root} for i := 0; i < len(segments); i++ { @@ -251,10 +252,7 @@ func lookup(root map[string]node, segments []string) (node, error) { } n = child case *choice: - if len(c.items) != 1 { - return nil, fmt.Errorf("%q steps through a %d-way choice", segments[i], len(c.items)) - } - n, i = c.items[0], i-1 // a choice consumes no segment; reprocess it unwrapped + return nil, fmt.Errorf("%q steps through a %d-way choice", segments[i], len(c.items)) default: return nil, fmt.Errorf("cannot descend into %T at %q", n, segments[i]) } diff --git a/render.go b/render.go index 4139ab7..82bb26f 100644 --- a/render.go +++ b/render.go @@ -53,10 +53,8 @@ func descend(s *session, n node, segments []string) (node, error) { } return descend(s, child, segments[1:]) case *choice: - if len(n.items) > 1 { - if want := strings.Join(segments, "."); !n.shared[want] { - return nil, unreachableInChoice(n, want) - } + if want := strings.Join(segments, "."); !n.shared[want] { + return nil, unreachableInChoice(n, want) } return descend(s, pick(s, n), segments) default: