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,404 @@
|
|
|
1
|
+
# Rails Engine Integration
|
|
2
|
+
|
|
3
|
+
FakeDataDSL provides a **zero-configuration Rails Engine** that auto-discovers schemas, integrates with FactoryBot, and mounts the API server automatically.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
Simply add the gem to your Rails application:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
# Gemfile
|
|
11
|
+
gem 'fake_data_dsl'
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
That's it! The engine automatically:
|
|
15
|
+
|
|
16
|
+
- ✅ Discovers schemas from `db/schemas/` or `app/schemas/`
|
|
17
|
+
- ✅ Registers with FactoryBot if present
|
|
18
|
+
- ✅ Mounts API at `/fake_data` in development
|
|
19
|
+
- ✅ Configures for test environment
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
### 1. Add the Gem
|
|
24
|
+
|
|
25
|
+
```ruby
|
|
26
|
+
# Gemfile
|
|
27
|
+
gem 'fake_data_dsl'
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Run the Installer (Optional)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
rails generate fake_data_dsl:install
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This creates:
|
|
37
|
+
- `config/initializers/fake_data_dsl.rb` - Configuration
|
|
38
|
+
- `db/schemas/` - Schema directory
|
|
39
|
+
- `db/schemas/example.dsl` - Example schema
|
|
40
|
+
|
|
41
|
+
## Configuration
|
|
42
|
+
|
|
43
|
+
### Initializer
|
|
44
|
+
|
|
45
|
+
```ruby
|
|
46
|
+
# config/initializers/fake_data_dsl.rb
|
|
47
|
+
FakeDataDSL.configure do |config|
|
|
48
|
+
# Schema directories (auto-discovered by default)
|
|
49
|
+
config.schema_paths = [
|
|
50
|
+
Rails.root.join("db/schemas"),
|
|
51
|
+
Rails.root.join("app/schemas")
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
# Default generation mode
|
|
55
|
+
config.default_mode = :random
|
|
56
|
+
|
|
57
|
+
# Enable/disable API in development
|
|
58
|
+
config.mount_api = Rails.env.development?
|
|
59
|
+
|
|
60
|
+
# API mount path
|
|
61
|
+
config.api_mount_path = "/fake_data"
|
|
62
|
+
|
|
63
|
+
# Auto-register with FactoryBot
|
|
64
|
+
config.factory_bot_integration = defined?(FactoryBot)
|
|
65
|
+
|
|
66
|
+
# Logging
|
|
67
|
+
config.logger = Rails.logger
|
|
68
|
+
end
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Environment-Specific Settings
|
|
72
|
+
|
|
73
|
+
```ruby
|
|
74
|
+
# config/environments/development.rb
|
|
75
|
+
Rails.application.configure do
|
|
76
|
+
config.fake_data_dsl.mount_api = true
|
|
77
|
+
config.fake_data_dsl.api_mount_path = "/fake_data"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# config/environments/test.rb
|
|
81
|
+
Rails.application.configure do
|
|
82
|
+
config.fake_data_dsl.default_seed = 42 # Deterministic tests
|
|
83
|
+
config.fake_data_dsl.default_mode = :random
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# config/environments/production.rb
|
|
87
|
+
Rails.application.configure do
|
|
88
|
+
config.fake_data_dsl.mount_api = false # Disable in production
|
|
89
|
+
end
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Auto-Discovery
|
|
93
|
+
|
|
94
|
+
### Schema Locations
|
|
95
|
+
|
|
96
|
+
The engine searches for schemas in these directories (in order):
|
|
97
|
+
|
|
98
|
+
1. `db/schemas/` - Database-related schemas
|
|
99
|
+
2. `app/schemas/` - Application schemas
|
|
100
|
+
3. `lib/schemas/` - Library schemas (optional)
|
|
101
|
+
|
|
102
|
+
### File Extensions
|
|
103
|
+
|
|
104
|
+
Recognized extensions:
|
|
105
|
+
- `.dsl` - FakeDataDSL schema files
|
|
106
|
+
- `.fake` - Alias for `.dsl`
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
db/schemas/
|
|
110
|
+
├── user.dsl
|
|
111
|
+
├── order.dsl
|
|
112
|
+
├── product.dsl
|
|
113
|
+
└── nested/
|
|
114
|
+
├── admin_user.dsl
|
|
115
|
+
└── payment.dsl
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## API Mounting
|
|
119
|
+
|
|
120
|
+
### Default Behavior
|
|
121
|
+
|
|
122
|
+
In development, the API is mounted at `/fake_data`:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
# List all schemas
|
|
126
|
+
GET /fake_data/api/schemas
|
|
127
|
+
|
|
128
|
+
# Generate a User
|
|
129
|
+
GET /fake_data/api/user
|
|
130
|
+
|
|
131
|
+
# Generate 10 Users
|
|
132
|
+
GET /fake_data/api/user/batch?count=10
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Custom Mount Path
|
|
136
|
+
|
|
137
|
+
```ruby
|
|
138
|
+
# config/initializers/fake_data_dsl.rb
|
|
139
|
+
FakeDataDSL.configure do |config|
|
|
140
|
+
config.api_mount_path = "/api/mock"
|
|
141
|
+
end
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Manual Mounting
|
|
145
|
+
|
|
146
|
+
If you prefer manual control:
|
|
147
|
+
|
|
148
|
+
```ruby
|
|
149
|
+
# config/routes.rb
|
|
150
|
+
Rails.application.routes.draw do
|
|
151
|
+
if Rails.env.development? || Rails.env.staging?
|
|
152
|
+
mount FakeDataDSL::APIServer.rack_app(
|
|
153
|
+
schema_dir: Rails.root.join("db/schemas")
|
|
154
|
+
), at: "/mock-api"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## FactoryBot Integration
|
|
160
|
+
|
|
161
|
+
### Auto-Registration
|
|
162
|
+
|
|
163
|
+
When FactoryBot is detected, schemas are auto-registered as factories:
|
|
164
|
+
|
|
165
|
+
```ruby
|
|
166
|
+
# No configuration needed!
|
|
167
|
+
# db/schemas/user.dsl
|
|
168
|
+
User:
|
|
169
|
+
id: uuid
|
|
170
|
+
name: name
|
|
171
|
+
email: email
|
|
172
|
+
role: enum(user, admin)
|
|
173
|
+
|
|
174
|
+
# In tests, just use:
|
|
175
|
+
let(:user) { create(:user) }
|
|
176
|
+
let(:admin) { create(:user, role: "admin") }
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Manual Registration
|
|
180
|
+
|
|
181
|
+
```ruby
|
|
182
|
+
# spec/support/factories.rb
|
|
183
|
+
FakeDataDSL.register_factories do |registry|
|
|
184
|
+
registry.factory(:user, schema: "User") do
|
|
185
|
+
trait(:admin) { role { "admin" } }
|
|
186
|
+
trait(:inactive) { active { false } }
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
registry.factory(:order, schema: "Order") do
|
|
190
|
+
trait(:pending) { status { "pending" } }
|
|
191
|
+
trait(:completed) { status { "completed" } }
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## RSpec Integration
|
|
197
|
+
|
|
198
|
+
### Setup
|
|
199
|
+
|
|
200
|
+
```ruby
|
|
201
|
+
# spec/rails_helper.rb
|
|
202
|
+
require 'fake_data_dsl/rspec'
|
|
203
|
+
|
|
204
|
+
RSpec.configure do |config|
|
|
205
|
+
config.include FakeDataDSL::RSpecHelpers
|
|
206
|
+
end
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Available Helpers
|
|
210
|
+
|
|
211
|
+
```ruby
|
|
212
|
+
RSpec.describe User do
|
|
213
|
+
# Generate from schema
|
|
214
|
+
let(:user_data) { fake_data(:user) }
|
|
215
|
+
|
|
216
|
+
# With seed for determinism
|
|
217
|
+
let(:user) { fake_data(:user, seed: 42) }
|
|
218
|
+
|
|
219
|
+
# With overrides
|
|
220
|
+
let(:admin) { fake_data(:user, role: "admin") }
|
|
221
|
+
|
|
222
|
+
# Generate multiple
|
|
223
|
+
let(:users) { fake_data_list(:user, 5) }
|
|
224
|
+
|
|
225
|
+
it "creates valid user" do
|
|
226
|
+
expect(User.new(user_data)).to be_valid
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Generators
|
|
232
|
+
|
|
233
|
+
### Install Generator
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
rails generate fake_data_dsl:install
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Creates:
|
|
240
|
+
- Initializer
|
|
241
|
+
- Schema directory
|
|
242
|
+
- Example schema
|
|
243
|
+
|
|
244
|
+
### Schema Generator
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
rails generate fake_data_dsl:schema User
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Creates `db/schemas/user.dsl` with inferred fields from the User model.
|
|
251
|
+
|
|
252
|
+
### Migration Generator
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
rails generate fake_data_dsl:migration User
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Generates a migration from the User DSL schema.
|
|
259
|
+
|
|
260
|
+
## Rake Tasks
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
# List all discovered schemas
|
|
264
|
+
rake fake_data_dsl:schemas
|
|
265
|
+
|
|
266
|
+
# Validate all schemas
|
|
267
|
+
rake fake_data_dsl:validate
|
|
268
|
+
|
|
269
|
+
# Generate sample data
|
|
270
|
+
rake fake_data_dsl:generate[User,10]
|
|
271
|
+
|
|
272
|
+
# Export to JSON Schema
|
|
273
|
+
rake fake_data_dsl:export:json_schema
|
|
274
|
+
|
|
275
|
+
# Seed database from schemas
|
|
276
|
+
rake fake_data_dsl:seed
|
|
277
|
+
|
|
278
|
+
# Compare schemas for breaking changes
|
|
279
|
+
rake fake_data_dsl:diff
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Engine Hooks
|
|
283
|
+
|
|
284
|
+
### After Schema Load
|
|
285
|
+
|
|
286
|
+
```ruby
|
|
287
|
+
# config/initializers/fake_data_dsl.rb
|
|
288
|
+
FakeDataDSL.configure do |config|
|
|
289
|
+
config.after_schema_load do |schema|
|
|
290
|
+
Rails.logger.info "Loaded schema: #{schema.name}"
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Before Generation
|
|
296
|
+
|
|
297
|
+
```ruby
|
|
298
|
+
FakeDataDSL.configure do |config|
|
|
299
|
+
config.before_generate do |schema, options|
|
|
300
|
+
# Add request-specific context
|
|
301
|
+
options[:tenant_id] = Current.tenant_id
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Development Mode Features
|
|
307
|
+
|
|
308
|
+
In development, you get extra features:
|
|
309
|
+
|
|
310
|
+
### Hot Reload
|
|
311
|
+
|
|
312
|
+
Schemas are automatically reloaded when files change:
|
|
313
|
+
|
|
314
|
+
```ruby
|
|
315
|
+
# config/environments/development.rb
|
|
316
|
+
config.fake_data_dsl.watch_schemas = true
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Debug Panel
|
|
320
|
+
|
|
321
|
+
Add to your layout:
|
|
322
|
+
|
|
323
|
+
```erb
|
|
324
|
+
<% if Rails.env.development? %>
|
|
325
|
+
<%= render 'fake_data_dsl/debug_panel' %>
|
|
326
|
+
<% end %>
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Console Helpers
|
|
330
|
+
|
|
331
|
+
```ruby
|
|
332
|
+
# rails console
|
|
333
|
+
FakeDataDSL.generate("User")
|
|
334
|
+
FakeDataDSL.generate_many("User", 10)
|
|
335
|
+
FakeDataDSL.schemas # List all schemas
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Test Environment
|
|
339
|
+
|
|
340
|
+
### Deterministic Data
|
|
341
|
+
|
|
342
|
+
```ruby
|
|
343
|
+
# spec/rails_helper.rb
|
|
344
|
+
RSpec.configure do |config|
|
|
345
|
+
config.before(:suite) do
|
|
346
|
+
FakeDataDSL.configure do |dsl|
|
|
347
|
+
dsl.default_seed = 42
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Database Cleaner Integration
|
|
354
|
+
|
|
355
|
+
```ruby
|
|
356
|
+
# spec/support/database_cleaner.rb
|
|
357
|
+
RSpec.configure do |config|
|
|
358
|
+
config.before(:suite) do
|
|
359
|
+
DatabaseCleaner.strategy = :transaction
|
|
360
|
+
# Seed reference data from schemas
|
|
361
|
+
FakeDataDSL.seed_reference_data!
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
## Troubleshooting
|
|
367
|
+
|
|
368
|
+
### Schemas Not Loading
|
|
369
|
+
|
|
370
|
+
```ruby
|
|
371
|
+
# Check discovered paths
|
|
372
|
+
FakeDataDSL.schema_paths
|
|
373
|
+
# => ["/app/db/schemas", "/app/app/schemas"]
|
|
374
|
+
|
|
375
|
+
# Manually reload
|
|
376
|
+
FakeDataDSL.reload_schemas!
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### API Not Mounted
|
|
380
|
+
|
|
381
|
+
```ruby
|
|
382
|
+
# Check if mounted
|
|
383
|
+
Rails.application.routes.routes.any? { |r| r.path.spec.to_s.include?('fake_data') }
|
|
384
|
+
|
|
385
|
+
# Force mount in routes.rb
|
|
386
|
+
mount FakeDataDSL::Engine, at: "/fake_data"
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### FactoryBot Not Integrated
|
|
390
|
+
|
|
391
|
+
```ruby
|
|
392
|
+
# Check if detected
|
|
393
|
+
FakeDataDSL.factory_bot_available?
|
|
394
|
+
|
|
395
|
+
# Manual registration
|
|
396
|
+
FakeDataDSL.register_with_factory_bot!
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## See Also
|
|
400
|
+
|
|
401
|
+
- [Getting Started](getting_started.md)
|
|
402
|
+
- [Factory Bot Integration](FACTORY_BOT.md)
|
|
403
|
+
- [API Server](API_SERVER.md)
|
|
404
|
+
- [ActiveRecord Inference](ACTIVERECORD_INFERENCE.md)
|