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,252 @@
1
+ # OpenAPI Export
2
+
3
+ Export your FakeDataDSL schemas to **OpenAPI 3.0 specifications** for API documentation and client generation.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Export as YAML
9
+ fake_data_dsl export --all -d schemas/ -f openapi -o api.yaml
10
+
11
+ # Export as JSON
12
+ fake_data_dsl export --all -d schemas/ -f openapi -o api.json
13
+ ```
14
+
15
+ ## Generated Specification
16
+
17
+ The exporter generates a complete OpenAPI 3.0 spec with:
18
+
19
+ - **Info section** - API title, version, description
20
+ - **Server definitions** - Base URLs
21
+ - **Tags** - One per schema for organization
22
+ - **Paths** - CRUD + generation endpoints
23
+ - **Components/Schemas** - Full schema definitions
24
+ - **Parameters** - Reusable query parameters
25
+
26
+ ## API Endpoints Generated
27
+
28
+ For each schema (e.g., `User`):
29
+
30
+ | Method | Path | Description |
31
+ |--------|------|-------------|
32
+ | GET | `/api/user` | Generate single record |
33
+ | GET | `/api/user/batch` | Generate multiple records |
34
+ | GET | `/api/user/stream` | Stream records (NDJSON) |
35
+ | POST | `/api/user` | Generate with overrides |
36
+ | GET | `/api/user/schema` | Get schema definition |
37
+
38
+ Plus:
39
+ - `GET /api/schemas` - List all schemas
40
+
41
+ ## Ruby API
42
+
43
+ ### Basic Export
44
+
45
+ ```ruby
46
+ exporter = FakeDataDSL::Export::OpenAPI.new(registry)
47
+ yaml_spec = exporter.export
48
+ ```
49
+
50
+ ### Custom Options
51
+
52
+ ```ruby
53
+ exporter = FakeDataDSL::Export::OpenAPI.new(
54
+ registry,
55
+ title: "My Data Generation API",
56
+ version: "2.0.0",
57
+ description: "API for generating test data",
58
+ server_url: "https://api.example.com",
59
+ format: :yaml
60
+ )
61
+
62
+ spec = exporter.export
63
+ ```
64
+
65
+ ### Export Formats
66
+
67
+ ```ruby
68
+ # YAML (default)
69
+ yaml = exporter.export_as(:yaml)
70
+
71
+ # JSON
72
+ json = exporter.export_as(:json)
73
+ ```
74
+
75
+ ## Configuration Options
76
+
77
+ | Option | Type | Default | Description |
78
+ |--------|------|---------|-------------|
79
+ | `title` | String | "FakeDataDSL Data Generation API" | API title |
80
+ | `version` | String | "1.0.0" | API version |
81
+ | `description` | String | "API for generating fake data" | API description |
82
+ | `server_url` | String | "http://localhost:3000" | Base server URL |
83
+ | `format` | Symbol | :yaml | Output format (:yaml or :json) |
84
+
85
+ ## Type Mapping
86
+
87
+ | FakeDataDSL | OpenAPI |
88
+ |-------------|---------|
89
+ | `text`, `name`, etc. | `string` |
90
+ | `email` | `string`, format: "email" |
91
+ | `url` | `string`, format: "uri" |
92
+ | `uuid` | `string`, format: "uuid" |
93
+ | `date` | `string`, format: "date" |
94
+ | `timestamp`, `datetime` | `string`, format: "date-time" |
95
+ | `password` | `string`, format: "password" |
96
+ | `ip` | `string`, format: "ipv4" |
97
+ | `ipv6` | `string`, format: "ipv6" |
98
+ | `number`, `integer` | `integer`, format: "int64" |
99
+ | `float` | `number`, format: "double" |
100
+ | `boolean` | `boolean` |
101
+ | `binary` | `string`, format: "binary" |
102
+ | `array(T)` | `array`, items: T |
103
+ | `enum(a, b)` | `string`, enum: ["a", "b"] |
104
+
105
+ ## Example Output
106
+
107
+ ```yaml
108
+ openapi: "3.0.3"
109
+ info:
110
+ title: FakeDataDSL Data Generation API
111
+ version: "1.0.0"
112
+ description: API for generating fake data from schemas
113
+ contact:
114
+ name: FakeDataDSL
115
+ url: https://github.com/talaatmagdyx/fake_data_dsl
116
+
117
+ servers:
118
+ - url: http://localhost:3000
119
+ description: Data Generation Server
120
+
121
+ tags:
122
+ - name: User
123
+ description: Operations for User schema
124
+
125
+ paths:
126
+ /api/schemas:
127
+ get:
128
+ tags: [Schemas]
129
+ summary: List all available schemas
130
+ responses:
131
+ "200":
132
+ description: List of schema names
133
+ content:
134
+ application/json:
135
+ schema:
136
+ type: object
137
+ properties:
138
+ schemas:
139
+ type: array
140
+ items:
141
+ type: string
142
+
143
+ /api/user:
144
+ get:
145
+ tags: [User]
146
+ summary: Generate a single User
147
+ parameters:
148
+ - name: seed
149
+ in: query
150
+ description: Random seed for deterministic generation
151
+ schema:
152
+ type: integer
153
+ - name: mode
154
+ in: query
155
+ description: Generation mode
156
+ schema:
157
+ type: string
158
+ enum: [random, edge, invalid, hostile, mixed]
159
+ responses:
160
+ "200":
161
+ description: Generated User
162
+ content:
163
+ application/json:
164
+ schema:
165
+ $ref: "#/components/schemas/User"
166
+
167
+ components:
168
+ schemas:
169
+ User:
170
+ type: object
171
+ required: [id, name, email]
172
+ properties:
173
+ id:
174
+ type: string
175
+ format: uuid
176
+ name:
177
+ type: string
178
+ email:
179
+ type: string
180
+ format: email
181
+ age:
182
+ type: integer
183
+ format: int64
184
+ active:
185
+ type: boolean
186
+ role:
187
+ type: string
188
+ enum: [admin, user, moderator]
189
+
190
+ GenerationRequest:
191
+ type: object
192
+ properties:
193
+ count:
194
+ type: integer
195
+ default: 10
196
+ seed:
197
+ type: integer
198
+ mode:
199
+ type: string
200
+ enum: [random, edge, invalid, hostile, mixed]
201
+ overrides:
202
+ type: object
203
+ additionalProperties: true
204
+ ```
205
+
206
+ ## Using Generated Spec
207
+
208
+ ### Swagger UI
209
+
210
+ ```bash
211
+ # Serve with Swagger UI
212
+ docker run -p 8080:8080 \
213
+ -e SWAGGER_JSON=/api.yaml \
214
+ -v ./api.yaml:/api.yaml \
215
+ swaggerapi/swagger-ui
216
+ ```
217
+
218
+ ### Client Generation
219
+
220
+ ```bash
221
+ # Generate TypeScript client
222
+ openapi-generator generate -i api.yaml -g typescript-axios -o ./client
223
+
224
+ # Generate Python client
225
+ openapi-generator generate -i api.yaml -g python -o ./client
226
+
227
+ # Generate Go client
228
+ openapi-generator generate -i api.yaml -g go -o ./client
229
+ ```
230
+
231
+ ### API Testing
232
+
233
+ ```bash
234
+ # Import into Postman
235
+ # 1. Open Postman
236
+ # 2. Import > File > api.yaml
237
+ # 3. All endpoints are ready to test
238
+ ```
239
+
240
+ ## Integration with API Server
241
+
242
+ The OpenAPI export matches the API Server exactly:
243
+
244
+ ```bash
245
+ # Start server
246
+ fake_data_dsl server schemas/ --port 3000
247
+
248
+ # Export matching spec
249
+ fake_data_dsl export --all -d schemas/ -f openapi -o api.yaml
250
+ ```
251
+
252
+ The generated spec documents exactly what the server provides.
@@ -0,0 +1,228 @@
1
+ # Performance Mode
2
+
3
+ Generate **millions of records** with parallel processing, streaming, and optimized memory usage.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Generate 1 million records to file
9
+ fake_data_dsl perf User -d schemas/ -c 1000000 -o users.ndjson
10
+
11
+ # CSV format
12
+ fake_data_dsl perf User -d schemas/ -c 1000000 -f csv -o users.csv
13
+
14
+ # Benchmark mode
15
+ fake_data_dsl perf User -d schemas/ --benchmark
16
+ ```
17
+
18
+ ## CLI Options
19
+
20
+ | Option | Description | Default |
21
+ |--------|-------------|---------|
22
+ | `-d, --dir DIR` | Schema directory | "." |
23
+ | `-c, --count N` | Number of records | 100,000 |
24
+ | `-o, --output FILE` | Output file | stdout |
25
+ | `-f, --format FMT` | Format: ndjson, json, csv | ndjson |
26
+ | `-s, --seed N` | Random seed | random |
27
+ | `-m, --mode MODE` | Generation mode | random |
28
+ | `-b, --benchmark` | Run benchmark | false |
29
+
30
+ ## Ruby API
31
+
32
+ ### Basic Generation
33
+
34
+ ```ruby
35
+ # Generate records in parallel
36
+ records = FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000)
37
+ ```
38
+
39
+ ### With Progress Callback
40
+
41
+ ```ruby
42
+ FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000) do |progress|
43
+ puts "#{progress[:current]} / #{progress[:total]}"
44
+ puts "Rate: #{progress[:rate]} rec/s"
45
+ puts "ETA: #{progress[:eta]}s"
46
+ end
47
+ ```
48
+
49
+ Progress hash contains:
50
+ - `current` - Records generated so far
51
+ - `total` - Total records to generate
52
+ - `percent` - Completion percentage
53
+ - `rate` - Records per second
54
+ - `elapsed` - Elapsed time (seconds)
55
+ - `eta` - Estimated time remaining (seconds)
56
+
57
+ ### Streaming
58
+
59
+ Stream records without loading all into memory:
60
+
61
+ ```ruby
62
+ stream = FakeDataDSL::PerformanceMode.stream(schema, count: 10_000_000)
63
+
64
+ stream.each do |record|
65
+ # Process one record at a time
66
+ process(record)
67
+ end
68
+ ```
69
+
70
+ ### File Output
71
+
72
+ Write directly to file with streaming:
73
+
74
+ ```ruby
75
+ result = FakeDataDSL::PerformanceMode.to_file(
76
+ schema,
77
+ count: 10_000_000,
78
+ output: "users.ndjson",
79
+ format: :ndjson,
80
+ seed: 42,
81
+ mode: :random
82
+ ) do |progress|
83
+ puts "#{progress[:percent]}% - #{progress[:rate]} rec/s - ETA: #{progress[:eta]}s"
84
+ end
85
+
86
+ puts "Generated #{result[:records]} in #{result[:elapsed]}s"
87
+ puts "Rate: #{result[:rate]} records/second"
88
+ ```
89
+
90
+ Supported formats:
91
+ - `:ndjson` - Newline-delimited JSON (default, best for streaming)
92
+ - `:json` - JSON array
93
+ - `:csv` - CSV with headers
94
+
95
+ ### Benchmarking
96
+
97
+ ```ruby
98
+ results = FakeDataDSL::PerformanceMode.benchmark(
99
+ schema,
100
+ counts: [1_000, 10_000, 100_000, 1_000_000]
101
+ )
102
+
103
+ results.each do |count, metrics|
104
+ puts "#{count} records:"
105
+ puts " Time: #{metrics[:elapsed]}s"
106
+ puts " Rate: #{metrics[:rate]} rec/s"
107
+ puts " Memory: #{metrics[:memory_mb]} MB"
108
+ end
109
+ ```
110
+
111
+ ### System Info
112
+
113
+ Check system capabilities:
114
+
115
+ ```ruby
116
+ info = FakeDataDSL::PerformanceMode.system_info
117
+
118
+ puts "CPU cores: #{info[:cpu_cores]}"
119
+ puts "Optimal threads: #{info[:optimal_threads]}"
120
+ puts "Native engine: #{info[:native_available]}"
121
+ puts "Recommended batch: #{info[:recommended_batch_size]}"
122
+ ```
123
+
124
+ ## Configuration
125
+
126
+ Customize generation behavior:
127
+
128
+ ```ruby
129
+ records = FakeDataDSL::PerformanceMode.generate(
130
+ schema,
131
+ count: 1_000_000,
132
+ batch_size: 10_000, # Records per batch
133
+ threads: 4, # Parallel threads (nil = auto)
134
+ memory_limit_mb: 512, # Max memory per batch
135
+ use_native: true, # Use Rust engine if available
136
+ progress_interval: 100_000, # Report every N records
137
+ gc_interval: 500_000, # Force GC every N records
138
+ seed: 42, # Random seed
139
+ mode: :random # Generation mode
140
+ )
141
+ ```
142
+
143
+ ## Performance Tips
144
+
145
+ ### 1. Use NDJSON for Large Datasets
146
+
147
+ NDJSON streams records one at a time, minimizing memory:
148
+
149
+ ```ruby
150
+ FakeDataDSL::PerformanceMode.to_file(schema, count: 10_000_000, format: :ndjson, ...)
151
+ ```
152
+
153
+ ### 2. Tune Batch Size
154
+
155
+ Larger batches = faster, but more memory:
156
+
157
+ ```ruby
158
+ # For machines with lots of RAM
159
+ FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000, batch_size: 50_000)
160
+
161
+ # For limited memory
162
+ FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000, batch_size: 1_000)
163
+ ```
164
+
165
+ ### 3. Enable Native Engine
166
+
167
+ The Rust native engine provides 3-4x performance:
168
+
169
+ ```ruby
170
+ # Check if available
171
+ FakeDataDSL::PerformanceMode.system_info[:native_available]
172
+
173
+ # Force native engine
174
+ FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000, use_native: true)
175
+ ```
176
+
177
+ ### 4. Adjust Thread Count
178
+
179
+ ```ruby
180
+ # Use all CPU cores
181
+ FakeDataDSL::PerformanceMode.generate(
182
+ schema,
183
+ count: 1_000_000,
184
+ threads: Etc.nprocessors
185
+ )
186
+
187
+ # Leave one core for other work
188
+ FakeDataDSL::PerformanceMode.generate(
189
+ schema,
190
+ count: 1_000_000,
191
+ threads: Etc.nprocessors - 1
192
+ )
193
+ ```
194
+
195
+ ### 5. Disable Observability for Speed
196
+
197
+ ```ruby
198
+ FakeDataDSL.configure do |config|
199
+ config.metrics_collector = nil
200
+ config.logger = nil
201
+ config.on_field_generated = nil
202
+ end
203
+ ```
204
+
205
+ ## Benchmarks
206
+
207
+ Typical performance on modern hardware:
208
+
209
+ | Records | NDJSON | JSON | CSV |
210
+ |---------|--------|------|-----|
211
+ | 10K | 0.2s | 0.3s | 0.2s |
212
+ | 100K | 1.5s | 2.0s | 1.8s |
213
+ | 1M | 12s | 18s | 15s |
214
+ | 10M | 120s | 180s | 150s |
215
+
216
+ *Results vary based on schema complexity and hardware.*
217
+
218
+ ## Memory Usage
219
+
220
+ Approximate memory requirements:
221
+
222
+ | Records | Stream Mode | Batch Mode |
223
+ |---------|-------------|------------|
224
+ | 100K | ~50 MB | ~100 MB |
225
+ | 1M | ~50 MB | ~1 GB |
226
+ | 10M | ~50 MB | ~10 GB |
227
+
228
+ Stream mode maintains constant memory regardless of total count.