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,172 @@
1
+ # DSL Reference
2
+
3
+ Complete reference for the FakeDataDSL syntax.
4
+
5
+ ## Schema Definition
6
+
7
+ A schema starts with a name followed by a colon:
8
+
9
+ ```ruby
10
+ SchemaName:
11
+ field1: type1
12
+ field2: type2
13
+ ```
14
+
15
+ ## Field Types
16
+
17
+ ### Basic Types
18
+
19
+ ```ruby
20
+ User:
21
+ id: uuid # UUID v4
22
+ name: name # Full name
23
+ email: email # Email address
24
+ age: number(18..65) # Number in range
25
+ active: boolean # True/false
26
+ bio: text(100..500) # Text with length range
27
+ ```
28
+
29
+ ### Type Arguments
30
+
31
+ Many types accept arguments:
32
+
33
+ ```ruby
34
+ User:
35
+ age: number(18..65) # Range
36
+ price: number(min: 10, max: 100) # Min/max
37
+ status: enum(active, inactive, pending) # Enum values
38
+ tags: array(text, 3..10) # Array with element type and size
39
+ ```
40
+
41
+ ### Nullable Fields
42
+
43
+ Add `?` to make a field nullable:
44
+
45
+ ```ruby
46
+ User:
47
+ middle_name: name? # May be null
48
+ nickname: text? # Optional field
49
+ ```
50
+
51
+ ### Optional Fields
52
+
53
+ Use `optional` modifier to omit fields sometimes:
54
+
55
+ ```ruby
56
+ User:
57
+ phone: phone optional # May be omitted
58
+ ```
59
+
60
+ ## Comments
61
+
62
+ Use `#` for comments:
63
+
64
+ ```ruby
65
+ User:
66
+ # Primary identifier
67
+ id: uuid
68
+ name: name # User's full name
69
+ ```
70
+
71
+ ## Behaviors
72
+
73
+ Behaviors modify how data is generated:
74
+
75
+ ### Schema-Level Behaviors
76
+
77
+ ```ruby
78
+ User:
79
+ @latency 100ms # Add 100ms delay
80
+ @failure 5% # 5% chance of failure
81
+ id: uuid
82
+ name: name
83
+ ```
84
+
85
+ ### Field-Level Behaviors
86
+
87
+ ```ruby
88
+ User:
89
+ id: uuid @latency 50ms
90
+ name: name @failure 1%
91
+ ```
92
+
93
+ See [Behaviors Guide](behaviors.md) for details.
94
+
95
+ ## Arrays
96
+
97
+ Generate arrays of values:
98
+
99
+ ```ruby
100
+ User:
101
+ tags: array(text, 3..10) # 3-10 text items
102
+ scores: array(number(0..100), 5) # Exactly 5 numbers
103
+ ```
104
+
105
+ ## Nested Objects
106
+
107
+ Use the `object` type for nested structures:
108
+
109
+ ```ruby
110
+ User:
111
+ address: object(
112
+ street: text,
113
+ city: city,
114
+ zip: postal_code
115
+ )
116
+ ```
117
+
118
+ ## References
119
+
120
+ Reference other schemas:
121
+
122
+ ```ruby
123
+ User:
124
+ id: uuid
125
+ name: name
126
+
127
+ Order:
128
+ id: uuid
129
+ user_id: reference(User, id) # Reference User's id field
130
+ ```
131
+
132
+ ## Custom Functions
133
+
134
+ Use custom functions for computed values:
135
+
136
+ ```ruby
137
+ User:
138
+ id: uuid
139
+ name: name
140
+ slug: custom(:generate_slug) # Custom function
141
+ ```
142
+
143
+ ## Conditional Fields
144
+
145
+ Fields can be conditional:
146
+
147
+ ```ruby
148
+ User:
149
+ is_admin: boolean
150
+ admin_key: text if is_admin # Only if is_admin is true
151
+ ```
152
+
153
+ ## Multiple Schemas
154
+
155
+ Define multiple schemas in one file:
156
+
157
+ ```ruby
158
+ User:
159
+ id: uuid
160
+ name: name
161
+
162
+ Order:
163
+ id: uuid
164
+ user_id: reference(User, id)
165
+ total: number(10..1000)
166
+ ```
167
+
168
+ ## See Also
169
+
170
+ - [Type Reference](type_reference.md) - Complete list of types
171
+ - [Examples](examples.md) - Usage examples
172
+
data/docs/examples.md ADDED
@@ -0,0 +1,162 @@
1
+ # Examples
2
+
3
+ Real-world examples of using FakeDataDSL.
4
+
5
+ ## E-Commerce Application
6
+
7
+ ```ruby
8
+ # schemas/ecommerce.dsl
9
+ User:
10
+ id: uuid
11
+ email: email unique
12
+ name: name
13
+ created_at: past_date(days: 365)
14
+
15
+ Product:
16
+ id: uuid
17
+ name: product_name
18
+ category: product_category
19
+ price: money(min: 10, max: 1000)
20
+ sku: sku
21
+
22
+ Order:
23
+ id: uuid
24
+ user_id: reference(User, id)
25
+ product_id: reference(Product, id)
26
+ quantity: number(1..10)
27
+ total: formula(quantity * price)
28
+ status: enum(placed: 60%, processing: 30%, shipped: 10%)
29
+ created_at: past_date(days: 30)
30
+ ```
31
+
32
+ ## Social Media Platform
33
+
34
+ ```ruby
35
+ # schemas/social.dsl
36
+ User:
37
+ id: uuid
38
+ username: username unique
39
+ email: email unique
40
+ full_name: full_name
41
+ bio: text(50..200) optional
42
+ avatar_url: url optional
43
+ created_at: past_date(days: 730)
44
+
45
+ Post:
46
+ id: uuid
47
+ author_id: reference(User, id)
48
+ content: text(100..1000)
49
+ likes: number(0..10000)
50
+ created_at: past_date(days: 30)
51
+
52
+ Comment:
53
+ id: uuid
54
+ post_id: reference(Post, id)
55
+ author_id: reference(User, id)
56
+ content: text(10..500)
57
+ created_at: past_date(days: 7)
58
+ ```
59
+
60
+ ## Healthcare System
61
+
62
+ ```ruby
63
+ # schemas/healthcare.dsl
64
+ Patient:
65
+ id: uuid
66
+ first_name: first_name
67
+ last_name: last_name
68
+ date_of_birth: past_date(days: 36500) # ~100 years
69
+ blood_type: blood_type
70
+ medical_record_number: medical_code(type: :icd10)
71
+
72
+ VitalSigns:
73
+ patient_id: reference(Patient, id)
74
+ heart_rate: heart_rate(min: 60, max: 100)
75
+ bmi: bmi(range: 18.5..30.0)
76
+ recorded_at: past_date(days: 7)
77
+
78
+ Diagnosis:
79
+ patient_id: reference(Patient, id)
80
+ code: medical_code(type: :icd10)
81
+ description: text(50..500)
82
+ diagnosed_at: past_date(days: 365)
83
+ ```
84
+
85
+ ## Financial Application
86
+
87
+ ```ruby
88
+ # schemas/finance.dsl
89
+ Account:
90
+ id: uuid
91
+ account_number: account_number
92
+ bank_name: bank_name
93
+ iban: iban(country: :us)
94
+ balance: transaction_amount(min: 0, max: 100000)
95
+ currency: currency
96
+
97
+ Transaction:
98
+ id: uuid
99
+ from_account_id: reference(Account, id)
100
+ to_account_id: reference(Account, id)
101
+ amount: transaction_amount(min: 1, max: 10000)
102
+ currency: currency
103
+ status: enum(pending: 20%, completed: 75%, failed: 5%)
104
+ created_at: past_date(days: 30)
105
+
106
+ Payment:
107
+ id: uuid
108
+ account_id: reference(Account, id)
109
+ credit_card: credit_card(type: :visa)
110
+ amount: transaction_amount(min: 10, max: 1000)
111
+ status: enum(approved: 90%, declined: 10%)
112
+ processed_at: past_date(days: 7)
113
+ ```
114
+
115
+ ## Testing Scenarios
116
+
117
+ ### Edge Case Testing
118
+
119
+ ```ruby
120
+ # Generate edge cases
121
+ schema = registry.schema('User')
122
+ edge_records = schema.generate_many(100, mode: :edge)
123
+
124
+ # Test validation
125
+ edge_records.each do |record|
126
+ validate_user(record) # Should handle edge cases
127
+ end
128
+ ```
129
+
130
+ ### Invalid Data Testing
131
+
132
+ ```ruby
133
+ # Generate invalid data
134
+ invalid_records = schema.generate_many(100, mode: :invalid)
135
+
136
+ # Test error handling
137
+ invalid_records.each do |record|
138
+ expect { create_user(record) }.to raise_error(ValidationError)
139
+ end
140
+ ```
141
+
142
+ ### Performance Testing
143
+
144
+ ```ruby
145
+ # Generate with latency
146
+ User:
147
+ @latency 50ms..200ms
148
+ id: uuid
149
+ name: name
150
+
151
+ # Measure generation time
152
+ start = Time.now
153
+ records = schema.generate_many(1000)
154
+ duration = Time.now - start
155
+ puts "Generated 1000 records in #{duration}s"
156
+ ```
157
+
158
+ ## See Also
159
+
160
+ - [Getting Started](getting_started.md) - Basic usage
161
+ - [DSL Reference](dsl_reference.md) - Syntax details
162
+
@@ -0,0 +1,125 @@
1
+ # Generation Modes
2
+
3
+ FakeDataDSL supports different generation modes for various testing scenarios.
4
+
5
+ ## Available Modes
6
+
7
+ ### Random Mode (Default)
8
+
9
+ Generates realistic random data:
10
+
11
+ ```ruby
12
+ schema = registry.schema('User')
13
+ record = schema.generate(mode: :random)
14
+ # => Normal, realistic data
15
+ ```
16
+
17
+ ### Edge Mode
18
+
19
+ Generates edge case values (empty, boundary, null):
20
+
21
+ ```ruby
22
+ record = schema.generate(mode: :edge)
23
+ # => Edge cases: empty strings, null values, boundary numbers
24
+ ```
25
+
26
+ **Use cases:**
27
+ - Testing validation logic
28
+ - Finding boundary bugs
29
+ - Stress testing
30
+
31
+ ### Invalid Mode
32
+
33
+ Generates intentionally invalid data:
34
+
35
+ ```ruby
36
+ record = schema.generate(mode: :invalid)
37
+ # => Invalid data: wrong types, malformed values
38
+ ```
39
+
40
+ **Use cases:**
41
+ - Testing error handling
42
+ - Validating input sanitization
43
+ - Security testing
44
+
45
+ ### Mixed Mode
46
+
47
+ Combines random, edge, and invalid values:
48
+
49
+ ```ruby
50
+ record = schema.generate(mode: :mixed)
51
+ # => Mix of random, edge, and invalid values
52
+ ```
53
+
54
+ **Custom ratios:**
55
+
56
+ ```ruby
57
+ record = schema.generate(mode: :mixed, ratios: { random: 70, edge: 20, invalid: 10 })
58
+ ```
59
+
60
+ ## Mode Examples
61
+
62
+ ### Random Mode
63
+
64
+ ```ruby
65
+ User:
66
+ name: name
67
+ age: number(18..65)
68
+ email: email
69
+
70
+ # Generates:
71
+ # { "name" => "John Smith", "age" => 42, "email" => "john@example.com" }
72
+ ```
73
+
74
+ ### Edge Mode
75
+
76
+ ```ruby
77
+ # Same schema, edge mode:
78
+ # { "name" => "", "age" => 18, "email" => "" }
79
+ # or
80
+ # { "name" => "A", "age" => 65, "email" => "a@b.c" }
81
+ ```
82
+
83
+ ### Invalid Mode
84
+
85
+ ```ruby
86
+ # Same schema, invalid mode:
87
+ # { "name" => 123, "age" => "not a number", "email" => nil }
88
+ ```
89
+
90
+ ## Mode Configuration
91
+
92
+ Set default mode globally:
93
+
94
+ ```ruby
95
+ FakeDataDSL.configure do |config|
96
+ config.default_mode = :edge
97
+ end
98
+ ```
99
+
100
+ Or per-schema:
101
+
102
+ ```ruby
103
+ schema = registry.schema('User')
104
+ schema.default_mode = :invalid
105
+ ```
106
+
107
+ ## Combining with Behaviors
108
+
109
+ Modes work with behaviors:
110
+
111
+ ```ruby
112
+ User:
113
+ @latency 100ms
114
+ @failure 5%
115
+ name: name
116
+
117
+ # Edge mode + behaviors:
118
+ # Generates edge cases with delays and occasional failures
119
+ ```
120
+
121
+ ## See Also
122
+
123
+ - [Behaviors Guide](behaviors.md) - Behavior system
124
+ - [Examples](examples.md) - Mode usage examples
125
+
@@ -0,0 +1,92 @@
1
+ # Getting Started with FakeDataDSL
2
+
3
+ FakeDataDSL is a Ruby gem for generating realistic fake data using a simple, human-friendly DSL (Domain-Specific Language).
4
+
5
+ ## Installation
6
+
7
+ Add FakeDataDSL to your Gemfile:
8
+
9
+ ```ruby
10
+ gem 'fake_data_dsl'
11
+ ```
12
+
13
+ Then run:
14
+
15
+ ```bash
16
+ bundle install
17
+ ```
18
+
19
+ Or install it directly:
20
+
21
+ ```bash
22
+ gem install fake_data_dsl
23
+ ```
24
+
25
+ ## Basic Usage
26
+
27
+ ### 1. Define a Schema
28
+
29
+ Create a schema file (e.g., `user.dsl`):
30
+
31
+ ```ruby
32
+ User:
33
+ id: uuid
34
+ name: name
35
+ email: email
36
+ age: number(18..65)
37
+ active: boolean
38
+ ```
39
+
40
+ ### 2. Load and Generate
41
+
42
+ ```ruby
43
+ require 'fake_data_dsl'
44
+
45
+ # Load schema
46
+ registry = FakeDataDSL::Registry.new
47
+ registry.load_file('user.dsl')
48
+
49
+ # Generate a single record
50
+ schema = registry.schema('User')
51
+ record = schema.generate
52
+ # => { "id" => "550e8400-e29b-41d4-a716-446655440000",
53
+ # "name" => "John Smith",
54
+ # "email" => "john.smith@example.com",
55
+ # "age" => 42,
56
+ # "active" => true }
57
+
58
+ # Generate multiple records
59
+ records = schema.generate_many(10)
60
+ # => Array of 10 user records
61
+ ```
62
+
63
+ ## Key Concepts
64
+
65
+ ### Schemas
66
+
67
+ A **schema** defines the structure of your data. Each schema has a name (like `User`) and contains fields with types.
68
+
69
+ ### Types
70
+
71
+ Types define what kind of data to generate. Examples:
72
+ - `uuid` - Universally unique identifiers
73
+ - `name` - Person names
74
+ - `email` - Email addresses
75
+ - `number` - Numeric values
76
+ - `boolean` - True/false values
77
+
78
+ See [Type Reference](type_reference.md) for the complete list.
79
+
80
+ ### Fields
81
+
82
+ Fields are the properties of your schema. Each field has:
83
+ - A name (e.g., `id`, `name`)
84
+ - A type (e.g., `uuid`, `name`)
85
+ - Optional arguments (e.g., `number(18..65)`)
86
+
87
+ ## Next Steps
88
+
89
+ - Read the [DSL Reference](dsl_reference.md) to learn the full syntax
90
+ - Explore [Examples](examples.md) for real-world use cases
91
+ - Check out [Advanced Features](advanced_features.md) for complex scenarios
92
+