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,193 @@
1
+ # Type Reference Chart
2
+
3
+ Quick reference for all available types in FakeDataDSL.
4
+
5
+ ## Identifier Types
6
+
7
+ | Type | Description | Arguments | Random Example | Edge Example |
8
+ |------|-------------|-----------|----------------|--------------|
9
+ | `uuid` | UUID v4/v6/v7 | `version: 4\|6\|7`, `unique: true` | `"550e8400-e29b-41d4-a716-446655440000"` | `"00000000-0000-0000-0000-000000000000"` |
10
+ | `ulid` | ULID | - | `"01ARZ3NDEKTSV4RRFQ69G5FAV"` | `"00000000000000000000000000"` |
11
+ | `id_sequence` | Auto-increment | `start: N`, `step: N` | `1`, `2`, `3`... | Same as random |
12
+
13
+ ## Personal Data Types
14
+
15
+ | Type | Description | Arguments | Random Example | Edge Example |
16
+ |------|-------------|-----------|----------------|--------------|
17
+ | `name` | Full name | - | `"John Smith"` | `""`, `"X"` |
18
+ | `first_name` | First name | - | `"John"` | `""` |
19
+ | `last_name` | Last name | - | `"Smith"` | `""` |
20
+ | `email` | Email address | `unique: true` | `"john@example.com"` | `"a@b.c"` |
21
+ | `phone` | Phone number | `locale: XX` | `"+1-555-123-4567"` | `""` |
22
+ | `username` | Username | - | `"john_smith42"` | `""`, `"x"` |
23
+ | `avatar` | Avatar URL | - | `"https://example.com/avatar.jpg"` | `""` |
24
+
25
+ ## Text Types
26
+
27
+ | Type | Description | Arguments | Random Example | Edge Example |
28
+ |------|-------------|-----------|----------------|--------------|
29
+ | `text` | Random text | `min..max`, `length: N` | `"Lorem ipsum..."` | `""`, max length |
30
+ | `paragraph` | Paragraph(s) | `count: N` | Multi-sentence text | `""` |
31
+ | `sentence` | Sentence(s) | `count: N` | `"The quick brown fox."` | `""` |
32
+ | `word` | Word(s) | `count: N` | `"hello"` | `""` |
33
+ | `words` | Multiple words | `count: N` | `"hello world foo"` | `""` |
34
+
35
+ ## Number Types
36
+
37
+ | Type | Description | Arguments | Random Example | Edge Example |
38
+ |------|-------------|-----------|----------------|--------------|
39
+ | `number` | Integer/float | `min..max`, `precision: N` | `42`, `3.14` | `0`, min, max |
40
+ | `integer` | Integer only | `min..max` | `42` | `0`, min, max |
41
+ | `float` | Float only | `min..max` | `42.5` | `0.0`, min, max |
42
+ | `latitude` | Latitude | - | `40.7128` | `-90.0`, `90.0` |
43
+ | `longitude` | Longitude | - | `-74.0060` | `-180.0`, `180.0` |
44
+
45
+ ## Boolean & Enum
46
+
47
+ | Type | Description | Arguments | Random Example | Edge Example |
48
+ |------|-------------|-----------|----------------|--------------|
49
+ | `boolean` | True/false | `true:N%`, `false:N%` | `true`, `false` | `true`, `false` |
50
+ | `enum` | One of values | `val1, val2:N%` | `"val1"` | First, last value |
51
+
52
+ ## Date & Time Types
53
+
54
+ | Type | Description | Arguments | Random Example | Edge Example |
55
+ |------|-------------|-----------|----------------|--------------|
56
+ | `date` | Random date | - | `"2024-06-15"` | `"1970-01-01"` |
57
+ | `past_date` | Past date | `Nd`, `Nm`, `Ny` | `"2024-01-15"` | Min date |
58
+ | `future_date` | Future date | `Nd`, `Nm`, `Ny` | `"2025-06-15"` | Max date |
59
+ | `timestamp` | DateTime | - | `"2024-06-15T14:30:00Z"` | Min/max timestamp |
60
+ | `now` | Current time | - | `"2024-07-15T10:30:00Z"` | Current time |
61
+ | `datetime` | DateTime range | `from:`, `to:` | `"2024-06-15T14:30:00Z"` | From/to bounds |
62
+ | `time` | Time only | - | `"14:30:00"` | `"00:00:00"` |
63
+
64
+ ## Location Types
65
+
66
+ | Type | Description | Arguments | Random Example | Edge Example |
67
+ |------|-------------|-----------|----------------|--------------|
68
+ | `address` | Full address | - | `"123 Main St, City, ST 12345"` | `""` |
69
+ | `street_address` | Street address | - | `"123 Main Street"` | `""` |
70
+ | `city` | City name | - | `"New York"` | `""` |
71
+ | `state` | State/province | - | `"California"` | `""` |
72
+ | `country` | Country name | - | `"United States"` | `""` |
73
+ | `country_code` | ISO country code | - | `"US"` | `"XX"` |
74
+ | `postal_code` | ZIP/postal code | `country: XX` | `"10001"` | `"00000"` |
75
+ | `time_zone` | Timezone | - | `"America/New_York"` | `"UTC"` |
76
+
77
+ ## Technology Types
78
+
79
+ | Type | Description | Arguments | Random Example | Edge Example |
80
+ |------|-------------|-----------|----------------|--------------|
81
+ | `url` | URL | - | `"https://example.com"` | `""`, long URL |
82
+ | `domain` | Domain name | - | `"example.com"` | `""` |
83
+ | `ip` | IPv4 address | - | `"192.168.1.1"` | `"0.0.0.0"` |
84
+ | `ipv6` | IPv6 address | - | `"2001:db8::1"` | `"::"` |
85
+ | `mac_address` | MAC address | - | `"00:1B:44:11:3A:B7"` | `"00:00:00:00:00:00"` |
86
+ | `user_agent` | User agent | - | `"Mozilla/5.0..."` | `""` |
87
+
88
+ ## Finance Types
89
+
90
+ | Type | Description | Arguments | Random Example | Edge Example |
91
+ |------|-------------|-----------|----------------|--------------|
92
+ | `money` | Amount + currency | `range:`, `currency:` | `{"amount": 99.99, "currency": "USD"}` | Min/max |
93
+ | `currency` | Currency name | - | `"US Dollar"` | `""` |
94
+ | `currency_code` | ISO currency | - | `"USD"` | `"XXX"` |
95
+ | `iban` | IBAN | - | `"GB82WEST12345698765432"` | Invalid format |
96
+ | `credit_card` | Card number | - | `"4111111111111111"` | Test numbers |
97
+ | `bank_name` | Bank name | - | `"Chase"` | `""` |
98
+
99
+ ## Crypto Types
100
+
101
+ | Type | Description | Arguments | Random Example | Edge Example |
102
+ |------|-------------|-----------|----------------|--------------|
103
+ | `bitcoin_address` | BTC address | - | `"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"` | Invalid |
104
+ | `ethereum_address` | ETH address | - | `"0x71C7656EC7ab88b098defB751B7401B5f6d8976F"` | Invalid |
105
+ | `hash` | Hash string | `algorithm: md5\|sha256` | `"d41d8cd98f00b..."` | `""` |
106
+
107
+ ## Content Types
108
+
109
+ | Type | Description | Arguments | Random Example | Edge Example |
110
+ |------|-------------|-----------|----------------|--------------|
111
+ | `title` | Title/headline | - | `"Breaking News"` | `""` |
112
+ | `company_name` | Company name | - | `"Acme Corp"` | `""` |
113
+ | `job_title` | Job title | - | `"Software Engineer"` | `""` |
114
+ | `buzzword` | Business buzzword | - | `"synergize"` | `""` |
115
+ | `color` | Color name | - | `"blue"` | `""` |
116
+ | `color_hex` | Hex color | - | `"#FF5733"` | `"#000000"` |
117
+
118
+ ## Health Types
119
+
120
+ | Type | Description | Arguments | Random Example | Edge Example |
121
+ |------|-------------|-----------|----------------|--------------|
122
+ | `blood_type` | Blood type | - | `"A+"` | All types |
123
+
124
+ ## Travel Types
125
+
126
+ | Type | Description | Arguments | Random Example | Edge Example |
127
+ |------|-------------|-----------|----------------|--------------|
128
+ | `airport_code` | IATA code | - | `"JFK"` | `"XXX"` |
129
+ | `airline` | Airline name | - | `"Delta"` | `""` |
130
+ | `flight_number` | Flight number | - | `"AA1234"` | `"XX0000"` |
131
+
132
+ ## Complex Types
133
+
134
+ | Type | Description | Arguments | Random Example | Edge Example |
135
+ |------|-------------|-----------|----------------|--------------|
136
+ | `array` | Array of items | `element, size` | `["a", "b", "c"]` | `[]`, large array |
137
+ | `object` | Generic object | - | `{"key": "value"}` | `{}` |
138
+ | `Ref(Schema.field)` | Reference | - | Referenced value | - |
139
+ | `custom` | Custom function | `:function_name` | Function result | - |
140
+
141
+ ## Special Types
142
+
143
+ | Type | Description | Arguments | Random Example | Edge Example |
144
+ |------|-------------|-----------|----------------|--------------|
145
+ | `formula` | Math expression | `"field1 + field2"` | Computed value | - |
146
+ | `template` | String template | `"${field} text"` | Interpolated string | - |
147
+ | `sequence` | Custom sequence | Various | Sequential value | - |
148
+
149
+ ---
150
+
151
+ ## Type Arguments Reference
152
+
153
+ ### Range Arguments
154
+
155
+ ```dsl
156
+ number(0..100) # Integer range
157
+ number(0.0..100.0) # Float range
158
+ text(10..50) # Character count range
159
+ ```
160
+
161
+ ### Named Arguments
162
+
163
+ ```dsl
164
+ uuid(unique: true, version: 7)
165
+ number(min: 0, max: 100, precision: 2)
166
+ past_date(days: 30)
167
+ ```
168
+
169
+ ### Duration Arguments
170
+
171
+ ```dsl
172
+ past_date(30d) # 30 days
173
+ past_date(6m) # 6 months
174
+ past_date(2y) # 2 years
175
+ ```
176
+
177
+ ### Probability Arguments
178
+
179
+ ```dsl
180
+ boolean(true:80%) # 80% true
181
+ enum(a:60%, b:30%, c:10%) # Weighted enum
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Mode Output Summary
187
+
188
+ | Mode | String | Number | Boolean | Date |
189
+ |------|--------|--------|---------|------|
190
+ | `:random` | Realistic | In range | 50/50 | Realistic |
191
+ | `:edge` | Empty, long | Min, max | true, false | Boundaries |
192
+ | `:invalid` | nil, wrong type | String | nil, "yes" | Invalid format |
193
+
@@ -0,0 +1,383 @@
1
+ # Basic Concepts
2
+
3
+ Understanding the core concepts and terminology of FakeDataDSL.
4
+
5
+ ## Table of Contents
6
+
7
+ - [What is FakeDataDSL?](#what-is-fakedatadsl)
8
+ - [Core Concepts](#core-concepts)
9
+ - [The DSL](#the-dsl)
10
+ - [Types](#types)
11
+ - [Generation](#generation)
12
+ - [Modes](#modes)
13
+ - [Behaviors](#behaviors)
14
+ - [Registry](#registry)
15
+
16
+ ---
17
+
18
+ ## What is FakeDataDSL?
19
+
20
+ FakeDataDSL is a Ruby gem that lets you:
21
+
22
+ 1. **Define data schemas** using a simple, human-readable DSL
23
+ 2. **Generate fake data** that matches those schemas
24
+ 3. **Simulate real-world conditions** like network latency and failures
25
+ 4. **Test edge cases** with different generation modes
26
+
27
+ ### Key Benefits
28
+
29
+ | Benefit | Description |
30
+ |---------|-------------|
31
+ | **Declarative** | Define WHAT data looks like, not HOW to generate it |
32
+ | **Deterministic** | Same seed always produces same output |
33
+ | **Flexible** | Multiple generation modes for different testing needs |
34
+ | **Scalable** | Stream millions of records without memory issues |
35
+ | **Extensible** | Add custom types, functions, and behaviors |
36
+
37
+ ---
38
+
39
+ ## Core Concepts
40
+
41
+ ### Schema
42
+
43
+ A **schema** defines the structure of your data. It specifies:
44
+ - Field names
45
+ - Field types
46
+ - Optional constraints and arguments
47
+
48
+ ```dsl
49
+ User: # Schema name
50
+ id: uuid # Field: name: type
51
+ name: name # Field: name: type
52
+ age: number(18..65) # Field with arguments
53
+ ```
54
+
55
+ ### Field
56
+
57
+ A **field** is a single data point within a schema:
58
+
59
+ ```dsl
60
+ SchemaName:
61
+ field_name: type # Basic field
62
+ field_name: type(args) # Field with arguments
63
+ optional_field?: type # Optional field
64
+ nullable_field: type? # Nullable field
65
+ ```
66
+
67
+ ### Type
68
+
69
+ A **type** is a generator that produces specific kinds of data:
70
+
71
+ | Type | Generates |
72
+ |------|-----------|
73
+ | `uuid` | `"550e8400-e29b-41d4-a716-446655440000"` |
74
+ | `name` | `"John Smith"` |
75
+ | `email` | `"john@example.com"` |
76
+ | `number(1..100)` | `42` |
77
+ | `boolean` | `true` or `false` |
78
+
79
+ ### Mode
80
+
81
+ A **mode** determines what kind of data to generate:
82
+
83
+ | Mode | Purpose |
84
+ |------|---------|
85
+ | `:random` | Typical, realistic values (default) |
86
+ | `:edge` | Boundary values, edge cases |
87
+ | `:invalid` | Invalid data for validation testing |
88
+ | `:mixed` | Combination of all modes |
89
+
90
+ ### Behavior
91
+
92
+ A **behavior** simulates real-world conditions:
93
+
94
+ ```dsl
95
+ APIResponse:
96
+ @latency 100..500ms # Add delay
97
+ @failure 5% # 5% chance of error
98
+
99
+ data: text
100
+ ```
101
+
102
+ ---
103
+
104
+ ## The DSL
105
+
106
+ ### Syntax Overview
107
+
108
+ FakeDataDSL uses an indentation-based syntax:
109
+
110
+ ```dsl
111
+ # Comments start with #
112
+
113
+ SchemaName: # Schema declaration (ends with colon)
114
+ field_name: type # Field definition (indented)
115
+ field_name: type(arguments) # Field with arguments
116
+
117
+ @behavior value # Schema-level behavior
118
+ ```
119
+
120
+ ### Indentation Rules
121
+
122
+ - Use **2 spaces** for indentation (recommended)
123
+ - Tabs are supported but don't mix tabs and spaces
124
+ - Each schema starts at column 0
125
+ - Fields are indented under their schema
126
+
127
+ ### Multiple Schemas
128
+
129
+ ```dsl
130
+ User:
131
+ id: uuid
132
+ name: name
133
+
134
+ Order:
135
+ id: uuid
136
+ user_id: Ref(User.id)
137
+ ```
138
+
139
+ ---
140
+
141
+ ## Types
142
+
143
+ ### Built-in Types
144
+
145
+ FakeDataDSL includes 50+ built-in types:
146
+
147
+ #### Identifiers
148
+ - `uuid`, `uuid(version: 7)`, `ulid`, `id_sequence`
149
+
150
+ #### Personal Data
151
+ - `name`, `first_name`, `last_name`, `email`, `phone`
152
+
153
+ #### Location
154
+ - `address`, `city`, `country`, `postal_code`, `latitude`, `longitude`
155
+
156
+ #### Date/Time
157
+ - `date`, `past_date`, `future_date`, `timestamp`, `now`
158
+
159
+ #### Finance
160
+ - `money`, `currency`, `iban`, `credit_card`
161
+
162
+ #### Technology
163
+ - `url`, `ip`, `ipv6`, `domain`, `mac_address`
164
+
165
+ #### Text
166
+ - `text(min..max)`, `paragraph`, `sentence`, `word`
167
+
168
+ #### Primitives
169
+ - `number(min..max)`, `boolean`, `enum(val1, val2)`
170
+
171
+ ### Type Arguments
172
+
173
+ Types can accept arguments:
174
+
175
+ ```dsl
176
+ User:
177
+ # Range arguments
178
+ age: number(18..65)
179
+ bio: text(50..500)
180
+
181
+ # Named arguments
182
+ id: uuid(unique: true, version: 7)
183
+ role: enum(user, admin:10%)
184
+
185
+ # Duration arguments
186
+ created_at: past_date(1y)
187
+ expires_at: future_date(30d)
188
+ ```
189
+
190
+ ### Custom Types
191
+
192
+ Create your own types:
193
+
194
+ ```ruby
195
+ FakeDataDSL.register_type(:ssn) do |rng, context, args, mode|
196
+ "#{rng.int(100, 999)}-#{rng.int(10, 99)}-#{rng.int(1000, 9999)}"
197
+ end
198
+ ```
199
+
200
+ ---
201
+
202
+ ## Generation
203
+
204
+ ### Single Record
205
+
206
+ ```ruby
207
+ schema = FakeDataDSL.load('schema.dsl')
208
+ record = schema.generate
209
+ ```
210
+
211
+ ### Multiple Records
212
+
213
+ ```ruby
214
+ records = schema.generate_many(100)
215
+ ```
216
+
217
+ ### Streaming (Large Batches)
218
+
219
+ ```ruby
220
+ schema.generate_stream(count: 1_000_000).each do |record|
221
+ process(record)
222
+ end
223
+ ```
224
+
225
+ ### With Options
226
+
227
+ ```ruby
228
+ record = schema.generate(
229
+ seed: 12345, # For reproducibility
230
+ mode: :edge, # Generation mode
231
+ registry: registry, # For cross-references
232
+ overrides: { # Override specific fields
233
+ 'status' => 'active'
234
+ }
235
+ )
236
+ ```
237
+
238
+ ---
239
+
240
+ ## Modes
241
+
242
+ ### Random Mode (Default)
243
+
244
+ Generates typical, realistic data:
245
+
246
+ ```ruby
247
+ schema.generate(mode: :random)
248
+ # => {"age" => 34, "name" => "John Smith"}
249
+ ```
250
+
251
+ ### Edge Mode
252
+
253
+ Generates boundary values and edge cases:
254
+
255
+ ```ruby
256
+ schema.generate(mode: :edge)
257
+ # => {"age" => 0, "name" => ""}
258
+ ```
259
+
260
+ Edge cases include:
261
+ - Empty strings
262
+ - Minimum/maximum values
263
+ - Boundary dates
264
+ - Special characters
265
+
266
+ ### Invalid Mode
267
+
268
+ Generates invalid data for validation testing:
269
+
270
+ ```ruby
271
+ schema.generate(mode: :invalid)
272
+ # => {"age" => "not_a_number", "name" => nil}
273
+ ```
274
+
275
+ Invalid data includes:
276
+ - Wrong types
277
+ - Null values
278
+ - Malformed formats
279
+ - Out-of-range values
280
+
281
+ ### Mixed Mode
282
+
283
+ Combines all modes randomly:
284
+
285
+ ```ruby
286
+ schema.generate(mode: :mixed)
287
+ # 80% random, 15% edge, 5% invalid
288
+ ```
289
+
290
+ ---
291
+
292
+ ## Behaviors
293
+
294
+ ### What Are Behaviors?
295
+
296
+ Behaviors simulate real-world conditions:
297
+
298
+ | Behavior | Description |
299
+ |----------|-------------|
300
+ | `@latency` | Adds artificial delay |
301
+ | `@failure` | Throws errors randomly |
302
+ | `@partial_data` | Omits random fields |
303
+ | `@close_connection` | Simulates connection drops |
304
+ | `@simulate_error` | Returns HTTP error codes |
305
+
306
+ ### Schema-Level Behaviors
307
+
308
+ Apply to all generation:
309
+
310
+ ```dsl
311
+ APIResponse:
312
+ @latency 100..500ms
313
+ @failure 5%
314
+
315
+ id: uuid
316
+ data: text
317
+ ```
318
+
319
+ ### Field-Level Behaviors
320
+
321
+ Apply to specific fields:
322
+
323
+ ```dsl
324
+ User:
325
+ id: uuid
326
+ avatar: url @partial_data 30%
327
+ ```
328
+
329
+ ---
330
+
331
+ ## Registry
332
+
333
+ ### What is a Registry?
334
+
335
+ A **registry** manages multiple schemas and resolves cross-schema references.
336
+
337
+ ### Creating a Registry
338
+
339
+ ```ruby
340
+ registry = FakeDataDSL::Registry.new
341
+
342
+ # Load individual files
343
+ registry.load_file('schemas/user.dsl')
344
+ registry.load_file('schemas/order.dsl')
345
+
346
+ # Or load entire directory
347
+ registry.load_dir('schemas/')
348
+ ```
349
+
350
+ ### Cross-Schema References
351
+
352
+ ```dsl
353
+ # user.dsl
354
+ User:
355
+ id: uuid
356
+ name: name
357
+
358
+ # order.dsl
359
+ Order:
360
+ id: uuid
361
+ user_id: Ref(User.id) # References User schema
362
+ ```
363
+
364
+ ```ruby
365
+ registry = FakeDataDSL::Registry.new
366
+ registry.load_dir('schemas/')
367
+
368
+ # Generate with resolved references
369
+ order = registry.schema('Order').generate(registry: registry)
370
+ # order["user_id"] is a valid UUID
371
+ ```
372
+
373
+ ---
374
+
375
+ ## Next Steps
376
+
377
+ Now that you understand the basics:
378
+
379
+ 1. [DSL Reference](dsl/schema_definition.md) - Complete syntax guide
380
+ 2. [Type Reference](dsl/core_types.md) - All available types
381
+ 3. [API Reference](api/overview.md) - Ruby API documentation
382
+ 4. [Examples](../tech_example/README.md) - Real-world examples
383
+