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.
Files changed (302) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +4 -0
  3. data/.rubocop.yml +40 -0
  4. data/.yardopts +18 -0
  5. data/ACCESS_DOCS.md +116 -0
  6. data/ADVANCED_FEATURES_SUMMARY.md +245 -0
  7. data/CHANGELOG.md +498 -0
  8. data/CODE_OF_CONDUCT.md +122 -0
  9. data/CONTRIBUTING.md +307 -0
  10. data/DOCUMENTATION.md +204 -0
  11. data/DOCUMENTATION_GUIDE.md +194 -0
  12. data/LICENSE +22 -0
  13. data/README.md +1458 -0
  14. data/Rakefile +128 -0
  15. data/benchmark/README.md +591 -0
  16. data/benchmark/batch_generation.rb +63 -0
  17. data/benchmark/engine_comparison.rb +295 -0
  18. data/benchmark/single_record.rb +108 -0
  19. data/benchmark/streaming.rb +74 -0
  20. data/docs/ACTIVERECORD_INFERENCE.md +524 -0
  21. data/docs/API_SERVER.md +278 -0
  22. data/docs/CONFIG_FILE.md +315 -0
  23. data/docs/DATA_CONTRACTS.md +312 -0
  24. data/docs/ENHANCED_REPL.md +304 -0
  25. data/docs/FACTORY_BOT.md +271 -0
  26. data/docs/GITHUB_ACTION.md +420 -0
  27. data/docs/GRAPHQL_EXPORT.md +303 -0
  28. data/docs/GRAPHQL_FEDERATION.md +651 -0
  29. data/docs/HOW_TO_GENERATE_DOCS.md +252 -0
  30. data/docs/LSP.md +189 -0
  31. data/docs/MIGRATION_GENERATOR.md +547 -0
  32. data/docs/MOCK_SERVER.md +280 -0
  33. data/docs/NATIVE_ENGINE.md +298 -0
  34. data/docs/OPENAPI_EXPORT.md +252 -0
  35. data/docs/PERFORMANCE_MODE.md +228 -0
  36. data/docs/PERSONAS.md +547 -0
  37. data/docs/PROPERTY_TESTING.md +284 -0
  38. data/docs/PROTOBUF_EXPORT.md +276 -0
  39. data/docs/QUALITY_METRICS.md +555 -0
  40. data/docs/QUICK_REFERENCE.md +88 -0
  41. data/docs/RAILS_ENGINE.md +404 -0
  42. data/docs/RAILS_INTEGRATION.md +454 -0
  43. data/docs/README.md +175 -0
  44. data/docs/REPL_QUICK_REFERENCE.md +149 -0
  45. data/docs/RUST_INTEGRATION_GUIDE.md +1376 -0
  46. data/docs/SCENARIOS.md +576 -0
  47. data/docs/SECURITY_TESTING.md +318 -0
  48. data/docs/SNAPSHOT_TESTING.md +308 -0
  49. data/docs/STRING_TEXT_TYPES_REFERENCE.md +512 -0
  50. data/docs/TERRAFORM_EXPORT.md +447 -0
  51. data/docs/TIME_TRAVEL.md +507 -0
  52. data/docs/USAGE_GUIDE.md +980 -0
  53. data/docs/WEBHOOK_SIMULATOR.md +579 -0
  54. data/docs/advanced_features.md +183 -0
  55. data/docs/api_reference.md +153 -0
  56. data/docs/behaviors.md +138 -0
  57. data/docs/best_practices.md +191 -0
  58. data/docs/dsl_reference.md +172 -0
  59. data/docs/examples.md +162 -0
  60. data/docs/generation_modes.md +125 -0
  61. data/docs/getting_started.md +92 -0
  62. data/docs/index.html +177 -0
  63. data/docs/strategic/CLOUD_REGISTRY_ARCHITECTURE.md +268 -0
  64. data/docs/strategic/SIMD_OPTIMIZATION_STRATEGY.md +153 -0
  65. data/docs/troubleshooting.md +215 -0
  66. data/docs/type_reference.md +224 -0
  67. data/examples/hostile_mode_demo.rb +64 -0
  68. data/exe/synthra +6 -0
  69. data/ext/synthra_native/Cargo.lock +972 -0
  70. data/ext/synthra_native/Cargo.toml +46 -0
  71. data/ext/synthra_native/extconf.rb +41 -0
  72. data/ext/synthra_native/src/generator.rs +397 -0
  73. data/ext/synthra_native/src/lib.rs +229 -0
  74. data/ext/synthra_native/src/types.rs +1485 -0
  75. data/lib/generators/synthra/install_generator.rb +86 -0
  76. data/lib/generators/synthra/templates/api_response.dsl +15 -0
  77. data/lib/generators/synthra/templates/fake_data.rake +116 -0
  78. data/lib/generators/synthra/templates/synthra.yml +31 -0
  79. data/lib/generators/synthra/templates/synthra_support.rb +19 -0
  80. data/lib/generators/synthra/templates/user.dsl +11 -0
  81. data/lib/synthra/activerecord_inference.rb +394 -0
  82. data/lib/synthra/api.rb +381 -0
  83. data/lib/synthra/api_server.rb +718 -0
  84. data/lib/synthra/behaviors/applicator.rb +165 -0
  85. data/lib/synthra/behaviors/base.rb +155 -0
  86. data/lib/synthra/behaviors/close_connection.rb +60 -0
  87. data/lib/synthra/behaviors/deprecated.rb +100 -0
  88. data/lib/synthra/behaviors/failure.rb +69 -0
  89. data/lib/synthra/behaviors/latency.rb +103 -0
  90. data/lib/synthra/behaviors/partial_data.rb +83 -0
  91. data/lib/synthra/behaviors/randomize_order.rb +74 -0
  92. data/lib/synthra/behaviors/registry.rb +238 -0
  93. data/lib/synthra/behaviors/simulate_error.rb +79 -0
  94. data/lib/synthra/cli/commands/base.rb +105 -0
  95. data/lib/synthra/cli/commands/diff.rb +227 -0
  96. data/lib/synthra/cli/commands/docs.rb +67 -0
  97. data/lib/synthra/cli/commands/export.rb +150 -0
  98. data/lib/synthra/cli/commands/generate.rb +72 -0
  99. data/lib/synthra/cli/commands/import.rb +80 -0
  100. data/lib/synthra/cli/commands/lint.rb +53 -0
  101. data/lib/synthra/cli/commands/live.rb +57 -0
  102. data/lib/synthra/cli/commands/seed.rb +99 -0
  103. data/lib/synthra/cli/commands/validate.rb +28 -0
  104. data/lib/synthra/cli.rb +2471 -0
  105. data/lib/synthra/config_file.rb +129 -0
  106. data/lib/synthra/configuration.rb +281 -0
  107. data/lib/synthra/contracts_registry.rb +408 -0
  108. data/lib/synthra/database_seeder.rb +268 -0
  109. data/lib/synthra/deterministic_ids.rb +218 -0
  110. data/lib/synthra/documentation_generator.rb +414 -0
  111. data/lib/synthra/engine.rb +251 -0
  112. data/lib/synthra/errors.rb +1169 -0
  113. data/lib/synthra/export/base.rb +85 -0
  114. data/lib/synthra/export/csv.rb +101 -0
  115. data/lib/synthra/export/graphql.rb +266 -0
  116. data/lib/synthra/export/graphql_federation.rb +377 -0
  117. data/lib/synthra/export/graphviz.rb +258 -0
  118. data/lib/synthra/export/javascript.rb +327 -0
  119. data/lib/synthra/export/json_data.rb +61 -0
  120. data/lib/synthra/export/json_schema.rb +290 -0
  121. data/lib/synthra/export/openapi.rb +514 -0
  122. data/lib/synthra/export/protobuf.rb +483 -0
  123. data/lib/synthra/export/python.rb +560 -0
  124. data/lib/synthra/export/sql.rb +381 -0
  125. data/lib/synthra/export/sql_insert.rb +152 -0
  126. data/lib/synthra/export/terraform.rb +501 -0
  127. data/lib/synthra/export/type_mapping.rb +389 -0
  128. data/lib/synthra/export/typescript.rb +300 -0
  129. data/lib/synthra/export/xml_data.rb +104 -0
  130. data/lib/synthra/export/yaml_data.rb +56 -0
  131. data/lib/synthra/export.rb +404 -0
  132. data/lib/synthra/factory_bot_integration.rb +157 -0
  133. data/lib/synthra/field.rb +440 -0
  134. data/lib/synthra/functions/registry.rb +104 -0
  135. data/lib/synthra/generator/context.rb +372 -0
  136. data/lib/synthra/generator/engine.rb +336 -0
  137. data/lib/synthra/generator/faker_adapter.rb +425 -0
  138. data/lib/synthra/generator/modes.rb +444 -0
  139. data/lib/synthra/generator/resolver.rb +256 -0
  140. data/lib/synthra/generator/rng.rb +273 -0
  141. data/lib/synthra/generator/streamer.rb +63 -0
  142. data/lib/synthra/generator/uniqueness.rb +118 -0
  143. data/lib/synthra/initializer.rb +97 -0
  144. data/lib/synthra/limits.rb +279 -0
  145. data/lib/synthra/live_preview.rb +518 -0
  146. data/lib/synthra/loader_config.rb +78 -0
  147. data/lib/synthra/lsp/server.rb +689 -0
  148. data/lib/synthra/migration_generator.rb +301 -0
  149. data/lib/synthra/mixin.rb +174 -0
  150. data/lib/synthra/mock_server.rb +458 -0
  151. data/lib/synthra/native_engine.rb +304 -0
  152. data/lib/synthra/openapi_importer.rb +228 -0
  153. data/lib/synthra/output/json_formatter.rb +40 -0
  154. data/lib/synthra/output/ndjson_formatter.rb +55 -0
  155. data/lib/synthra/parser/ast.rb +1287 -0
  156. data/lib/synthra/parser/lexer.rb +1152 -0
  157. data/lib/synthra/parser/parser.rb +1664 -0
  158. data/lib/synthra/parser/tokens.rb +461 -0
  159. data/lib/synthra/performance_mode.rb +364 -0
  160. data/lib/synthra/personas.rb +397 -0
  161. data/lib/synthra/property_testing.rb +172 -0
  162. data/lib/synthra/quality_metrics.rb +405 -0
  163. data/lib/synthra/rails_test_helper.rb +248 -0
  164. data/lib/synthra/registry.rb +533 -0
  165. data/lib/synthra/relationships.rb +193 -0
  166. data/lib/synthra/repl/enhanced_repl.rb +607 -0
  167. data/lib/synthra/repl/formatter.rb +191 -0
  168. data/lib/synthra/scenarios.rb +423 -0
  169. data/lib/synthra/schema.rb +605 -0
  170. data/lib/synthra/schema_inheritance.rb +104 -0
  171. data/lib/synthra/schema_versioning.rb +212 -0
  172. data/lib/synthra/snapshot_testing.rb +199 -0
  173. data/lib/synthra/time_travel.rb +338 -0
  174. data/lib/synthra/type_definitions.rb +274 -0
  175. data/lib/synthra/types/address_location/addresses.rb +125 -0
  176. data/lib/synthra/types/address_location/airports.rb +200 -0
  177. data/lib/synthra/types/address_location/banks_hospitals.rb +207 -0
  178. data/lib/synthra/types/address_location/locations.rb +406 -0
  179. data/lib/synthra/types/base.rb +48 -0
  180. data/lib/synthra/types/commerce_products/commerce.rb +119 -0
  181. data/lib/synthra/types/commerce_products/companies.rb +71 -0
  182. data/lib/synthra/types/commerce_products/construction.rb +126 -0
  183. data/lib/synthra/types/commerce_products/products.rb +205 -0
  184. data/lib/synthra/types/core/collections.rb +513 -0
  185. data/lib/synthra/types/core/defaults.rb +76 -0
  186. data/lib/synthra/types/core/enums.rb +102 -0
  187. data/lib/synthra/types/core/identifiers.rb +445 -0
  188. data/lib/synthra/types/core/primitives.rb +586 -0
  189. data/lib/synthra/types/core/references.rb +466 -0
  190. data/lib/synthra/types/core/sequences.rb +304 -0
  191. data/lib/synthra/types/crypto/crypto.rb +162 -0
  192. data/lib/synthra/types/date_time/dates.rb +387 -0
  193. data/lib/synthra/types/finance_banking/banking.rb +424 -0
  194. data/lib/synthra/types/finance_banking/credit_cards.rb +24 -0
  195. data/lib/synthra/types/finance_banking/identifiers.rb +93 -0
  196. data/lib/synthra/types/formula.rb +184 -0
  197. data/lib/synthra/types/health_medical/medical.rb +150 -0
  198. data/lib/synthra/types/hostile_payloads.rb +122 -0
  199. data/lib/synthra/types/json_array.rb +51 -0
  200. data/lib/synthra/types/media_entertainment/media.rb +62 -0
  201. data/lib/synthra/types/naughty_string.rb +30 -0
  202. data/lib/synthra/types/personal_names/chinese.rb +41 -0
  203. data/lib/synthra/types/personal_names/identifiers.rb +187 -0
  204. data/lib/synthra/types/personal_names/names.rb +246 -0
  205. data/lib/synthra/types/personal_names/national_id.rb +89 -0
  206. data/lib/synthra/types/personal_names/titles_suffixes.rb +41 -0
  207. data/lib/synthra/types/regex.rb +248 -0
  208. data/lib/synthra/types/registry.rb +182 -0
  209. data/lib/synthra/types/repeating_element.rb +50 -0
  210. data/lib/synthra/types/scenario.rb +29 -0
  211. data/lib/synthra/types/technology_internet/apps.rb +67 -0
  212. data/lib/synthra/types/technology_internet/communication.rb +162 -0
  213. data/lib/synthra/types/technology_internet/devices.rb +80 -0
  214. data/lib/synthra/types/technology_internet/formats.rb +139 -0
  215. data/lib/synthra/types/technology_internet/networking.rb +143 -0
  216. data/lib/synthra/types/template.rb +92 -0
  217. data/lib/synthra/types/text_content/business.rb +128 -0
  218. data/lib/synthra/types/text_content/colors.rb +70 -0
  219. data/lib/synthra/types/text_content/misc.rb +237 -0
  220. data/lib/synthra/types/text_content/security.rb +130 -0
  221. data/lib/synthra/types/text_content/text_generation.rb +532 -0
  222. data/lib/synthra/types/travel/travel.rb +150 -0
  223. data/lib/synthra/utils/string_distance.rb +133 -0
  224. data/lib/synthra/validator/dsl_validator.rb +339 -0
  225. data/lib/synthra/validator/path_validator.rb +615 -0
  226. data/lib/synthra/version.rb +35 -0
  227. data/lib/synthra/webhook_simulator.rb +341 -0
  228. data/lib/synthra.rb +259 -0
  229. data/schemas/address.dsl +16 -0
  230. data/schemas/api_response.dsl +8 -0
  231. data/schemas/error_payload.dsl +9 -0
  232. data/schemas/order.dsl +10 -0
  233. data/schemas/order_item.dsl +8 -0
  234. data/schemas/payment.dsl +11 -0
  235. data/schemas/social_post.dsl +13 -0
  236. data/schemas/user.dsl +10 -0
  237. data/scripts/batch_fix_all.rb +96 -0
  238. data/scripts/delete_old_files.rb +32 -0
  239. data/scripts/fix_all_grouped_files.rb +137 -0
  240. data/scripts/fix_all_indentation.rb +48 -0
  241. data/scripts/fix_all_syntax.rb +124 -0
  242. data/scripts/fix_grouped_files.rb +184 -0
  243. data/scripts/fix_syntax_errors.rb +108 -0
  244. data/scripts/group_domain_types.rb +112 -0
  245. data/scripts/group_domain_types_fixed.rb +150 -0
  246. data/scripts/merge_domains_to_one_file.rb +68 -0
  247. data/scripts/move_existing_types.rb +130 -0
  248. data/scripts/split_grouped_types.rb +142 -0
  249. data/tech_docs/README.md +134 -0
  250. data/tech_docs/advanced/streaming.md +405 -0
  251. data/tech_docs/advanced/thread_safety.md +253 -0
  252. data/tech_docs/api/overview.md +485 -0
  253. data/tech_docs/appendices/type_chart.md +193 -0
  254. data/tech_docs/basic_concepts.md +383 -0
  255. data/tech_docs/behaviors/overview.md +346 -0
  256. data/tech_docs/dsl/complex_types.md +790 -0
  257. data/tech_docs/dsl/core_types.md +464 -0
  258. data/tech_docs/dsl/datetime_types.md +325 -0
  259. data/tech_docs/dsl/field_modifiers.md +414 -0
  260. data/tech_docs/dsl/grammar.md +431 -0
  261. data/tech_docs/dsl/schema_definition.md +399 -0
  262. data/tech_docs/export/README.md +276 -0
  263. data/tech_docs/installation.md +273 -0
  264. data/tech_docs/integration/ci_cd.md +707 -0
  265. data/tech_docs/integration/ci_cd_guide.md +579 -0
  266. data/tech_docs/integration/factory_bot.md +485 -0
  267. data/tech_docs/integration/rails.md +630 -0
  268. data/tech_docs/integration/rspec.md +449 -0
  269. data/tech_docs/modes/overview.md +350 -0
  270. data/tech_docs/performance/NATIVE_RUST_EXTENSION.md +1270 -0
  271. data/tech_docs/performance/OPTIMIZATION_GUIDE.md +901 -0
  272. data/tech_docs/quick_start.md +256 -0
  273. data/tech_docs/templates/README.md +805 -0
  274. data/tech_docs/tutorials/advanced.md +371 -0
  275. data/tech_docs/tutorials/getting_started.md +189 -0
  276. data/tech_docs/tutorials/intermediate.md +231 -0
  277. data/tech_docs/tutorials/template_gallery.md +569 -0
  278. data/tech_example/01_basic_usage.rb +238 -0
  279. data/tech_example/02_types_demo.rb +336 -0
  280. data/tech_example/04_cli_usage.md +429 -0
  281. data/tech_example/05_database_seeding.rb +283 -0
  282. data/tech_example/07_rspec_integration.rb +359 -0
  283. data/tech_example/10_custom_types.rb +387 -0
  284. data/tech_example/12_behaviors.rb +372 -0
  285. data/tech_example/13_twitter_dm_example.rb +120 -0
  286. data/tech_example/14_exact_json_structure.rb +253 -0
  287. data/tech_example/16_lsp_server.rb +56 -0
  288. data/tech_example/17_property_testing.rb +92 -0
  289. data/tech_example/18_enhanced_repl.rb +120 -0
  290. data/tech_example/19_security_fuzzing.rb +145 -0
  291. data/tech_example/NEW_FEATURES.md +169 -0
  292. data/tech_example/README.md +118 -0
  293. data/tech_example/schemas/api_response.dsl +123 -0
  294. data/tech_example/schemas/ecommerce.dsl +121 -0
  295. data/tech_example/schemas/twitter_dm.dsl +109 -0
  296. data/tech_example/schemas/user.dsl +36 -0
  297. data/vscode-extension/README.md +246 -0
  298. data/vscode-extension/language-configuration.json +31 -0
  299. data/vscode-extension/package.json +55 -0
  300. data/vscode-extension/snippets/fakedatadsl.json +198 -0
  301. data/vscode-extension/syntaxes/fakedatadsl.tmLanguage.json +128 -0
  302. 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)