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,312 @@
|
|
|
1
|
+
# Data Contracts Registry
|
|
2
|
+
|
|
3
|
+
Version, publish, and manage your schemas centrally with the **Data Contracts Registry**.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Publish a schema version
|
|
9
|
+
fake_data_dsl contracts publish User -v 1.0.0 -s schemas/ -m "Initial release"
|
|
10
|
+
|
|
11
|
+
# List all contracts
|
|
12
|
+
fake_data_dsl contracts list
|
|
13
|
+
|
|
14
|
+
# Check compatibility
|
|
15
|
+
fake_data_dsl contracts diff User 1.0.0 2.0.0
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## CLI Commands
|
|
19
|
+
|
|
20
|
+
### Publish
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
fake_data_dsl contracts publish <Schema> -v <version> [options]
|
|
24
|
+
|
|
25
|
+
Options:
|
|
26
|
+
-s, --schema-dir DIR Schema directory
|
|
27
|
+
-m, --message MSG Changelog message
|
|
28
|
+
-d, --dir DIR Contracts directory (default: contracts)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Example:
|
|
32
|
+
```bash
|
|
33
|
+
fake_data_dsl contracts publish User -v 1.0.0 -s schemas/ -m "Initial User schema"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Deprecate
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
fake_data_dsl contracts deprecate <Schema> -v <version> [options]
|
|
40
|
+
|
|
41
|
+
Options:
|
|
42
|
+
--sunset DATE Sunset date (YYYY-MM-DD)
|
|
43
|
+
-m, --message MSG Deprecation message
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
```bash
|
|
48
|
+
fake_data_dsl contracts deprecate User -v 1.0.0 --sunset 2026-06-01 -m "Use v2.0.0 instead"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### List
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
fake_data_dsl contracts list
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Output:
|
|
58
|
+
```
|
|
59
|
+
Data Contracts:
|
|
60
|
+
|
|
61
|
+
User:
|
|
62
|
+
✅ v2.0.0 (5 fields)
|
|
63
|
+
⚠️ v1.0.0 (3 fields)
|
|
64
|
+
|
|
65
|
+
Order:
|
|
66
|
+
✅ v1.0.0 (8 fields)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### History
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
fake_data_dsl contracts history User
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Output:
|
|
76
|
+
```
|
|
77
|
+
History for User:
|
|
78
|
+
|
|
79
|
+
2026-01-24T10:30:00Z - v2.0.0 published
|
|
80
|
+
Added avatar field, changed email validation
|
|
81
|
+
2026-01-01T09:00:00Z - v1.0.0 deprecated
|
|
82
|
+
Use v2.0.0 instead
|
|
83
|
+
2025-06-15T14:00:00Z - v1.0.0 published
|
|
84
|
+
Initial release
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Diff
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
fake_data_dsl contracts diff User 1.0.0 2.0.0
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Output:
|
|
94
|
+
```
|
|
95
|
+
Comparing User v1.0.0 → v2.0.0
|
|
96
|
+
|
|
97
|
+
❌ Breaking changes detected!
|
|
98
|
+
|
|
99
|
+
Changes:
|
|
100
|
+
Removed: legacy_field
|
|
101
|
+
Added: avatar, updated_at
|
|
102
|
+
Type changed: age (text → number)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Ruby API
|
|
106
|
+
|
|
107
|
+
### Initialize Registry
|
|
108
|
+
|
|
109
|
+
```ruby
|
|
110
|
+
# Create registry with storage directory
|
|
111
|
+
registry = FakeDataDSL::ContractsRegistry.new("contracts/")
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Publish
|
|
115
|
+
|
|
116
|
+
```ruby
|
|
117
|
+
schema = FakeDataDSL.load("schemas/user.dsl")
|
|
118
|
+
|
|
119
|
+
contract = registry.publish(
|
|
120
|
+
"User",
|
|
121
|
+
version: "1.0.0",
|
|
122
|
+
schema: schema,
|
|
123
|
+
changelog: "Initial release"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
puts contract[:schema_hash] # Content hash for integrity
|
|
127
|
+
puts contract[:fields] # Field signatures
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Deprecate
|
|
131
|
+
|
|
132
|
+
```ruby
|
|
133
|
+
registry.deprecate(
|
|
134
|
+
"User",
|
|
135
|
+
version: "1.0.0",
|
|
136
|
+
sunset_date: Date.new(2026, 6, 1),
|
|
137
|
+
message: "Migrate to v2.0.0"
|
|
138
|
+
)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Retire
|
|
142
|
+
|
|
143
|
+
```ruby
|
|
144
|
+
registry.retire("User", version: "1.0.0")
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Get Contract
|
|
148
|
+
|
|
149
|
+
```ruby
|
|
150
|
+
# Get specific version
|
|
151
|
+
contract = registry.get("User", version: "1.0.0")
|
|
152
|
+
|
|
153
|
+
# Get latest published version
|
|
154
|
+
latest = registry.get("User") # Returns newest published
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### List Versions
|
|
158
|
+
|
|
159
|
+
```ruby
|
|
160
|
+
versions = registry.versions_for("User")
|
|
161
|
+
# => ["1.0.0", "1.1.0", "2.0.0"]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Check Compatibility
|
|
165
|
+
|
|
166
|
+
```ruby
|
|
167
|
+
result = registry.compatible?("User", "1.0.0", "2.0.0")
|
|
168
|
+
|
|
169
|
+
if result[:breaking]
|
|
170
|
+
puts "Breaking changes detected!"
|
|
171
|
+
puts "Removed fields: #{result[:changes][:removed_fields]}"
|
|
172
|
+
puts "Type changes: #{result[:changes][:type_changes]}"
|
|
173
|
+
else
|
|
174
|
+
puts "Compatible!"
|
|
175
|
+
end
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Compatibility result:
|
|
179
|
+
```ruby
|
|
180
|
+
{
|
|
181
|
+
compatible: false,
|
|
182
|
+
breaking: true,
|
|
183
|
+
changes: {
|
|
184
|
+
removed_fields: ["legacy_field"],
|
|
185
|
+
added_fields: ["avatar", "updated_at"],
|
|
186
|
+
type_changes: [{ field: "age", from: "text", to: "number" }],
|
|
187
|
+
required_changes: [{ field: "email", change: "optional → required" }]
|
|
188
|
+
},
|
|
189
|
+
summary: "Removed fields: legacy_field; Type changed: age (text → number)"
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Validate Against Contract
|
|
194
|
+
|
|
195
|
+
```ruby
|
|
196
|
+
current_schema = FakeDataDSL.load("schemas/user.dsl")
|
|
197
|
+
|
|
198
|
+
result = registry.validate("User", version: "1.0.0", schema: current_schema)
|
|
199
|
+
|
|
200
|
+
if result[:valid]
|
|
201
|
+
puts "Schema matches contract!"
|
|
202
|
+
else
|
|
203
|
+
puts "Schema drift detected!"
|
|
204
|
+
puts "Missing: #{result[:missing_fields]}"
|
|
205
|
+
puts "Extra: #{result[:extra_fields]}"
|
|
206
|
+
end
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### History
|
|
210
|
+
|
|
211
|
+
```ruby
|
|
212
|
+
history = registry.history("User")
|
|
213
|
+
|
|
214
|
+
history.each do |entry|
|
|
215
|
+
puts "#{entry[:timestamp]} - v#{entry[:version]} #{entry[:action]}"
|
|
216
|
+
puts " #{entry[:message]}" if entry[:message]
|
|
217
|
+
end
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Export/Import
|
|
221
|
+
|
|
222
|
+
```ruby
|
|
223
|
+
# Export all contracts to directory
|
|
224
|
+
registry.export("exported_contracts/")
|
|
225
|
+
|
|
226
|
+
# Import contracts from directory
|
|
227
|
+
registry.import("imported_contracts/")
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Contract States
|
|
231
|
+
|
|
232
|
+
| State | Description |
|
|
233
|
+
|-------|-------------|
|
|
234
|
+
| `draft` | Not yet published |
|
|
235
|
+
| `published` | Active and available |
|
|
236
|
+
| `deprecated` | Scheduled for removal |
|
|
237
|
+
| `retired` | No longer available |
|
|
238
|
+
|
|
239
|
+
## Breaking Changes
|
|
240
|
+
|
|
241
|
+
The following changes are considered **breaking**:
|
|
242
|
+
|
|
243
|
+
| Change | Breaking? | Description |
|
|
244
|
+
|--------|-----------|-------------|
|
|
245
|
+
| Field removed | ✅ Yes | Consumers depend on this field |
|
|
246
|
+
| Type changed | ✅ Yes | `number` → `text` breaks parsing |
|
|
247
|
+
| Optional → Required | ✅ Yes | Consumers may not provide |
|
|
248
|
+
| Field added | ❌ No | Backwards compatible |
|
|
249
|
+
| Required → Optional | ❌ No | Backwards compatible |
|
|
250
|
+
|
|
251
|
+
## CI Integration
|
|
252
|
+
|
|
253
|
+
Use contracts in CI pipelines:
|
|
254
|
+
|
|
255
|
+
```yaml
|
|
256
|
+
# .github/workflows/schema-check.yml
|
|
257
|
+
name: Schema Validation
|
|
258
|
+
|
|
259
|
+
on: [push, pull_request]
|
|
260
|
+
|
|
261
|
+
jobs:
|
|
262
|
+
validate:
|
|
263
|
+
runs-on: ubuntu-latest
|
|
264
|
+
steps:
|
|
265
|
+
- uses: actions/checkout@v3
|
|
266
|
+
|
|
267
|
+
- name: Setup Ruby
|
|
268
|
+
uses: ruby/setup-ruby@v1
|
|
269
|
+
with:
|
|
270
|
+
ruby-version: '3.2'
|
|
271
|
+
bundler-cache: true
|
|
272
|
+
|
|
273
|
+
- name: Check for breaking changes
|
|
274
|
+
run: |
|
|
275
|
+
# Publish current schema
|
|
276
|
+
bundle exec fake_data_dsl contracts publish User \
|
|
277
|
+
-v ${{ github.sha }} \
|
|
278
|
+
-s schemas/
|
|
279
|
+
|
|
280
|
+
# Compare with main branch
|
|
281
|
+
bundle exec fake_data_dsl contracts diff User main ${{ github.sha }}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Storage Format
|
|
285
|
+
|
|
286
|
+
Contracts are stored as JSON files:
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
contracts/
|
|
290
|
+
├── schemas/
|
|
291
|
+
│ ├── User_v1.0.0.json
|
|
292
|
+
│ ├── User_v2.0.0.json
|
|
293
|
+
│ └── Order_v1.0.0.json
|
|
294
|
+
└── history/
|
|
295
|
+
├── User.json
|
|
296
|
+
└── Order.json
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Contract file structure:
|
|
300
|
+
```json
|
|
301
|
+
{
|
|
302
|
+
"name": "User",
|
|
303
|
+
"version": "1.0.0",
|
|
304
|
+
"state": "published",
|
|
305
|
+
"schema_hash": "abc123def456",
|
|
306
|
+
"fields": [
|
|
307
|
+
{ "name": "id", "type": "uuid", "optional": false, "nullable": false }
|
|
308
|
+
],
|
|
309
|
+
"published_at": "2026-01-24T10:30:00Z",
|
|
310
|
+
"changelog": "Initial release"
|
|
311
|
+
}
|
|
312
|
+
```
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# Enhanced REPL
|
|
2
|
+
|
|
3
|
+
The FakeDataDSL REPL now includes visual inspection, step-through debugging, and table formatting.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
fake_data_dsl repl
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Commands
|
|
12
|
+
|
|
13
|
+
### Basic Commands
|
|
14
|
+
|
|
15
|
+
- `load <path>` - Load schemas from file/directory
|
|
16
|
+
- `list` - List loaded schemas
|
|
17
|
+
- `info <Schema>` - Show schema details
|
|
18
|
+
- `gen <Schema>` - Generate one record (JSON format)
|
|
19
|
+
- `gen <Schema> N` - Generate N records (JSON format)
|
|
20
|
+
- `seed <number>` - Set seed for deterministic output
|
|
21
|
+
- `mode <mode>` - Set mode (random/edge/invalid/hostile/mixed)
|
|
22
|
+
- `help` - Show help
|
|
23
|
+
- `quit` / `exit` - Exit REPL
|
|
24
|
+
|
|
25
|
+
### Enhanced Commands
|
|
26
|
+
|
|
27
|
+
- `table <Schema>` - Generate one record (table view)
|
|
28
|
+
- `table <Schema> N` - Generate N records (table view)
|
|
29
|
+
- `debug <Schema>` - Step-through debugging
|
|
30
|
+
- `inspect <Schema>` - Detailed inspection (table + JSON + statistics)
|
|
31
|
+
|
|
32
|
+
## Table View
|
|
33
|
+
|
|
34
|
+
Display records in a formatted table:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
> table User
|
|
38
|
+
────────────────────┼───────────────────────────────
|
|
39
|
+
id │ "550e8400-e29b-41d4-a716-..."
|
|
40
|
+
name │ "John Doe"
|
|
41
|
+
email │ "john.doe@example.com"
|
|
42
|
+
age │ 34
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
For multiple records:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
> table User 5
|
|
49
|
+
id │ name │ email
|
|
50
|
+
────────────────────┼─────────────────────┼─────────────────────
|
|
51
|
+
550e8400... │ John Doe │ john@example.com
|
|
52
|
+
f47ac10b... │ Jane Smith │ jane@example.com
|
|
53
|
+
...
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Step-Through Debugging
|
|
57
|
+
|
|
58
|
+
Debug generation field-by-field:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
> debug User
|
|
62
|
+
🐛 Debug Mode: Generating User
|
|
63
|
+
Press Enter to continue after each field, 'q' to quit, 'c' to continue without pausing
|
|
64
|
+
|
|
65
|
+
[Field 1] id
|
|
66
|
+
────────────────────────────────────────────────────────
|
|
67
|
+
Value: "550e8400-e29b-41d4-a716-446655440000"
|
|
68
|
+
|
|
69
|
+
Context State:
|
|
70
|
+
Depth: 0
|
|
71
|
+
Registry: available
|
|
72
|
+
Parent Context: no
|
|
73
|
+
Shared Context: none
|
|
74
|
+
|
|
75
|
+
Generated Fields:
|
|
76
|
+
(none yet)
|
|
77
|
+
|
|
78
|
+
Press Enter to continue, 'q' to quit, 'c' to continue without pausing:
|
|
79
|
+
|
|
80
|
+
[Field 2] name
|
|
81
|
+
────────────────────────────────────────────────────────
|
|
82
|
+
Value: "John Doe"
|
|
83
|
+
|
|
84
|
+
Context State:
|
|
85
|
+
Depth: 0
|
|
86
|
+
Registry: available
|
|
87
|
+
Parent Context: no
|
|
88
|
+
Shared Context: none
|
|
89
|
+
|
|
90
|
+
Generated Fields:
|
|
91
|
+
id = "550e8400-e29b-41d4-a716-446655440000"
|
|
92
|
+
|
|
93
|
+
Press Enter to continue, 'q' to quit, 'c' to continue without pausing: c
|
|
94
|
+
Continuing without pausing...
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Debug Controls
|
|
98
|
+
|
|
99
|
+
- **Enter** - Continue to next field
|
|
100
|
+
- **q** / **quit** - Cancel debugging
|
|
101
|
+
- **c** / **continue** - Continue without pausing
|
|
102
|
+
|
|
103
|
+
## Detailed Inspection
|
|
104
|
+
|
|
105
|
+
Get comprehensive information about generated records:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
> inspect User
|
|
109
|
+
📊 Generated Record:
|
|
110
|
+
============================================================
|
|
111
|
+
────────────────────┼───────────────────────────────
|
|
112
|
+
id │ "550e8400-e29b-41d4-a716-..."
|
|
113
|
+
name │ "John Doe"
|
|
114
|
+
email │ "john.doe@example.com"
|
|
115
|
+
age │ 34
|
|
116
|
+
created_at │ "2024-01-15T10:30:00Z"
|
|
117
|
+
|
|
118
|
+
📋 JSON Format:
|
|
119
|
+
{
|
|
120
|
+
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
121
|
+
"name": "John Doe",
|
|
122
|
+
"email": "john.doe@example.com",
|
|
123
|
+
"age": 34,
|
|
124
|
+
"created_at": "2024-01-15T10:30:00Z"
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
📏 Statistics:
|
|
128
|
+
Fields: 5
|
|
129
|
+
Total size: 234 bytes
|
|
130
|
+
id: String (36)
|
|
131
|
+
name: String (8)
|
|
132
|
+
email: String (20)
|
|
133
|
+
age: Integer (2)
|
|
134
|
+
created_at: String (20)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Examples
|
|
138
|
+
|
|
139
|
+
### Loading Schemas
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
> load schemas/
|
|
143
|
+
✅ Loaded 3 schema(s)
|
|
144
|
+
|
|
145
|
+
> list
|
|
146
|
+
Loaded schemas:
|
|
147
|
+
- User v1.0
|
|
148
|
+
- Order v2.3
|
|
149
|
+
- Product
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Generating Data
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
> gen User
|
|
156
|
+
{
|
|
157
|
+
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
158
|
+
"name": "John Doe",
|
|
159
|
+
"email": "john.doe@example.com"
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
> gen User 5
|
|
163
|
+
[
|
|
164
|
+
{ "id": "...", "name": "John Doe", ... },
|
|
165
|
+
{ "id": "...", "name": "Jane Smith", ... },
|
|
166
|
+
...
|
|
167
|
+
]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Using Seeds
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
> seed 42
|
|
174
|
+
✅ Seed set to 42
|
|
175
|
+
|
|
176
|
+
> gen User
|
|
177
|
+
{
|
|
178
|
+
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
179
|
+
...
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
> gen User # Same seed = same output
|
|
183
|
+
{
|
|
184
|
+
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
185
|
+
...
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Changing Modes
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
> mode edge
|
|
193
|
+
✅ Mode set to edge
|
|
194
|
+
|
|
195
|
+
> gen User
|
|
196
|
+
{
|
|
197
|
+
"id": "00000000-0000-0000-0000-000000000000",
|
|
198
|
+
"name": "",
|
|
199
|
+
"email": ""
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
> mode hostile
|
|
203
|
+
✅ Mode set to hostile
|
|
204
|
+
|
|
205
|
+
> gen User
|
|
206
|
+
{
|
|
207
|
+
"id": "' OR '1'='1",
|
|
208
|
+
"name": "<script>alert(1)</script>",
|
|
209
|
+
"email": "'; DROP TABLE users;--"
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Use Cases
|
|
214
|
+
|
|
215
|
+
### Debugging Complex Schemas
|
|
216
|
+
|
|
217
|
+
Use `debug` to understand how complex schemas with `copy()` and `Ref()` work:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
> debug Order
|
|
221
|
+
# Step through each field to see context state
|
|
222
|
+
# Understand how copy() resolves parent fields
|
|
223
|
+
# See how Ref() resolves cross-schema references
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Quick Data Inspection
|
|
227
|
+
|
|
228
|
+
Use `table` for quick visual inspection:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
> table User 10
|
|
232
|
+
# See 10 users in a clean table format
|
|
233
|
+
# Easier to scan than JSON
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Schema Exploration
|
|
237
|
+
|
|
238
|
+
Use `inspect` to understand schema output:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
> inspect User
|
|
242
|
+
# See table + JSON + statistics
|
|
243
|
+
# Understand field types and sizes
|
|
244
|
+
# Verify schema structure
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Tips
|
|
248
|
+
|
|
249
|
+
1. **Use seeds for reproducibility** - Set a seed to get consistent output
|
|
250
|
+
2. **Use table view for quick checks** - Faster than JSON for visual inspection
|
|
251
|
+
3. **Use debug for complex schemas** - Understand field dependencies
|
|
252
|
+
4. **Use inspect for analysis** - Get comprehensive information
|
|
253
|
+
|
|
254
|
+
## Keyboard Shortcuts
|
|
255
|
+
|
|
256
|
+
- **Ctrl+C** - Interrupt current operation
|
|
257
|
+
- **Ctrl+D** - Exit REPL (same as `quit`)
|
|
258
|
+
|
|
259
|
+
## Configuration
|
|
260
|
+
|
|
261
|
+
The REPL respects global configuration:
|
|
262
|
+
|
|
263
|
+
```ruby
|
|
264
|
+
FakeDataDSL.configure do |config|
|
|
265
|
+
config.default_mode = :edge
|
|
266
|
+
config.limits.max_array_size = 100
|
|
267
|
+
end
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Troubleshooting
|
|
271
|
+
|
|
272
|
+
### No Output
|
|
273
|
+
|
|
274
|
+
Check that schemas are loaded:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
> list
|
|
278
|
+
No schemas loaded. Use 'load <path>' first.
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Schema Not Found
|
|
282
|
+
|
|
283
|
+
Verify schema name:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
> list
|
|
287
|
+
Loaded schemas:
|
|
288
|
+
- User
|
|
289
|
+
- Order
|
|
290
|
+
|
|
291
|
+
> gen User # Correct
|
|
292
|
+
> gen user # Wrong (case-sensitive)
|
|
293
|
+
❌ Schema 'user' not found
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Debug Mode Not Working
|
|
297
|
+
|
|
298
|
+
Ensure `on_field_generated` callback is available (it's built-in, should work automatically).
|
|
299
|
+
|
|
300
|
+
## See Also
|
|
301
|
+
|
|
302
|
+
- [CLI Guide](tech_example/04_cli_usage.md)
|
|
303
|
+
- [Generation Modes](tech_docs/modes/overview.md)
|
|
304
|
+
- [Schema Reference](tech_docs/dsl/schema_definition.md)
|