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,231 @@
|
|
|
1
|
+
# Intermediate Tutorial
|
|
2
|
+
|
|
3
|
+
Learn cross-references, copy(), and shared() for realistic data.
|
|
4
|
+
|
|
5
|
+
## Difficulty: Intermediate
|
|
6
|
+
## Time: 30 minutes
|
|
7
|
+
## Prerequisites: [Getting Started](getting_started.md)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 1: The Problem with Independent IDs
|
|
12
|
+
|
|
13
|
+
Consider this e-commerce schema:
|
|
14
|
+
|
|
15
|
+
```dsl
|
|
16
|
+
Order:
|
|
17
|
+
id: uuid
|
|
18
|
+
user: User
|
|
19
|
+
user_id: uuid # ❌ This generates a DIFFERENT uuid!
|
|
20
|
+
|
|
21
|
+
User:
|
|
22
|
+
id: uuid
|
|
23
|
+
name: full_name
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The `user_id` field generates a random UUID that doesn't match `user.id`. That's not realistic!
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Step 2: copy() - Link Related Fields
|
|
31
|
+
|
|
32
|
+
Use `copy()` to reference values from already-generated fields:
|
|
33
|
+
|
|
34
|
+
```dsl
|
|
35
|
+
Order:
|
|
36
|
+
user: User
|
|
37
|
+
user_id: copy("user.id") # ✅ Same ID as user.id
|
|
38
|
+
|
|
39
|
+
User:
|
|
40
|
+
id: uuid
|
|
41
|
+
name: full_name
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Now `user_id` will always equal `user.id`!
|
|
45
|
+
|
|
46
|
+
### Important Rule: Field Order
|
|
47
|
+
|
|
48
|
+
`copy()` can only reference fields defined **BEFORE** it:
|
|
49
|
+
|
|
50
|
+
```dsl
|
|
51
|
+
# ✅ CORRECT - user defined before user_id
|
|
52
|
+
Order:
|
|
53
|
+
user: User
|
|
54
|
+
user_id: copy("user.id")
|
|
55
|
+
|
|
56
|
+
# ❌ WRONG - user_id before user
|
|
57
|
+
Order:
|
|
58
|
+
user_id: copy("user.id") # Will be nil!
|
|
59
|
+
user: User
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Step 3: Ref() - Cross-Schema References
|
|
65
|
+
|
|
66
|
+
`Ref()` generates a value matching another schema's field type:
|
|
67
|
+
|
|
68
|
+
```dsl
|
|
69
|
+
Order:
|
|
70
|
+
id: uuid
|
|
71
|
+
customer_id: Ref(Customer.id) # Generates a UUID (same type as Customer.id)
|
|
72
|
+
|
|
73
|
+
Customer:
|
|
74
|
+
id: uuid
|
|
75
|
+
name: full_name
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Ref() vs copy() - Know the Difference!
|
|
79
|
+
|
|
80
|
+
| Feature | `Ref(Schema.field)` | `copy("path")` |
|
|
81
|
+
|---------|---------------------|----------------|
|
|
82
|
+
| What it does | Generates NEW value | Copies EXISTING value |
|
|
83
|
+
| When to use | Foreign keys | Linking nested IDs |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Step 4: shared() - Same Value Across Batch
|
|
88
|
+
|
|
89
|
+
In batch generation, `shared()` keeps a value consistent across all records:
|
|
90
|
+
|
|
91
|
+
```dsl
|
|
92
|
+
Notification:
|
|
93
|
+
recipient: shared(User) # SAME user for all notifications
|
|
94
|
+
sender: User # DIFFERENT user each time
|
|
95
|
+
message: text
|
|
96
|
+
|
|
97
|
+
User:
|
|
98
|
+
id: uuid
|
|
99
|
+
name: full_name
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Generate a batch:
|
|
103
|
+
|
|
104
|
+
```ruby
|
|
105
|
+
notifications = schema.generate_many(10, registry: registry)
|
|
106
|
+
|
|
107
|
+
# All 10 notifications have the SAME recipient
|
|
108
|
+
# But different senders
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Important: shared() requires generate_many()
|
|
112
|
+
|
|
113
|
+
```ruby
|
|
114
|
+
# ✅ CORRECT - shared() works
|
|
115
|
+
notifications = schema.generate_many(10, registry: registry)
|
|
116
|
+
|
|
117
|
+
# ⚠️ WARNING - shared() doesn't share across separate generate() calls
|
|
118
|
+
n1 = schema.generate(registry: registry)
|
|
119
|
+
n2 = schema.generate(registry: registry)
|
|
120
|
+
# n1.recipient != n2.recipient
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Step 5: Combining copy() with Nested Schemas
|
|
126
|
+
|
|
127
|
+
Real-world example - Twitter DM:
|
|
128
|
+
|
|
129
|
+
```dsl
|
|
130
|
+
DirectMessage:
|
|
131
|
+
sender: User
|
|
132
|
+
sender_id: copy("sender.id") # Links to sender
|
|
133
|
+
recipient: User
|
|
134
|
+
recipient_id: copy("recipient.id") # Links to recipient
|
|
135
|
+
text: message_text
|
|
136
|
+
|
|
137
|
+
User:
|
|
138
|
+
id: snowflake_id
|
|
139
|
+
name: full_name
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The `sender_id` always matches `sender.id`, and `recipient_id` always matches `recipient.id`.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Step 6: Using Registry for Multiple Schemas
|
|
147
|
+
|
|
148
|
+
When you have multiple schemas that reference each other:
|
|
149
|
+
|
|
150
|
+
```ruby
|
|
151
|
+
# Create registry and load schemas
|
|
152
|
+
registry = FakeDataDSL::Registry.new
|
|
153
|
+
registry.load_file('schemas/user.dsl')
|
|
154
|
+
registry.load_file('schemas/order.dsl')
|
|
155
|
+
|
|
156
|
+
# Or load entire directory
|
|
157
|
+
registry.load_dir('schemas/')
|
|
158
|
+
|
|
159
|
+
# Generate with registry for cross-references
|
|
160
|
+
order = registry.schema('Order').generate(registry: registry)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Step 7: Validation and Error Messages
|
|
166
|
+
|
|
167
|
+
FakeDataDSL validates your schemas:
|
|
168
|
+
|
|
169
|
+
```dsl
|
|
170
|
+
Order:
|
|
171
|
+
user_id: copy("users.id") # Typo: "users" instead of "user"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Error message:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
Path 'users.id' not found in schema
|
|
178
|
+
Did you mean: user.id?
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Field order validation:
|
|
182
|
+
|
|
183
|
+
```dsl
|
|
184
|
+
Order:
|
|
185
|
+
user_id: copy("user.id") # ❌ user not defined yet!
|
|
186
|
+
user: User
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Error:
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
Field order error in 'Order': 'user_id' uses copy("user.id") but the source field is defined after it
|
|
193
|
+
Did you mean: Move 'user' field before 'user_id' in schema 'Order'?
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Practice Exercise
|
|
199
|
+
|
|
200
|
+
Create schemas for a blog system:
|
|
201
|
+
|
|
202
|
+
1. `Author` - id, name, email
|
|
203
|
+
2. `Post` - id, author (nested), author_id (copy), title, content
|
|
204
|
+
3. `Comment` - id, post_id (Ref), author (nested), author_id (copy), text
|
|
205
|
+
|
|
206
|
+
Verify that:
|
|
207
|
+
- `post.author_id` equals `post.author.id`
|
|
208
|
+
- `comment.author_id` equals `comment.author.id`
|
|
209
|
+
- `comment.post_id` is a valid UUID
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## What You Learned
|
|
214
|
+
|
|
215
|
+
✅ `copy()` - Reference existing generated values
|
|
216
|
+
✅ `Ref()` - Generate values matching another schema's type
|
|
217
|
+
✅ `shared()` - Keep value consistent across batch
|
|
218
|
+
✅ Field order matters for `copy()`
|
|
219
|
+
✅ Registry for multi-schema projects
|
|
220
|
+
✅ Error messages help find mistakes
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Next Steps
|
|
225
|
+
|
|
226
|
+
Ready for advanced features?
|
|
227
|
+
|
|
228
|
+
1. [Advanced Tutorial](advanced.md) - map_by_field(), behaviors, streaming
|
|
229
|
+
2. [Complex Types Reference](../dsl/complex_types.md)
|
|
230
|
+
3. [Twitter DM Example](../../tech_example/13_twitter_dm_example.rb)
|
|
231
|
+
|