synthra 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +4 -0
- data/.rubocop.yml +40 -0
- data/.yardopts +18 -0
- data/ACCESS_DOCS.md +116 -0
- data/ADVANCED_FEATURES_SUMMARY.md +245 -0
- data/CHANGELOG.md +498 -0
- data/CODE_OF_CONDUCT.md +122 -0
- data/CONTRIBUTING.md +307 -0
- data/DOCUMENTATION.md +204 -0
- data/DOCUMENTATION_GUIDE.md +194 -0
- data/LICENSE +22 -0
- data/README.md +1458 -0
- data/Rakefile +128 -0
- data/benchmark/README.md +591 -0
- data/benchmark/batch_generation.rb +63 -0
- data/benchmark/engine_comparison.rb +295 -0
- data/benchmark/single_record.rb +108 -0
- data/benchmark/streaming.rb +74 -0
- data/docs/ACTIVERECORD_INFERENCE.md +524 -0
- data/docs/API_SERVER.md +278 -0
- data/docs/CONFIG_FILE.md +315 -0
- data/docs/DATA_CONTRACTS.md +312 -0
- data/docs/ENHANCED_REPL.md +304 -0
- data/docs/FACTORY_BOT.md +271 -0
- data/docs/GITHUB_ACTION.md +420 -0
- data/docs/GRAPHQL_EXPORT.md +303 -0
- data/docs/GRAPHQL_FEDERATION.md +651 -0
- data/docs/HOW_TO_GENERATE_DOCS.md +252 -0
- data/docs/LSP.md +189 -0
- data/docs/MIGRATION_GENERATOR.md +547 -0
- data/docs/MOCK_SERVER.md +280 -0
- data/docs/NATIVE_ENGINE.md +298 -0
- data/docs/OPENAPI_EXPORT.md +252 -0
- data/docs/PERFORMANCE_MODE.md +228 -0
- data/docs/PERSONAS.md +547 -0
- data/docs/PROPERTY_TESTING.md +284 -0
- data/docs/PROTOBUF_EXPORT.md +276 -0
- data/docs/QUALITY_METRICS.md +555 -0
- data/docs/QUICK_REFERENCE.md +88 -0
- data/docs/RAILS_ENGINE.md +404 -0
- data/docs/RAILS_INTEGRATION.md +454 -0
- data/docs/README.md +175 -0
- data/docs/REPL_QUICK_REFERENCE.md +149 -0
- data/docs/RUST_INTEGRATION_GUIDE.md +1376 -0
- data/docs/SCENARIOS.md +576 -0
- data/docs/SECURITY_TESTING.md +318 -0
- data/docs/SNAPSHOT_TESTING.md +308 -0
- data/docs/STRING_TEXT_TYPES_REFERENCE.md +512 -0
- data/docs/TERRAFORM_EXPORT.md +447 -0
- data/docs/TIME_TRAVEL.md +507 -0
- data/docs/USAGE_GUIDE.md +980 -0
- data/docs/WEBHOOK_SIMULATOR.md +579 -0
- data/docs/advanced_features.md +183 -0
- data/docs/api_reference.md +153 -0
- data/docs/behaviors.md +138 -0
- data/docs/best_practices.md +191 -0
- data/docs/dsl_reference.md +172 -0
- data/docs/examples.md +162 -0
- data/docs/generation_modes.md +125 -0
- data/docs/getting_started.md +92 -0
- data/docs/index.html +177 -0
- data/docs/strategic/CLOUD_REGISTRY_ARCHITECTURE.md +268 -0
- data/docs/strategic/SIMD_OPTIMIZATION_STRATEGY.md +153 -0
- data/docs/troubleshooting.md +215 -0
- data/docs/type_reference.md +224 -0
- data/examples/hostile_mode_demo.rb +64 -0
- data/exe/synthra +6 -0
- data/ext/synthra_native/Cargo.lock +972 -0
- data/ext/synthra_native/Cargo.toml +46 -0
- data/ext/synthra_native/extconf.rb +41 -0
- data/ext/synthra_native/src/generator.rs +397 -0
- data/ext/synthra_native/src/lib.rs +229 -0
- data/ext/synthra_native/src/types.rs +1485 -0
- data/lib/generators/synthra/install_generator.rb +86 -0
- data/lib/generators/synthra/templates/api_response.dsl +15 -0
- data/lib/generators/synthra/templates/fake_data.rake +116 -0
- data/lib/generators/synthra/templates/synthra.yml +31 -0
- data/lib/generators/synthra/templates/synthra_support.rb +19 -0
- data/lib/generators/synthra/templates/user.dsl +11 -0
- data/lib/synthra/activerecord_inference.rb +394 -0
- data/lib/synthra/api.rb +381 -0
- data/lib/synthra/api_server.rb +718 -0
- data/lib/synthra/behaviors/applicator.rb +165 -0
- data/lib/synthra/behaviors/base.rb +155 -0
- data/lib/synthra/behaviors/close_connection.rb +60 -0
- data/lib/synthra/behaviors/deprecated.rb +100 -0
- data/lib/synthra/behaviors/failure.rb +69 -0
- data/lib/synthra/behaviors/latency.rb +103 -0
- data/lib/synthra/behaviors/partial_data.rb +83 -0
- data/lib/synthra/behaviors/randomize_order.rb +74 -0
- data/lib/synthra/behaviors/registry.rb +238 -0
- data/lib/synthra/behaviors/simulate_error.rb +79 -0
- data/lib/synthra/cli/commands/base.rb +105 -0
- data/lib/synthra/cli/commands/diff.rb +227 -0
- data/lib/synthra/cli/commands/docs.rb +67 -0
- data/lib/synthra/cli/commands/export.rb +150 -0
- data/lib/synthra/cli/commands/generate.rb +72 -0
- data/lib/synthra/cli/commands/import.rb +80 -0
- data/lib/synthra/cli/commands/lint.rb +53 -0
- data/lib/synthra/cli/commands/live.rb +57 -0
- data/lib/synthra/cli/commands/seed.rb +99 -0
- data/lib/synthra/cli/commands/validate.rb +28 -0
- data/lib/synthra/cli.rb +2471 -0
- data/lib/synthra/config_file.rb +129 -0
- data/lib/synthra/configuration.rb +281 -0
- data/lib/synthra/contracts_registry.rb +408 -0
- data/lib/synthra/database_seeder.rb +268 -0
- data/lib/synthra/deterministic_ids.rb +218 -0
- data/lib/synthra/documentation_generator.rb +414 -0
- data/lib/synthra/engine.rb +251 -0
- data/lib/synthra/errors.rb +1169 -0
- data/lib/synthra/export/base.rb +85 -0
- data/lib/synthra/export/csv.rb +101 -0
- data/lib/synthra/export/graphql.rb +266 -0
- data/lib/synthra/export/graphql_federation.rb +377 -0
- data/lib/synthra/export/graphviz.rb +258 -0
- data/lib/synthra/export/javascript.rb +327 -0
- data/lib/synthra/export/json_data.rb +61 -0
- data/lib/synthra/export/json_schema.rb +290 -0
- data/lib/synthra/export/openapi.rb +514 -0
- data/lib/synthra/export/protobuf.rb +483 -0
- data/lib/synthra/export/python.rb +560 -0
- data/lib/synthra/export/sql.rb +381 -0
- data/lib/synthra/export/sql_insert.rb +152 -0
- data/lib/synthra/export/terraform.rb +501 -0
- data/lib/synthra/export/type_mapping.rb +389 -0
- data/lib/synthra/export/typescript.rb +300 -0
- data/lib/synthra/export/xml_data.rb +104 -0
- data/lib/synthra/export/yaml_data.rb +56 -0
- data/lib/synthra/export.rb +404 -0
- data/lib/synthra/factory_bot_integration.rb +157 -0
- data/lib/synthra/field.rb +440 -0
- data/lib/synthra/functions/registry.rb +104 -0
- data/lib/synthra/generator/context.rb +372 -0
- data/lib/synthra/generator/engine.rb +336 -0
- data/lib/synthra/generator/faker_adapter.rb +425 -0
- data/lib/synthra/generator/modes.rb +444 -0
- data/lib/synthra/generator/resolver.rb +256 -0
- data/lib/synthra/generator/rng.rb +273 -0
- data/lib/synthra/generator/streamer.rb +63 -0
- data/lib/synthra/generator/uniqueness.rb +118 -0
- data/lib/synthra/initializer.rb +97 -0
- data/lib/synthra/limits.rb +279 -0
- data/lib/synthra/live_preview.rb +518 -0
- data/lib/synthra/loader_config.rb +78 -0
- data/lib/synthra/lsp/server.rb +689 -0
- data/lib/synthra/migration_generator.rb +301 -0
- data/lib/synthra/mixin.rb +174 -0
- data/lib/synthra/mock_server.rb +458 -0
- data/lib/synthra/native_engine.rb +304 -0
- data/lib/synthra/openapi_importer.rb +228 -0
- data/lib/synthra/output/json_formatter.rb +40 -0
- data/lib/synthra/output/ndjson_formatter.rb +55 -0
- data/lib/synthra/parser/ast.rb +1287 -0
- data/lib/synthra/parser/lexer.rb +1152 -0
- data/lib/synthra/parser/parser.rb +1664 -0
- data/lib/synthra/parser/tokens.rb +461 -0
- data/lib/synthra/performance_mode.rb +364 -0
- data/lib/synthra/personas.rb +397 -0
- data/lib/synthra/property_testing.rb +172 -0
- data/lib/synthra/quality_metrics.rb +405 -0
- data/lib/synthra/rails_test_helper.rb +248 -0
- data/lib/synthra/registry.rb +533 -0
- data/lib/synthra/relationships.rb +193 -0
- data/lib/synthra/repl/enhanced_repl.rb +607 -0
- data/lib/synthra/repl/formatter.rb +191 -0
- data/lib/synthra/scenarios.rb +423 -0
- data/lib/synthra/schema.rb +605 -0
- data/lib/synthra/schema_inheritance.rb +104 -0
- data/lib/synthra/schema_versioning.rb +212 -0
- data/lib/synthra/snapshot_testing.rb +199 -0
- data/lib/synthra/time_travel.rb +338 -0
- data/lib/synthra/type_definitions.rb +274 -0
- data/lib/synthra/types/address_location/addresses.rb +125 -0
- data/lib/synthra/types/address_location/airports.rb +200 -0
- data/lib/synthra/types/address_location/banks_hospitals.rb +207 -0
- data/lib/synthra/types/address_location/locations.rb +406 -0
- data/lib/synthra/types/base.rb +48 -0
- data/lib/synthra/types/commerce_products/commerce.rb +119 -0
- data/lib/synthra/types/commerce_products/companies.rb +71 -0
- data/lib/synthra/types/commerce_products/construction.rb +126 -0
- data/lib/synthra/types/commerce_products/products.rb +205 -0
- data/lib/synthra/types/core/collections.rb +513 -0
- data/lib/synthra/types/core/defaults.rb +76 -0
- data/lib/synthra/types/core/enums.rb +102 -0
- data/lib/synthra/types/core/identifiers.rb +445 -0
- data/lib/synthra/types/core/primitives.rb +586 -0
- data/lib/synthra/types/core/references.rb +466 -0
- data/lib/synthra/types/core/sequences.rb +304 -0
- data/lib/synthra/types/crypto/crypto.rb +162 -0
- data/lib/synthra/types/date_time/dates.rb +387 -0
- data/lib/synthra/types/finance_banking/banking.rb +424 -0
- data/lib/synthra/types/finance_banking/credit_cards.rb +24 -0
- data/lib/synthra/types/finance_banking/identifiers.rb +93 -0
- data/lib/synthra/types/formula.rb +184 -0
- data/lib/synthra/types/health_medical/medical.rb +150 -0
- data/lib/synthra/types/hostile_payloads.rb +122 -0
- data/lib/synthra/types/json_array.rb +51 -0
- data/lib/synthra/types/media_entertainment/media.rb +62 -0
- data/lib/synthra/types/naughty_string.rb +30 -0
- data/lib/synthra/types/personal_names/chinese.rb +41 -0
- data/lib/synthra/types/personal_names/identifiers.rb +187 -0
- data/lib/synthra/types/personal_names/names.rb +246 -0
- data/lib/synthra/types/personal_names/national_id.rb +89 -0
- data/lib/synthra/types/personal_names/titles_suffixes.rb +41 -0
- data/lib/synthra/types/regex.rb +248 -0
- data/lib/synthra/types/registry.rb +182 -0
- data/lib/synthra/types/repeating_element.rb +50 -0
- data/lib/synthra/types/scenario.rb +29 -0
- data/lib/synthra/types/technology_internet/apps.rb +67 -0
- data/lib/synthra/types/technology_internet/communication.rb +162 -0
- data/lib/synthra/types/technology_internet/devices.rb +80 -0
- data/lib/synthra/types/technology_internet/formats.rb +139 -0
- data/lib/synthra/types/technology_internet/networking.rb +143 -0
- data/lib/synthra/types/template.rb +92 -0
- data/lib/synthra/types/text_content/business.rb +128 -0
- data/lib/synthra/types/text_content/colors.rb +70 -0
- data/lib/synthra/types/text_content/misc.rb +237 -0
- data/lib/synthra/types/text_content/security.rb +130 -0
- data/lib/synthra/types/text_content/text_generation.rb +532 -0
- data/lib/synthra/types/travel/travel.rb +150 -0
- data/lib/synthra/utils/string_distance.rb +133 -0
- data/lib/synthra/validator/dsl_validator.rb +339 -0
- data/lib/synthra/validator/path_validator.rb +615 -0
- data/lib/synthra/version.rb +35 -0
- data/lib/synthra/webhook_simulator.rb +341 -0
- data/lib/synthra.rb +259 -0
- data/schemas/address.dsl +16 -0
- data/schemas/api_response.dsl +8 -0
- data/schemas/error_payload.dsl +9 -0
- data/schemas/order.dsl +10 -0
- data/schemas/order_item.dsl +8 -0
- data/schemas/payment.dsl +11 -0
- data/schemas/social_post.dsl +13 -0
- data/schemas/user.dsl +10 -0
- data/scripts/batch_fix_all.rb +96 -0
- data/scripts/delete_old_files.rb +32 -0
- data/scripts/fix_all_grouped_files.rb +137 -0
- data/scripts/fix_all_indentation.rb +48 -0
- data/scripts/fix_all_syntax.rb +124 -0
- data/scripts/fix_grouped_files.rb +184 -0
- data/scripts/fix_syntax_errors.rb +108 -0
- data/scripts/group_domain_types.rb +112 -0
- data/scripts/group_domain_types_fixed.rb +150 -0
- data/scripts/merge_domains_to_one_file.rb +68 -0
- data/scripts/move_existing_types.rb +130 -0
- data/scripts/split_grouped_types.rb +142 -0
- data/tech_docs/README.md +134 -0
- data/tech_docs/advanced/streaming.md +405 -0
- data/tech_docs/advanced/thread_safety.md +253 -0
- data/tech_docs/api/overview.md +485 -0
- data/tech_docs/appendices/type_chart.md +193 -0
- data/tech_docs/basic_concepts.md +383 -0
- data/tech_docs/behaviors/overview.md +346 -0
- data/tech_docs/dsl/complex_types.md +790 -0
- data/tech_docs/dsl/core_types.md +464 -0
- data/tech_docs/dsl/datetime_types.md +325 -0
- data/tech_docs/dsl/field_modifiers.md +414 -0
- data/tech_docs/dsl/grammar.md +431 -0
- data/tech_docs/dsl/schema_definition.md +399 -0
- data/tech_docs/export/README.md +276 -0
- data/tech_docs/installation.md +273 -0
- data/tech_docs/integration/ci_cd.md +707 -0
- data/tech_docs/integration/ci_cd_guide.md +579 -0
- data/tech_docs/integration/factory_bot.md +485 -0
- data/tech_docs/integration/rails.md +630 -0
- data/tech_docs/integration/rspec.md +449 -0
- data/tech_docs/modes/overview.md +350 -0
- data/tech_docs/performance/NATIVE_RUST_EXTENSION.md +1270 -0
- data/tech_docs/performance/OPTIMIZATION_GUIDE.md +901 -0
- data/tech_docs/quick_start.md +256 -0
- data/tech_docs/templates/README.md +805 -0
- data/tech_docs/tutorials/advanced.md +371 -0
- data/tech_docs/tutorials/getting_started.md +189 -0
- data/tech_docs/tutorials/intermediate.md +231 -0
- data/tech_docs/tutorials/template_gallery.md +569 -0
- data/tech_example/01_basic_usage.rb +238 -0
- data/tech_example/02_types_demo.rb +336 -0
- data/tech_example/04_cli_usage.md +429 -0
- data/tech_example/05_database_seeding.rb +283 -0
- data/tech_example/07_rspec_integration.rb +359 -0
- data/tech_example/10_custom_types.rb +387 -0
- data/tech_example/12_behaviors.rb +372 -0
- data/tech_example/13_twitter_dm_example.rb +120 -0
- data/tech_example/14_exact_json_structure.rb +253 -0
- data/tech_example/16_lsp_server.rb +56 -0
- data/tech_example/17_property_testing.rb +92 -0
- data/tech_example/18_enhanced_repl.rb +120 -0
- data/tech_example/19_security_fuzzing.rb +145 -0
- data/tech_example/NEW_FEATURES.md +169 -0
- data/tech_example/README.md +118 -0
- data/tech_example/schemas/api_response.dsl +123 -0
- data/tech_example/schemas/ecommerce.dsl +121 -0
- data/tech_example/schemas/twitter_dm.dsl +109 -0
- data/tech_example/schemas/user.dsl +36 -0
- data/vscode-extension/README.md +246 -0
- data/vscode-extension/language-configuration.json +31 -0
- data/vscode-extension/package.json +55 -0
- data/vscode-extension/snippets/fakedatadsl.json +198 -0
- data/vscode-extension/syntaxes/fakedatadsl.tmLanguage.json +128 -0
- metadata +478 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# DSL Grammar Reference
|
|
2
|
+
|
|
3
|
+
Complete grammar specification for FakeDataDSL schemas.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Basic Syntax](#basic-syntax)
|
|
8
|
+
- [Comments](#comments)
|
|
9
|
+
- [Quoting Rules](#quoting-rules)
|
|
10
|
+
- [Escaping](#escaping)
|
|
11
|
+
- [Multi-line Values](#multi-line-values)
|
|
12
|
+
- [Indentation](#indentation)
|
|
13
|
+
- [Schema Structure](#schema-structure)
|
|
14
|
+
- [Field Definitions](#field-definitions)
|
|
15
|
+
- [Type System](#type-system)
|
|
16
|
+
- [Annotations](#annotations)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Basic Syntax
|
|
21
|
+
|
|
22
|
+
FakeDataDSL uses a YAML-like indentation-based syntax:
|
|
23
|
+
|
|
24
|
+
```dsl
|
|
25
|
+
SchemaName:
|
|
26
|
+
field_name: type
|
|
27
|
+
field_name: type(arguments)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Rules
|
|
31
|
+
|
|
32
|
+
1. **Schema names** start with uppercase letter: `User`, `OrderItem`, `TwitterDM`
|
|
33
|
+
2. **Field names** are lowercase with underscores: `user_id`, `created_at`
|
|
34
|
+
3. **Types** are lowercase: `uuid`, `text`, `number`
|
|
35
|
+
4. **Indentation** must be exactly 2 spaces (no tabs)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Comments
|
|
40
|
+
|
|
41
|
+
Comments start with `#` and continue to end of line:
|
|
42
|
+
|
|
43
|
+
```dsl
|
|
44
|
+
# This is a comment
|
|
45
|
+
User:
|
|
46
|
+
id: uuid # Inline comment
|
|
47
|
+
name: text # Full name
|
|
48
|
+
# This field is optional
|
|
49
|
+
phone?: phone
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Comment Rules
|
|
53
|
+
|
|
54
|
+
- `#` starts a comment anywhere on a line
|
|
55
|
+
- Comments can appear on their own line or after code
|
|
56
|
+
- Comments inside strings are NOT comments: `text: const("#hashtag")`
|
|
57
|
+
- Empty lines are allowed and ignored
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Quoting Rules
|
|
62
|
+
|
|
63
|
+
### When Quotes Are Required
|
|
64
|
+
|
|
65
|
+
| Context | Quoted | Unquoted | Notes |
|
|
66
|
+
|---------|--------|----------|-------|
|
|
67
|
+
| `const()` values | ✅ Required | ❌ Invalid | `const("value")` |
|
|
68
|
+
| `enum()` values | ❌ Optional | ✅ OK | `enum(a, b, c)` |
|
|
69
|
+
| Path in `copy()` | ✅ Required | ❌ Invalid | `copy("user.id")` |
|
|
70
|
+
| Type arguments | ❌ No | ✅ Yes | `text(10..50)` |
|
|
71
|
+
| Schema references | ❌ No | ✅ Yes | `user: User` |
|
|
72
|
+
|
|
73
|
+
### Examples
|
|
74
|
+
|
|
75
|
+
```dsl
|
|
76
|
+
User:
|
|
77
|
+
# const() REQUIRES quotes
|
|
78
|
+
type: const("user")
|
|
79
|
+
status: const("active")
|
|
80
|
+
|
|
81
|
+
# enum() quotes are optional
|
|
82
|
+
role: enum(admin, user, guest)
|
|
83
|
+
role: enum("admin", "user", "guest") # Also valid
|
|
84
|
+
|
|
85
|
+
# copy() REQUIRES quotes for path
|
|
86
|
+
full_name: copy("first_name")
|
|
87
|
+
|
|
88
|
+
# Ranges don't use quotes
|
|
89
|
+
age: number(18..65)
|
|
90
|
+
|
|
91
|
+
# Schema references don't use quotes
|
|
92
|
+
address: Address
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### String Literals
|
|
96
|
+
|
|
97
|
+
Use double quotes for string literals:
|
|
98
|
+
|
|
99
|
+
```dsl
|
|
100
|
+
User:
|
|
101
|
+
type: const("message_create") # ✅ Correct
|
|
102
|
+
type: const(message_create) # ❌ Invalid - missing quotes
|
|
103
|
+
type: const('message_create') # ❌ Invalid - single quotes not supported
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Escaping
|
|
109
|
+
|
|
110
|
+
### Escape Sequences in Strings
|
|
111
|
+
|
|
112
|
+
| Sequence | Meaning |
|
|
113
|
+
|----------|---------|
|
|
114
|
+
| `\"` | Double quote |
|
|
115
|
+
| `\\` | Backslash |
|
|
116
|
+
| `\n` | Newline |
|
|
117
|
+
| `\t` | Tab |
|
|
118
|
+
|
|
119
|
+
### Examples
|
|
120
|
+
|
|
121
|
+
```dsl
|
|
122
|
+
User:
|
|
123
|
+
# Quote in string
|
|
124
|
+
greeting: const("Hello \"World\"")
|
|
125
|
+
|
|
126
|
+
# Backslash
|
|
127
|
+
path: const("C:\\Users\\Name")
|
|
128
|
+
|
|
129
|
+
# Newline (in generated text)
|
|
130
|
+
bio: const("Line 1\nLine 2")
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Special Characters
|
|
134
|
+
|
|
135
|
+
Most special characters work without escaping in appropriate contexts:
|
|
136
|
+
|
|
137
|
+
```dsl
|
|
138
|
+
User:
|
|
139
|
+
# Email with special chars
|
|
140
|
+
email: email # Generates: user@example.com
|
|
141
|
+
|
|
142
|
+
# URL with special chars
|
|
143
|
+
website: url # Generates: https://example.com/path?query=1
|
|
144
|
+
|
|
145
|
+
# JSON-safe text is auto-escaped in output
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Multi-line Values
|
|
151
|
+
|
|
152
|
+
### Not Supported in Current Version
|
|
153
|
+
|
|
154
|
+
Multi-line string literals are **not** currently supported in the DSL:
|
|
155
|
+
|
|
156
|
+
```dsl
|
|
157
|
+
# ❌ NOT VALID
|
|
158
|
+
User:
|
|
159
|
+
bio: const("This is a
|
|
160
|
+
multi-line
|
|
161
|
+
string")
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Workaround
|
|
165
|
+
|
|
166
|
+
Use `\n` escape sequences for multi-line content:
|
|
167
|
+
|
|
168
|
+
```dsl
|
|
169
|
+
# ✅ Valid
|
|
170
|
+
User:
|
|
171
|
+
bio: const("Line 1\nLine 2\nLine 3")
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Or use the `paragraph` type for generated multi-line text:
|
|
175
|
+
|
|
176
|
+
```dsl
|
|
177
|
+
User:
|
|
178
|
+
bio: paragraph(2..5) # 2-5 paragraphs of Lorem ipsum
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Indentation
|
|
184
|
+
|
|
185
|
+
### Rules
|
|
186
|
+
|
|
187
|
+
1. **Use exactly 2 spaces** for each indentation level
|
|
188
|
+
2. **Tabs are not allowed** and will cause parse errors
|
|
189
|
+
3. **Consistent indentation** required within a schema
|
|
190
|
+
|
|
191
|
+
### Correct Example
|
|
192
|
+
|
|
193
|
+
```dsl
|
|
194
|
+
User: # Level 0
|
|
195
|
+
id: uuid # Level 1 (2 spaces)
|
|
196
|
+
name: text # Level 1
|
|
197
|
+
address: Address # Level 1
|
|
198
|
+
|
|
199
|
+
Address: # Level 0
|
|
200
|
+
street: text # Level 1
|
|
201
|
+
city: city # Level 1
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Common Mistakes
|
|
205
|
+
|
|
206
|
+
```dsl
|
|
207
|
+
# ❌ Wrong: using tabs
|
|
208
|
+
User:
|
|
209
|
+
id: uuid # Tab character - ERROR
|
|
210
|
+
|
|
211
|
+
# ❌ Wrong: inconsistent indentation
|
|
212
|
+
User:
|
|
213
|
+
id: uuid # 2 spaces
|
|
214
|
+
name: text # 3 spaces - ERROR
|
|
215
|
+
|
|
216
|
+
# ❌ Wrong: no indentation
|
|
217
|
+
User:
|
|
218
|
+
id: uuid # No indent - ERROR
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Schema Structure
|
|
224
|
+
|
|
225
|
+
### Basic Schema
|
|
226
|
+
|
|
227
|
+
```dsl
|
|
228
|
+
SchemaName:
|
|
229
|
+
field1: type1
|
|
230
|
+
field2: type2
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Schema with Annotations
|
|
234
|
+
|
|
235
|
+
```dsl
|
|
236
|
+
User:
|
|
237
|
+
@version 1.0
|
|
238
|
+
@deprecated Use UserV2 instead
|
|
239
|
+
|
|
240
|
+
id: uuid
|
|
241
|
+
name: text
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Schema with Behaviors
|
|
245
|
+
|
|
246
|
+
```dsl
|
|
247
|
+
APIResponse:
|
|
248
|
+
@latency 100..500ms
|
|
249
|
+
@failure 5%
|
|
250
|
+
|
|
251
|
+
status: number
|
|
252
|
+
data: object
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Multiple Schemas in One File
|
|
256
|
+
|
|
257
|
+
```dsl
|
|
258
|
+
User:
|
|
259
|
+
id: uuid
|
|
260
|
+
name: text
|
|
261
|
+
|
|
262
|
+
Address:
|
|
263
|
+
street: text
|
|
264
|
+
city: city
|
|
265
|
+
|
|
266
|
+
Order:
|
|
267
|
+
user: User
|
|
268
|
+
shipping: Address
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Field Definitions
|
|
274
|
+
|
|
275
|
+
### Basic Field
|
|
276
|
+
|
|
277
|
+
```dsl
|
|
278
|
+
field_name: type
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Field with Arguments
|
|
282
|
+
|
|
283
|
+
```dsl
|
|
284
|
+
field_name: type(arg1, arg2)
|
|
285
|
+
field_name: type(name: value, name2: value2)
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Optional Field (May Not Appear)
|
|
289
|
+
|
|
290
|
+
```dsl
|
|
291
|
+
phone?: phone
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Nullable Field (May Be Null)
|
|
295
|
+
|
|
296
|
+
```dsl
|
|
297
|
+
nickname: text?
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Optional AND Nullable
|
|
301
|
+
|
|
302
|
+
```dsl
|
|
303
|
+
bio?: text?
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Conditional Field
|
|
307
|
+
|
|
308
|
+
```dsl
|
|
309
|
+
tracking_number: text if shipped
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Field with Behavior
|
|
313
|
+
|
|
314
|
+
```dsl
|
|
315
|
+
email: email @partial_data 10%
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Type System
|
|
321
|
+
|
|
322
|
+
### Primitive Types
|
|
323
|
+
|
|
324
|
+
```dsl
|
|
325
|
+
id: uuid # UUID v4
|
|
326
|
+
count: number(1..100) # Integer in range
|
|
327
|
+
price: float(0.99..99.99) # Float in range
|
|
328
|
+
name: text(5..50) # String of length
|
|
329
|
+
active: boolean # true/false
|
|
330
|
+
status: enum(a, b, c) # One of values
|
|
331
|
+
type: const("literal") # Constant value
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Complex Types
|
|
335
|
+
|
|
336
|
+
```dsl
|
|
337
|
+
items: array(Item, 1..5) # Array of schemas
|
|
338
|
+
user: User # Nested schema
|
|
339
|
+
user_id: Ref(User.id) # Reference to another schema
|
|
340
|
+
sender_id: copy("sender.id") # Copy from generated field
|
|
341
|
+
recipient: shared(User) # Shared across batch
|
|
342
|
+
users: map_by_field("id", a: S1) # Dynamic keys
|
|
343
|
+
payload: one_of(A, B, C) # Polymorphic
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Annotations
|
|
349
|
+
|
|
350
|
+
### @version
|
|
351
|
+
|
|
352
|
+
Declares schema version:
|
|
353
|
+
|
|
354
|
+
```dsl
|
|
355
|
+
User:
|
|
356
|
+
@version 1.0
|
|
357
|
+
id: uuid
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### @deprecated
|
|
361
|
+
|
|
362
|
+
Marks schema as deprecated:
|
|
363
|
+
|
|
364
|
+
```dsl
|
|
365
|
+
LegacyUser:
|
|
366
|
+
@deprecated Use User instead
|
|
367
|
+
id: uuid
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### @latency
|
|
371
|
+
|
|
372
|
+
Adds delay to generation:
|
|
373
|
+
|
|
374
|
+
```dsl
|
|
375
|
+
APIResponse:
|
|
376
|
+
@latency 100..500ms
|
|
377
|
+
data: object
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### @failure
|
|
381
|
+
|
|
382
|
+
Simulates failures:
|
|
383
|
+
|
|
384
|
+
```dsl
|
|
385
|
+
APIResponse:
|
|
386
|
+
@failure 5%
|
|
387
|
+
data: object
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### @partial_data
|
|
391
|
+
|
|
392
|
+
Randomly omits optional fields:
|
|
393
|
+
|
|
394
|
+
```dsl
|
|
395
|
+
User:
|
|
396
|
+
@partial_data 20%
|
|
397
|
+
name: text
|
|
398
|
+
phone?: phone
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## Grammar BNF (Formal)
|
|
404
|
+
|
|
405
|
+
```bnf
|
|
406
|
+
dsl := schema*
|
|
407
|
+
schema := SCHEMA_NAME ':' NEWLINE INDENT annotation* field* DEDENT
|
|
408
|
+
annotation := '@' IDENTIFIER value? NEWLINE
|
|
409
|
+
field := FIELD_NAME optional? ':' type nullable? condition? behavior* NEWLINE
|
|
410
|
+
optional := '?'
|
|
411
|
+
nullable := '?'
|
|
412
|
+
type := TYPE_NAME arguments?
|
|
413
|
+
arguments := '(' arg_list ')'
|
|
414
|
+
arg_list := arg (',' arg)*
|
|
415
|
+
arg := value | named_arg | range
|
|
416
|
+
named_arg := IDENTIFIER ':' value
|
|
417
|
+
range := NUMBER '..' NUMBER
|
|
418
|
+
condition := 'if' IDENTIFIER
|
|
419
|
+
behavior := '@' IDENTIFIER value?
|
|
420
|
+
value := STRING | NUMBER | BOOLEAN | IDENTIFIER
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## Next Steps
|
|
426
|
+
|
|
427
|
+
- [Core Types](core_types.md) - All built-in types
|
|
428
|
+
- [Complex Types](complex_types.md) - Arrays, objects, references
|
|
429
|
+
- [Field Modifiers](field_modifiers.md) - Optional, nullable, conditional
|
|
430
|
+
- [Behaviors](../behaviors/overview.md) - Latency, failure, etc.
|
|
431
|
+
|