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,399 @@
1
+ # Schema Definition
2
+
3
+ Complete guide to defining schemas in FakeDataDSL.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Basic Syntax](#basic-syntax)
8
+ - [Schema Names](#schema-names)
9
+ - [Field Definitions](#field-definitions)
10
+ - [Multiple Schemas](#multiple-schemas)
11
+ - [Comments](#comments)
12
+ - [Indentation](#indentation)
13
+ - [Best Practices](#best-practices)
14
+
15
+ ---
16
+
17
+ ## Basic Syntax
18
+
19
+ ### Minimal Schema
20
+
21
+ ```dsl
22
+ User:
23
+ id: uuid
24
+ ```
25
+
26
+ ### Complete Example
27
+
28
+ ```dsl
29
+ # User schema with all common features
30
+ User:
31
+ # Required fields
32
+ id: uuid(unique: true)
33
+ email: email(unique: true)
34
+ name: name
35
+
36
+ # Field with range
37
+ age: number(18..100)
38
+
39
+ # Boolean with probability
40
+ active: boolean(true:90%)
41
+
42
+ # Enum with weights
43
+ role: enum(user:80%, admin:5%, moderator:15%)
44
+
45
+ # Optional field (may not appear)
46
+ phone?: phone
47
+
48
+ # Nullable field (may be null)
49
+ bio: text?
50
+
51
+ # Optional and nullable
52
+ avatar?: url?
53
+
54
+ # Nested object
55
+ address: Address
56
+
57
+ # Date field
58
+ created_at: past_date(2y)
59
+
60
+ # Schema-level behavior
61
+ @latency 10..50ms
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Schema Names
67
+
68
+ ### Naming Rules
69
+
70
+ - Must start with uppercase letter
71
+ - Can contain letters, numbers, underscores
72
+ - Must end with colon (`:`)
73
+ - Must be unique within a file
74
+
75
+ ### Valid Names
76
+
77
+ ```dsl
78
+ User:
79
+ UserProfile:
80
+ User_V2:
81
+ OrderLineItem:
82
+ API_Response:
83
+ ```
84
+
85
+ ### Invalid Names
86
+
87
+ ```dsl
88
+ user: # Must start with uppercase
89
+ 123User: # Cannot start with number
90
+ user-profile: # Hyphens not allowed
91
+ ```
92
+
93
+ ---
94
+
95
+ ## Field Definitions
96
+
97
+ ### Basic Field
98
+
99
+ ```dsl
100
+ SchemaName:
101
+ field_name: type
102
+ ```
103
+
104
+ ### Field with Arguments
105
+
106
+ ```dsl
107
+ SchemaName:
108
+ # Positional arguments
109
+ age: number(18..65)
110
+
111
+ # Named arguments
112
+ id: uuid(unique: true, version: 7)
113
+
114
+ # Mixed arguments
115
+ price: number(0..1000, precision: 2)
116
+ ```
117
+
118
+ ### Optional Fields
119
+
120
+ Optional fields may not appear in the output:
121
+
122
+ ```dsl
123
+ User:
124
+ name: name # Always present
125
+ phone?: phone # May not appear (50% probability)
126
+ ```
127
+
128
+ ### Nullable Fields
129
+
130
+ Nullable fields may have a `null` value:
131
+
132
+ ```dsl
133
+ User:
134
+ name: name # Never null
135
+ nickname: text? # May be null (50% probability)
136
+ ```
137
+
138
+ ### Optional AND Nullable
139
+
140
+ ```dsl
141
+ User:
142
+ # May not appear, AND if present may be null
143
+ emergency_contact?: phone?
144
+ ```
145
+
146
+ ### Conditional Fields
147
+
148
+ Fields that appear based on conditions:
149
+
150
+ ```dsl
151
+ Order:
152
+ status: enum(pending, shipped, delivered)
153
+
154
+ # Only present when status is truthy
155
+ tracking_number: text(20) if status
156
+ ```
157
+
158
+ **Note:** Currently only truthiness checks are supported, not comparisons.
159
+
160
+ ### Field with Behaviors
161
+
162
+ ```dsl
163
+ User:
164
+ profile_image: url @partial_data 30%
165
+ settings: object @latency 50..100ms
166
+ ```
167
+
168
+ ---
169
+
170
+ ## Multiple Schemas
171
+
172
+ ### In Same File
173
+
174
+ ```dsl
175
+ User:
176
+ id: uuid
177
+ name: name
178
+ email: email
179
+
180
+ Address:
181
+ street: text(10..100)
182
+ city: name
183
+ country: country_code
184
+ postal_code: postal_code
185
+
186
+ Order:
187
+ id: uuid
188
+ user: User # Embed User
189
+ shipping: Address # Embed Address
190
+ ```
191
+
192
+ ### Schema References
193
+
194
+ ```dsl
195
+ # Reference another schema as a type
196
+ User:
197
+ id: uuid
198
+ address: Address # Embeds full Address schema
199
+
200
+ # Reference specific field from another schema
201
+ Order:
202
+ user_id: Ref(User.id) # Just the ID, not full User
203
+ ```
204
+
205
+ ---
206
+
207
+ ## Comments
208
+
209
+ ### Single-Line Comments
210
+
211
+ ```dsl
212
+ # This is a comment
213
+ User:
214
+ id: uuid # Inline comment
215
+ name: name # Another comment
216
+ ```
217
+
218
+ ### Documentation Comments
219
+
220
+ ```dsl
221
+ # =================================
222
+ # User Schema
223
+ # =================================
224
+ # Represents a user in the system.
225
+ # Generated for testing purposes.
226
+ #
227
+ # Fields:
228
+ # - id: Unique identifier
229
+ # - name: Full name
230
+ # - email: Contact email
231
+ # =================================
232
+
233
+ User:
234
+ id: uuid
235
+ name: name
236
+ email: email
237
+ ```
238
+
239
+ ---
240
+
241
+ ## Indentation
242
+
243
+ ### Spaces (Recommended)
244
+
245
+ Use 2 spaces for indentation:
246
+
247
+ ```dsl
248
+ User:
249
+ id: uuid
250
+ name: name
251
+ address:
252
+ street: text
253
+ city: name
254
+ ```
255
+
256
+ ### Tabs
257
+
258
+ Tabs are supported:
259
+
260
+ ```dsl
261
+ User:
262
+ id: uuid
263
+ name: name
264
+ ```
265
+
266
+ ### Rules
267
+
268
+ 1. **Don't mix tabs and spaces** - Causes parsing error
269
+ 2. **Be consistent** - Use same indentation throughout
270
+ 3. **Schema at column 0** - Schema names must start at beginning
271
+ 4. **Fields indented** - Fields must be indented under schema
272
+
273
+ ### Error Examples
274
+
275
+ ```dsl
276
+ # ERROR: Mixed tabs and spaces
277
+ User:
278
+ id: uuid # 2 spaces
279
+ name: name # tab
280
+ ```
281
+
282
+ ```dsl
283
+ # ERROR: Inconsistent indentation
284
+ User:
285
+ id: uuid # 2 spaces
286
+ name: name # 4 spaces
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Best Practices
292
+
293
+ ### 1. Use Descriptive Names
294
+
295
+ ```dsl
296
+ # Good
297
+ UserProfile:
298
+ full_name: name
299
+ email_address: email
300
+ date_of_birth: past_date(100y)
301
+
302
+ # Avoid
303
+ UP:
304
+ n: name
305
+ e: email
306
+ d: date
307
+ ```
308
+
309
+ ### 2. Group Related Fields
310
+
311
+ ```dsl
312
+ User:
313
+ # Identity
314
+ id: uuid
315
+ username: text(3..20)
316
+
317
+ # Personal info
318
+ first_name: name
319
+ last_name: name
320
+
321
+ # Contact
322
+ email: email
323
+ phone?: phone
324
+
325
+ # Metadata
326
+ created_at: past_date(2y)
327
+ updated_at: past_date(30d)
328
+ ```
329
+
330
+ ### 3. Use Comments
331
+
332
+ ```dsl
333
+ # E-commerce Order
334
+ #
335
+ # Represents a customer order with line items.
336
+ # Used for testing order processing workflow.
337
+ Order:
338
+ id: uuid(unique: true)
339
+
340
+ # Customer reference
341
+ customer_id: Ref(Customer.id)
342
+
343
+ # Order details
344
+ items: array(LineItem, 1..10)
345
+ total: custom(:calculate_total)
346
+
347
+ # Status tracking
348
+ status: enum(pending, processing, shipped, delivered)
349
+ tracking_number: text(20) if status # Only when shipped
350
+ ```
351
+
352
+ ### 4. Separate Schemas by Domain
353
+
354
+ ```
355
+ schemas/
356
+ ├── users/
357
+ │ ├── user.dsl
358
+ │ ├── profile.dsl
359
+ │ └── preferences.dsl
360
+ ├── orders/
361
+ │ ├── order.dsl
362
+ │ ├── line_item.dsl
363
+ │ └── shipping.dsl
364
+ └── products/
365
+ ├── product.dsl
366
+ └── category.dsl
367
+ ```
368
+
369
+ ### 5. Use Unique Constraints
370
+
371
+ ```dsl
372
+ User:
373
+ id: uuid(unique: true)
374
+ email: email(unique: true)
375
+ username: text(3..20, unique: true)
376
+ ```
377
+
378
+ ### 6. Set Realistic Ranges
379
+
380
+ ```dsl
381
+ # Good - realistic ranges
382
+ User:
383
+ age: number(18..100)
384
+ salary: number(30000..500000)
385
+
386
+ # Avoid - unrealistic ranges
387
+ User:
388
+ age: number(0..1000)
389
+ salary: number(0..999999999)
390
+ ```
391
+
392
+ ---
393
+
394
+ ## Next Steps
395
+
396
+ - [Core Types](core_types.md) - All built-in types
397
+ - [Field Modifiers](field_modifiers.md) - Optional, nullable, conditional
398
+ - [Complex Types](complex_types.md) - Arrays, objects, references
399
+
@@ -0,0 +1,276 @@
1
+ # FakeDataDSL Export Guide
2
+
3
+ FakeDataDSL provides comprehensive export capabilities for both schema structure and generated data.
4
+
5
+ ## Export Categories
6
+
7
+ ### Schema Exports (Types/Structure)
8
+ Export your schema definitions to different type systems:
9
+
10
+ | Format | Extension | Description |
11
+ |--------|-----------|-------------|
12
+ | `json-schema` | `.schema.json` | JSON Schema (draft 2020-12) |
13
+ | `typescript` / `ts` | `.ts` | TypeScript interfaces |
14
+ | `javascript` / `js` | `.js` | JavaScript with JSDoc types |
15
+ | `python` / `py` / `pydantic` | `.py` | Python Pydantic models |
16
+ | `dataclass` | `.py` | Python dataclasses |
17
+ | `sql` / `sql-ddl` | `.sql` | SQL CREATE TABLE statements |
18
+ | `graphviz` / `dot` | `.dot` | GraphViz diagram |
19
+
20
+ ### Data Exports (Generated Records)
21
+ Export generated fake data in various formats:
22
+
23
+ | Format | Extension | Description |
24
+ |--------|-----------|-------------|
25
+ | `json` / `json-data` | `.json` | JSON array of records |
26
+ | `csv` | `.csv` | CSV with headers |
27
+ | `sql-insert` / `insert` | `.sql` | SQL INSERT statements |
28
+ | `yaml` / `yml` | `.yaml` | YAML format |
29
+ | `xml` | `.xml` | XML format |
30
+
31
+ ## Ruby API
32
+
33
+ ### Schema Exports
34
+
35
+ ```ruby
36
+ require "fake_data_dsl"
37
+
38
+ # Load schemas
39
+ registry = FakeDataDSL::Registry.new
40
+ registry.load_dir("schemas/")
41
+ schema = registry.schema("User")
42
+
43
+ # JSON Schema
44
+ json_schema = FakeDataDSL.to_json_schema(schema, registry: registry)
45
+
46
+ # TypeScript
47
+ typescript = FakeDataDSL.to_typescript(schema, registry: registry)
48
+ typescript_all = FakeDataDSL.to_typescript_all(registry) # All schemas
49
+
50
+ # JavaScript with JSDoc
51
+ javascript = FakeDataDSL.to_javascript(schema, registry: registry)
52
+ javascript_all = FakeDataDSL.to_javascript_all(registry)
53
+
54
+ # Python (Pydantic, dataclass, TypedDict)
55
+ pydantic = FakeDataDSL.to_python(schema, style: :pydantic)
56
+ dataclass = FakeDataDSL.to_python(schema, style: :dataclass)
57
+ typed_dict = FakeDataDSL.to_python(schema, style: :typed_dict)
58
+ python_all = FakeDataDSL.to_python_all(registry, style: :pydantic)
59
+
60
+ # SQL CREATE TABLE
61
+ sql_pg = FakeDataDSL.to_sql(schema, dialect: :postgresql)
62
+ sql_mysql = FakeDataDSL.to_sql(schema, dialect: :mysql)
63
+ sql_sqlite = FakeDataDSL.to_sql(schema, dialect: :sqlite)
64
+ sql_all = FakeDataDSL.to_sql_all(registry, dialect: :postgresql)
65
+
66
+ # GraphViz DOT
67
+ dot = FakeDataDSL.to_graphviz(registry: registry)
68
+ ```
69
+
70
+ ### Data Exports
71
+
72
+ ```ruby
73
+ # CSV (headers + data)
74
+ csv = FakeDataDSL.to_csv(schema, count: 100, seed: 12345)
75
+
76
+ # JSON data
77
+ json = FakeDataDSL.to_json(schema, count: 100, pretty: true)
78
+ json_envelope = FakeDataDSL.to_json(schema, count: 50, envelope: "users")
79
+
80
+ # SQL INSERT statements
81
+ sql_insert = FakeDataDSL.to_sql_insert(schema, count: 100, dialect: :postgresql)
82
+ sql_batch = FakeDataDSL.to_sql_insert(schema, count: 1000, dialect: :mysql, batch_insert: true)
83
+
84
+ # YAML
85
+ yaml = FakeDataDSL.to_yaml(schema, count: 20, root_key: "users")
86
+
87
+ # XML
88
+ xml = FakeDataDSL.to_xml(schema, count: 10, root: "users", item: "user")
89
+ ```
90
+
91
+ ### Generic Export
92
+
93
+ ```ruby
94
+ # Use format name string
95
+ output = FakeDataDSL.export(:typescript, schema)
96
+ output = FakeDataDSL.export("json-schema", schema, registry: registry)
97
+ output = FakeDataDSL.export("sql-insert", schema, count: 100, dialect: :mysql)
98
+
99
+ # List available formats
100
+ FakeDataDSL.export_formats # All formats
101
+ FakeDataDSL.schema_export_formats # Schema formats only
102
+ FakeDataDSL.data_export_formats # Data formats only
103
+ ```
104
+
105
+ ### Auto-File Export
106
+
107
+ ```ruby
108
+ # Export to auto-generated filename
109
+ path = FakeDataDSL.export_to_file(:typescript, schema, output_dir: "./types")
110
+ # => "./types/user.ts"
111
+
112
+ path = FakeDataDSL.export_to_file(:python, schema, output_dir: "./models")
113
+ # => "./models/user.py"
114
+
115
+ path = FakeDataDSL.export_to_file(:csv, schema, output_dir: "./data", count: 100)
116
+ # => "./data/user.csv"
117
+
118
+ # Get filename for format
119
+ FakeDataDSL.export_filename("User", :typescript) # => "user.ts"
120
+ FakeDataDSL.export_filename("User", :python) # => "user.py"
121
+ FakeDataDSL.export_filename("User", :csv) # => "user.csv"
122
+ ```
123
+
124
+ ## CLI Commands
125
+
126
+ ### Schema Exports
127
+
128
+ ```bash
129
+ # JSON Schema
130
+ fake_data_dsl export User -d schemas -f json-schema -o user.schema.json
131
+
132
+ # TypeScript
133
+ fake_data_dsl export User -d schemas -f typescript -o user.ts
134
+ fake_data_dsl export --all -d schemas -f typescript -o types.ts
135
+
136
+ # JavaScript with JSDoc
137
+ fake_data_dsl export User -d schemas -f javascript -o user.js
138
+ fake_data_dsl export --all -d schemas -f javascript -o types.js
139
+
140
+ # Python (Pydantic, dataclass, TypedDict)
141
+ fake_data_dsl export User -d schemas -f python --style pydantic
142
+ fake_data_dsl export User -d schemas -f python --style dataclass -o models.py
143
+ fake_data_dsl export User -d schemas -f python --style typed_dict
144
+ fake_data_dsl export --all -d schemas -f python -o models.py
145
+
146
+ # SQL CREATE TABLE
147
+ fake_data_dsl export User -d schemas -f sql --dialect postgresql
148
+ fake_data_dsl export User -d schemas -f sql --dialect mysql -o user.sql
149
+ fake_data_dsl export --all -d schemas -f sql --dialect sqlite -o schema.sql
150
+
151
+ # GraphViz
152
+ fake_data_dsl graph schemas/ -o schema.dot --render --format svg
153
+ ```
154
+
155
+ ### Auto-File Generation
156
+
157
+ ```bash
158
+ # Auto-generate filename based on schema name and format
159
+ fake_data_dsl export User -d schemas -f typescript --auto-file
160
+ # Creates: user.ts
161
+
162
+ # Specify output directory (auto-generates filename)
163
+ fake_data_dsl export User -d schemas -f python --out-dir ./generated
164
+ # Creates: ./generated/user.py
165
+
166
+ fake_data_dsl export User -d schemas -f csv -c 100 --out-dir ./data
167
+ # Creates: ./data/user.csv
168
+
169
+ # Multiple exports to same directory
170
+ fake_data_dsl export User -d schemas -f typescript --out-dir ./types
171
+ fake_data_dsl export Order -d schemas -f typescript --out-dir ./types
172
+ # Creates: ./types/user.ts, ./types/order.ts
173
+ ```
174
+
175
+ ### Data Exports
176
+
177
+ ```bash
178
+ # JSON data
179
+ fake_data_dsl export User -d schemas -f json -c 100 -o users.json
180
+ fake_data_dsl export User -d schemas -f json -c 50 --envelope users
181
+ fake_data_dsl export User -d schemas -f json -c 1000 --compact
182
+
183
+ # CSV
184
+ fake_data_dsl export User -d schemas -f csv -c 1000 -o users.csv
185
+ fake_data_dsl export User -d schemas -f csv -c 100 -s 12345 # With seed
186
+
187
+ # SQL INSERT
188
+ fake_data_dsl export User -d schemas -f sql-insert -c 100 --dialect postgresql
189
+ fake_data_dsl export User -d schemas -f sql-insert -c 1000 --dialect mysql --batch
190
+ fake_data_dsl export User -d schemas -f insert -c 500 -o seed_data.sql
191
+
192
+ # YAML
193
+ fake_data_dsl export User -d schemas -f yaml -c 50 -o users.yaml
194
+
195
+ # XML
196
+ fake_data_dsl export User -d schemas -f xml -c 20 -o users.xml
197
+ fake_data_dsl export User -d schemas -f xml -c 10 --root users --item user
198
+ ```
199
+
200
+ ## Export Options Reference
201
+
202
+ ### Common Options
203
+
204
+ | Option | Short | Description |
205
+ |--------|-------|-------------|
206
+ | `--dir DIR` | `-d` | Directory containing .dsl files |
207
+ | `--output FILE` | `-o` | Output file (default: stdout) |
208
+ | `--count COUNT` | `-c` | Number of records for data exports |
209
+ | `--seed SEED` | `-s` | Seed for deterministic generation |
210
+ | `--all` | `-a` | Export all schemas (bulk export) |
211
+
212
+ ### SQL Options
213
+
214
+ | Option | Description |
215
+ |--------|-------------|
216
+ | `--dialect DIALECT` | `postgresql`, `mysql`, or `sqlite` |
217
+ | `--batch` | Use single INSERT with multiple VALUES |
218
+
219
+ ### JSON Options
220
+
221
+ | Option | Description |
222
+ |--------|-------------|
223
+ | `--compact` | Disable pretty-printing |
224
+ | `--envelope KEY` | Wrap output in envelope with metadata |
225
+
226
+ ### XML Options
227
+
228
+ | Option | Description |
229
+ |--------|-------------|
230
+ | `--root NAME` | Custom root element name |
231
+ | `--item NAME` | Custom item element name |
232
+
233
+ ## Examples
234
+
235
+ ### Generate Test Data for API
236
+
237
+ ```ruby
238
+ # Generate 1000 users as JSON for API testing
239
+ json = FakeDataDSL.to_json(schema, count: 1000, seed: 42, envelope: "data")
240
+ File.write("test_users.json", json)
241
+ ```
242
+
243
+ ### Seed Database
244
+
245
+ ```ruby
246
+ # Generate SQL INSERTs for seeding PostgreSQL
247
+ sql = FakeDataDSL.to_sql_insert(schema, count: 500, dialect: :postgresql)
248
+ File.write("seed_users.sql", sql)
249
+
250
+ # Or use batch insert for MySQL (faster)
251
+ sql = FakeDataDSL.to_sql_insert(schema, count: 10000, dialect: :mysql, batch_insert: true)
252
+ ```
253
+
254
+ ### Generate TypeScript Types
255
+
256
+ ```ruby
257
+ # Generate TypeScript interfaces for all schemas
258
+ registry = FakeDataDSL::Registry.new
259
+ registry.load_dir("schemas/")
260
+ typescript = FakeDataDSL.to_typescript_all(registry)
261
+ File.write("src/types/api.ts", typescript)
262
+ ```
263
+
264
+ ### Export for Different Environments
265
+
266
+ ```ruby
267
+ # Development: JSON with pretty printing
268
+ dev_data = FakeDataDSL.to_json(schema, count: 10, pretty: true)
269
+
270
+ # Testing: Deterministic CSV
271
+ test_data = FakeDataDSL.to_csv(schema, count: 100, seed: 12345)
272
+
273
+ # Production seeding: SQL batch insert
274
+ prod_sql = FakeDataDSL.to_sql_insert(schema, count: 10000, batch_insert: true)
275
+ ```
276
+