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,278 @@
1
+ # Production API Server
2
+
3
+ FakeDataDSL includes a **production-ready REST API server** for data generation. Use it as the core of your data generation platform.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Start server with default settings
9
+ fake_data_dsl server schemas/ --port 3000
10
+
11
+ # Start with authentication
12
+ fake_data_dsl server schemas/ --port 3000 --api-key secret123
13
+
14
+ # Production mode with rate limiting
15
+ fake_data_dsl server schemas/ --port 3000 --env production --rate-limit 100
16
+ ```
17
+
18
+ ## CLI Options
19
+
20
+ | Option | Description | Default |
21
+ |--------|-------------|---------|
22
+ | `-d, --dir DIR` | Schema directory | Required |
23
+ | `-p, --port PORT` | Server port | 3000 |
24
+ | `-h, --host HOST` | Bind address | 0.0.0.0 |
25
+ | `-e, --env ENV` | Environment | development |
26
+ | `--no-cors` | Disable CORS | CORS enabled |
27
+ | `--rate-limit N` | Requests/minute | 0 (unlimited) |
28
+ | `--api-key KEY` | Require API key | None |
29
+
30
+ ## API Endpoints
31
+
32
+ ### List Schemas
33
+
34
+ ```bash
35
+ GET /api/schemas
36
+ ```
37
+
38
+ Response:
39
+ ```json
40
+ {
41
+ "schemas": [
42
+ { "name": "User", "fields": 5, "endpoint": "/api/user" },
43
+ { "name": "Order", "fields": 8, "endpoint": "/api/order" }
44
+ ]
45
+ }
46
+ ```
47
+
48
+ ### Generate Single Record
49
+
50
+ ```bash
51
+ GET /api/:schema?seed=42&mode=random
52
+ ```
53
+
54
+ Query Parameters:
55
+ - `seed` - Random seed for deterministic output
56
+ - `mode` - Generation mode: random, edge, invalid, hostile, mixed
57
+
58
+ Response:
59
+ ```json
60
+ {
61
+ "id": "550e8400-e29b-41d4-a716-446655440000",
62
+ "name": "John Doe",
63
+ "email": "john@example.com"
64
+ }
65
+ ```
66
+
67
+ ### Generate Batch
68
+
69
+ ```bash
70
+ GET /api/:schema/batch?count=100&seed=42
71
+ ```
72
+
73
+ Response:
74
+ ```json
75
+ {
76
+ "data": [...],
77
+ "meta": {
78
+ "count": 100,
79
+ "schema": "User",
80
+ "seed": 42,
81
+ "mode": "random"
82
+ }
83
+ }
84
+ ```
85
+
86
+ ### Stream Records
87
+
88
+ ```bash
89
+ GET /api/:schema/stream?count=1000
90
+ ```
91
+
92
+ Returns NDJSON (newline-delimited JSON) for streaming:
93
+ ```
94
+ {"id":"...","name":"John"}
95
+ {"id":"...","name":"Jane"}
96
+ ```
97
+
98
+ ### Generate with Overrides
99
+
100
+ ```bash
101
+ POST /api/:schema
102
+ Content-Type: application/json
103
+
104
+ {
105
+ "count": 10,
106
+ "seed": 42,
107
+ "mode": "random",
108
+ "overrides": {
109
+ "role": "admin",
110
+ "active": true
111
+ }
112
+ }
113
+ ```
114
+
115
+ ### Get Schema Info
116
+
117
+ ```bash
118
+ GET /api/:schema/schema
119
+ ```
120
+
121
+ ### Export OpenAPI/Protobuf
122
+
123
+ ```bash
124
+ GET /api/:schema/openapi
125
+ GET /api/:schema/protobuf
126
+ ```
127
+
128
+ ## Ruby API
129
+
130
+ ```ruby
131
+ require 'fake_data_dsl'
132
+
133
+ # Start server
134
+ FakeDataDSL::APIServer.start(
135
+ schema_dir: "schemas/",
136
+ port: 3000,
137
+ host: "0.0.0.0",
138
+ environment: :production,
139
+ cors: true,
140
+ rate_limit: 100,
141
+ auth: { type: :api_key, keys: ["secret123"] },
142
+ enable_metrics: true,
143
+ enable_caching: true,
144
+ cache_ttl: 60
145
+ )
146
+
147
+ # Start in background
148
+ thread = FakeDataDSL::APIServer.new(schema_dir: "schemas/").start_async
149
+ ```
150
+
151
+ ## Rack Integration
152
+
153
+ Deploy with Puma, Unicorn, or any Rack-compatible server:
154
+
155
+ ```ruby
156
+ # config.ru
157
+ require 'fake_data_dsl'
158
+
159
+ run FakeDataDSL::APIServer.rack_app(
160
+ schema_dir: "schemas/",
161
+ auth: { type: :api_key, keys: [ENV['API_KEY']] }
162
+ )
163
+ ```
164
+
165
+ Then run:
166
+ ```bash
167
+ puma config.ru -p 3000 -t 4:16
168
+ ```
169
+
170
+ ## Authentication
171
+
172
+ ### API Key
173
+
174
+ ```ruby
175
+ FakeDataDSL::APIServer.start(
176
+ schema_dir: "schemas/",
177
+ auth: { type: :api_key, keys: ["key1", "key2"] }
178
+ )
179
+ ```
180
+
181
+ Clients must include:
182
+ ```
183
+ X-API-Key: key1
184
+ ```
185
+
186
+ ### Bearer Token
187
+
188
+ ```ruby
189
+ FakeDataDSL::APIServer.start(
190
+ schema_dir: "schemas/",
191
+ auth: { type: :bearer, tokens: ["token1", "token2"] }
192
+ )
193
+ ```
194
+
195
+ Clients must include:
196
+ ```
197
+ Authorization: Bearer token1
198
+ ```
199
+
200
+ ## Rate Limiting
201
+
202
+ ```ruby
203
+ FakeDataDSL::APIServer.start(
204
+ schema_dir: "schemas/",
205
+ rate_limit: 100 # 100 requests per minute per IP
206
+ )
207
+ ```
208
+
209
+ When rate limited, returns:
210
+ ```json
211
+ {
212
+ "error": "Rate limit exceeded",
213
+ "retry_after": 45
214
+ }
215
+ ```
216
+
217
+ ## Metrics
218
+
219
+ Enable metrics with `enable_metrics: true`:
220
+
221
+ ```bash
222
+ GET /metrics
223
+ ```
224
+
225
+ Response:
226
+ ```json
227
+ {
228
+ "total_requests": 1250,
229
+ "endpoints": [
230
+ {
231
+ "endpoint": "GET /api/user",
232
+ "requests": 500,
233
+ "errors": 2,
234
+ "avg_duration_ms": 15.5,
235
+ "p99_duration_ms": 45.2
236
+ }
237
+ ]
238
+ }
239
+ ```
240
+
241
+ ## Configuration
242
+
243
+ All configuration options:
244
+
245
+ | Option | Type | Default | Description |
246
+ |--------|------|---------|-------------|
247
+ | `port` | Integer | 3000 | Server port |
248
+ | `host` | String | "0.0.0.0" | Bind address |
249
+ | `environment` | Symbol | :development | :development or :production |
250
+ | `cors` | Boolean | true | Enable CORS |
251
+ | `rate_limit` | Integer | 0 | Requests/minute (0=unlimited) |
252
+ | `max_batch_size` | Integer | 10,000 | Max records per batch |
253
+ | `max_stream_size` | Integer | 1,000,000 | Max streaming records |
254
+ | `request_timeout` | Integer | 30 | Request timeout (seconds) |
255
+ | `enable_metrics` | Boolean | true | Enable /metrics endpoint |
256
+ | `enable_caching` | Boolean | false | Enable response caching |
257
+ | `cache_ttl` | Integer | 60 | Cache TTL (seconds) |
258
+ | `auth` | Hash | nil | Authentication config |
259
+
260
+ ## Docker Deployment
261
+
262
+ ```dockerfile
263
+ FROM ruby:3.2
264
+
265
+ WORKDIR /app
266
+ COPY Gemfile* ./
267
+ RUN bundle install
268
+ COPY schemas/ ./schemas/
269
+
270
+ EXPOSE 3000
271
+
272
+ CMD ["fake_data_dsl", "server", "schemas/", "--port", "3000", "--env", "production"]
273
+ ```
274
+
275
+ ```bash
276
+ docker build -t fake-data-api .
277
+ docker run -p 3000:3000 fake-data-api
278
+ ```
@@ -0,0 +1,315 @@
1
+ # Configuration File Guide
2
+
3
+ FakeDataDSL supports YAML configuration files following Rails conventions. This allows you to configure the gem without code changes and have environment-specific settings.
4
+
5
+ ## Quick Start
6
+
7
+ Create `config/fake_data_dsl.yml`:
8
+
9
+ ```yaml
10
+ default_mode: random
11
+ max_unique_retries: 1000
12
+
13
+ limits:
14
+ max_array_size: 100
15
+ max_recursion: 5
16
+ ```
17
+
18
+ The configuration is automatically loaded when FakeDataDSL initializes.
19
+
20
+ ## File Locations
21
+
22
+ FakeDataDSL searches for configuration files in this order:
23
+
24
+ 1. `config/fake_data_dsl.yml` (Rails convention)
25
+ 2. `fake_data_dsl.yml` (project root)
26
+ 3. `.fake_data_dsl.yml` (hidden file)
27
+
28
+ The first file found is used.
29
+
30
+ ## Configuration Options
31
+
32
+ ### Core Settings
33
+
34
+ ```yaml
35
+ # Default generation mode
36
+ # Options: random, edge, invalid, hostile, mixed
37
+ default_mode: random
38
+
39
+ # Maximum retries for unique value generation
40
+ max_unique_retries: 1000
41
+
42
+ # Allow eval() in custom expressions (security risk!)
43
+ allow_eval: false
44
+
45
+ # Use FastEngine for batch generation (not thread-safe)
46
+ fast_mode: false
47
+ ```
48
+
49
+ ### Field Handling
50
+
51
+ ```yaml
52
+ # Probability that optional fields appear (0.0 - 1.0)
53
+ optional_field_presence_rate: 0.8
54
+
55
+ # Probability that nullable fields are null (0.0 - 1.0)
56
+ nullable_field_null_rate: 0.1
57
+ ```
58
+
59
+ ### Resource Limits
60
+
61
+ ```yaml
62
+ limits:
63
+ # Maximum artificial latency in milliseconds
64
+ max_latency_ms: 10000
65
+
66
+ # Maximum recursion depth for nested schemas
67
+ max_recursion: 10
68
+
69
+ # Maximum array size
70
+ max_array_size: 1000
71
+
72
+ # Maximum text length
73
+ max_text_length: 10000
74
+ ```
75
+
76
+ ## Environment-Specific Configuration
77
+
78
+ Override settings per environment:
79
+
80
+ ```yaml
81
+ # Base configuration (applies to all environments)
82
+ default_mode: random
83
+ max_unique_retries: 1000
84
+
85
+ limits:
86
+ max_array_size: 100
87
+
88
+ # Test environment overrides
89
+ test:
90
+ default_mode: edge # Use edge cases in tests
91
+ max_unique_retries: 100 # Faster test failures
92
+ limits:
93
+ max_array_size: 10 # Smaller arrays in tests
94
+
95
+ # Development environment
96
+ development:
97
+ default_mode: random
98
+
99
+ # Production environment
100
+ production:
101
+ fast_mode: true
102
+ limits:
103
+ max_array_size: 1000
104
+ ```
105
+
106
+ ### Environment Detection
107
+
108
+ FakeDataDSL detects the environment from these variables (in order):
109
+
110
+ 1. `RAILS_ENV`
111
+ 2. `RACK_ENV`
112
+ 3. `FAKE_DATA_DSL_ENV`
113
+ 4. Default: `"development"`
114
+
115
+ ## Manual Configuration
116
+
117
+ ### Load from Custom Path
118
+
119
+ ```ruby
120
+ # Load specific file
121
+ FakeDataDSL::ConfigFile.load_and_apply("custom/path/config.yml")
122
+
123
+ # Load with specific environment
124
+ FakeDataDSL::ConfigFile.load_and_apply("config.yml", env: "staging")
125
+ ```
126
+
127
+ ### Load Without Applying
128
+
129
+ ```ruby
130
+ # Just load the config hash
131
+ config = FakeDataDSL::ConfigFile.load("config.yml", env: "test")
132
+ puts config["default_mode"] # => "edge"
133
+
134
+ # Apply later
135
+ FakeDataDSL::ConfigFile.apply(config)
136
+ ```
137
+
138
+ ### Check Config File Location
139
+
140
+ ```ruby
141
+ path = FakeDataDSL::ConfigFile.find_config_file
142
+ puts "Using config: #{path || 'none found'}"
143
+ ```
144
+
145
+ ## Complete Example
146
+
147
+ ```yaml
148
+ # config/fake_data_dsl.yml
149
+
150
+ # =========================================
151
+ # Base Configuration (all environments)
152
+ # =========================================
153
+
154
+ # Generation settings
155
+ default_mode: random
156
+ max_unique_retries: 1000
157
+
158
+ # Field behavior
159
+ optional_field_presence_rate: 0.8
160
+ nullable_field_null_rate: 0.1
161
+
162
+ # Resource limits
163
+ limits:
164
+ max_latency_ms: 10000
165
+ max_recursion: 10
166
+ max_array_size: 100
167
+ max_text_length: 10000
168
+
169
+ # =========================================
170
+ # Test Environment
171
+ # =========================================
172
+ test:
173
+ # Deterministic for reproducible tests
174
+ default_mode: random
175
+
176
+ # Fail fast on uniqueness issues
177
+ max_unique_retries: 50
178
+
179
+ # Smaller data for faster tests
180
+ limits:
181
+ max_array_size: 5
182
+ max_text_length: 100
183
+
184
+ # =========================================
185
+ # Development Environment
186
+ # =========================================
187
+ development:
188
+ # More realistic data
189
+ default_mode: random
190
+
191
+ # Allow more retries during development
192
+ max_unique_retries: 2000
193
+
194
+ # =========================================
195
+ # CI Environment
196
+ # =========================================
197
+ ci:
198
+ # Test edge cases in CI
199
+ default_mode: mixed
200
+
201
+ # Strict limits
202
+ limits:
203
+ max_recursion: 5
204
+ max_array_size: 50
205
+
206
+ # =========================================
207
+ # Production Environment
208
+ # =========================================
209
+ production:
210
+ # Maximum performance
211
+ fast_mode: true
212
+
213
+ # Higher limits for bulk operations
214
+ limits:
215
+ max_array_size: 10000
216
+ ```
217
+
218
+ ## Programmatic Configuration
219
+
220
+ You can still configure FakeDataDSL programmatically, which takes precedence over file config:
221
+
222
+ ```ruby
223
+ # File config is loaded first, then this overrides
224
+ FakeDataDSL.configure do |config|
225
+ config.default_mode = :edge
226
+ config.limits.max_array_size = 50
227
+ end
228
+ ```
229
+
230
+ ## Disabling Auto-Loading
231
+
232
+ To prevent automatic config file loading:
233
+
234
+ ```ruby
235
+ # Set before requiring the gem
236
+ ENV['FAKE_DATA_DSL_SKIP_CONFIG'] = 'true'
237
+ require 'fake_data_dsl'
238
+ ```
239
+
240
+ Or remove/rename the config file.
241
+
242
+ ## Best Practices
243
+
244
+ ### 1. Version Control Your Config
245
+
246
+ ```bash
247
+ git add config/fake_data_dsl.yml
248
+ git commit -m "Add FakeDataDSL configuration"
249
+ ```
250
+
251
+ ### 2. Document Environment Differences
252
+
253
+ ```yaml
254
+ # Test: Fast, small datasets, edge cases
255
+ test:
256
+ max_unique_retries: 50 # Fail fast
257
+ limits:
258
+ max_array_size: 5 # Faster tests
259
+ ```
260
+
261
+ ### 3. Use Sensible Defaults
262
+
263
+ Don't over-configure. The defaults are designed for common use cases.
264
+
265
+ ### 4. Keep Secrets Out
266
+
267
+ Config files shouldn't contain secrets. Use environment variables if needed:
268
+
269
+ ```ruby
270
+ # In code, not in config file
271
+ FakeDataDSL.configure do |config|
272
+ config.api_key = ENV['FAKE_DATA_API_KEY']
273
+ end
274
+ ```
275
+
276
+ ## Troubleshooting
277
+
278
+ ### Config Not Loading
279
+
280
+ ```ruby
281
+ # Check if config file was found
282
+ puts FakeDataDSL::ConfigFile.find_config_file
283
+ # => nil means no config file found
284
+
285
+ # Check current configuration
286
+ puts FakeDataDSL.configuration.default_mode
287
+ ```
288
+
289
+ ### Wrong Environment
290
+
291
+ ```ruby
292
+ # Check detected environment
293
+ puts ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
294
+
295
+ # Force specific environment
296
+ FakeDataDSL::ConfigFile.load_and_apply(env: "production")
297
+ ```
298
+
299
+ ### Invalid YAML
300
+
301
+ ```yaml
302
+ # Bad: Tabs instead of spaces
303
+ limits:
304
+ max_array_size: 100 # Tab character causes error
305
+
306
+ # Good: Use spaces
307
+ limits:
308
+ max_array_size: 100 # Spaces work
309
+ ```
310
+
311
+ ## See Also
312
+
313
+ - [Quick Start Guide](../tech_docs/quick_start.md)
314
+ - [Configuration API](../tech_docs/api/overview.md)
315
+ - [Resource Limits](../tech_docs/performance/resource_limits.md)