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,238 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # ============================================================================
5
+ # FakeDataDSL - Basic Usage Examples
6
+ # ============================================================================
7
+ # This file demonstrates the fundamental usage patterns of FakeDataDSL.
8
+ # Run with: cd fake_data_dsl && ruby tech_example/01_basic_usage.rb
9
+ # ============================================================================
10
+
11
+ # Load the local gem
12
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
13
+ require 'fake_data_dsl'
14
+ require 'json'
15
+
16
+ puts "=" * 70
17
+ puts "FakeDataDSL Basic Usage Examples"
18
+ puts "=" * 70
19
+ puts
20
+
21
+ # ============================================================================
22
+ # Example 1: Inline Schema Definition
23
+ # ============================================================================
24
+ puts "1. INLINE SCHEMA DEFINITION"
25
+ puts "-" * 40
26
+
27
+ schema = FakeDataDSL.parse(<<~DSL)
28
+ User:
29
+ id: uuid
30
+ name: name
31
+ email: email
32
+ age: number(18..65)
33
+ active: boolean
34
+ DSL
35
+
36
+ user = schema.generate
37
+ puts "Generated User:"
38
+ puts JSON.pretty_generate(user)
39
+ puts
40
+
41
+ # ============================================================================
42
+ # Example 2: Generate Multiple Records
43
+ # ============================================================================
44
+ puts "2. GENERATE MULTIPLE RECORDS"
45
+ puts "-" * 40
46
+
47
+ users = schema.generate_many(5)
48
+ puts "Generated #{users.length} users:"
49
+ users.each_with_index do |u, i|
50
+ puts " #{i + 1}. #{u['name']} (#{u['email']})"
51
+ end
52
+ puts
53
+
54
+ # ============================================================================
55
+ # Example 3: Deterministic Generation with Seeds
56
+ # ============================================================================
57
+ puts "3. DETERMINISTIC GENERATION (Seeds)"
58
+ puts "-" * 40
59
+
60
+ # Same seed produces same output
61
+ user1 = schema.generate(seed: 12345)
62
+ user2 = schema.generate(seed: 12345)
63
+
64
+ puts "Seed 12345 - First generation:"
65
+ puts " Name: #{user1['name']}, Age: #{user1['age']}"
66
+ puts "Seed 12345 - Second generation:"
67
+ puts " Name: #{user2['name']}, Age: #{user2['age']}"
68
+ puts "Are they identical? #{user1 == user2}"
69
+ puts
70
+
71
+ # ============================================================================
72
+ # Example 4: Different Generation Modes
73
+ # ============================================================================
74
+ puts "4. GENERATION MODES"
75
+ puts "-" * 40
76
+
77
+ # Random mode (default) - typical values
78
+ random_user = schema.generate(mode: :random)
79
+ puts "Random mode: age=#{random_user['age']}, active=#{random_user['active']}"
80
+
81
+ # Edge mode - boundary values
82
+ edge_user = schema.generate(mode: :edge)
83
+ puts "Edge mode: age=#{edge_user['age']}, active=#{edge_user['active']}"
84
+
85
+ # Invalid mode - invalid data for testing
86
+ invalid_user = schema.generate(mode: :invalid)
87
+ puts "Invalid mode: age=#{invalid_user['age'].inspect}, active=#{invalid_user['active'].inspect}"
88
+ puts
89
+
90
+ # ============================================================================
91
+ # Example 5: JSON Output
92
+ # ============================================================================
93
+ puts "5. JSON OUTPUT"
94
+ puts "-" * 40
95
+
96
+ # Compact JSON
97
+ compact = schema.generate_json
98
+ puts "Compact JSON (truncated):"
99
+ puts " #{compact[0..80]}..."
100
+
101
+ # Pretty JSON
102
+ pretty = schema.generate_json(pretty: true)
103
+ puts "Pretty JSON:"
104
+ puts pretty.lines.map { |l| " #{l}" }.join
105
+ puts
106
+
107
+ # ============================================================================
108
+ # Example 6: Complex Schema with Multiple Types
109
+ # ============================================================================
110
+ puts "6. COMPLEX SCHEMA"
111
+ puts "-" * 40
112
+
113
+ complex_schema = FakeDataDSL.parse(<<~DSL)
114
+ Product:
115
+ id: uuid
116
+ name: text(10..50)
117
+ description: text(50..200)
118
+ price: number(9.99..999.99)
119
+ currency: currency
120
+ category: enum(electronics, clothing, home, sports)
121
+ in_stock: boolean(true:80%)
122
+ rating: number(1.0..5.0)
123
+ created_at: past_date(1y)
124
+ DSL
125
+
126
+ product = complex_schema.generate
127
+ puts "Generated Product:"
128
+ puts JSON.pretty_generate(product)
129
+ puts
130
+
131
+ # ============================================================================
132
+ # Example 7: Schema with Optional and Nullable Fields
133
+ # ============================================================================
134
+ puts "7. OPTIONAL AND NULLABLE FIELDS"
135
+ puts "-" * 40
136
+
137
+ profile_schema = FakeDataDSL.parse(<<~DSL)
138
+ Profile:
139
+ user_id: uuid
140
+ display_name: name
141
+ bio?: text(50..200)
142
+ website?: url
143
+ phone: phone?
144
+ DSL
145
+
146
+ # Generate several to show optionality
147
+ puts "Generated 5 profiles (showing optional fields):"
148
+ 5.times do |i|
149
+ profile = profile_schema.generate
150
+ puts " #{i + 1}. bio: #{profile.key?('bio') ? 'present' : 'absent'}, " \
151
+ "website: #{profile.key?('website') ? 'present' : 'absent'}, " \
152
+ "phone: #{profile['phone'].nil? ? 'null' : 'present'}"
153
+ end
154
+ puts
155
+
156
+ # ============================================================================
157
+ # Example 8: Nested Schemas
158
+ # ============================================================================
159
+ puts "8. NESTED SCHEMAS"
160
+ puts "-" * 40
161
+
162
+ nested_schema = FakeDataDSL.parse(<<~DSL)
163
+ Order:
164
+ id: uuid
165
+ customer_name: name
166
+ total: number(10..500)
167
+ status: enum(pending, shipped, delivered)
168
+
169
+ Address:
170
+ street: text(10..50)
171
+ city: name
172
+ country: country_code
173
+ postal_code: postal_code
174
+ DSL
175
+
176
+ order = nested_schema.generate
177
+ puts "Generated Order:"
178
+ puts JSON.pretty_generate(order)
179
+ puts
180
+
181
+ # ============================================================================
182
+ # Example 9: Enum with Weighted Probabilities
183
+ # ============================================================================
184
+ puts "9. WEIGHTED ENUMS"
185
+ puts "-" * 40
186
+
187
+ weighted_schema = FakeDataDSL.parse(<<~DSL)
188
+ Subscription:
189
+ id: uuid
190
+ plan: enum(free:70%, basic:20%, premium:8%, enterprise:2%)
191
+ status: enum(active:90%, cancelled:5%, suspended:5%)
192
+ DSL
193
+
194
+ # Generate many to see distribution
195
+ plan_counts = Hash.new(0)
196
+ status_counts = Hash.new(0)
197
+
198
+ 1000.times do
199
+ sub = weighted_schema.generate
200
+ plan_counts[sub['plan']] += 1
201
+ status_counts[sub['status']] += 1
202
+ end
203
+
204
+ puts "Plan distribution (1000 samples):"
205
+ plan_counts.sort_by { |_, v| -v }.each do |plan, count|
206
+ puts " #{plan}: #{count} (#{(count / 10.0).round(1)}%)"
207
+ end
208
+
209
+ puts "Status distribution (1000 samples):"
210
+ status_counts.sort_by { |_, v| -v }.each do |status, count|
211
+ puts " #{status}: #{count} (#{(count / 10.0).round(1)}%)"
212
+ end
213
+ puts
214
+
215
+ # ============================================================================
216
+ # Example 10: Date and Time Types
217
+ # ============================================================================
218
+ puts "10. DATE AND TIME TYPES"
219
+ puts "-" * 40
220
+
221
+ time_schema = FakeDataDSL.parse(<<~DSL)
222
+ Event:
223
+ id: uuid
224
+ name: text(10..30)
225
+ scheduled_at: timestamp
226
+ created_at: past_date(1y)
227
+ reminder_at: future_date(30d)
228
+ DSL
229
+
230
+ event = time_schema.generate
231
+ puts "Generated Event:"
232
+ puts JSON.pretty_generate(event)
233
+ puts
234
+
235
+ puts "=" * 70
236
+ puts "Examples completed successfully!"
237
+ puts "=" * 70
238
+
@@ -0,0 +1,336 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # ============================================================================
5
+ # FakeDataDSL - All Types Demonstration
6
+ # ============================================================================
7
+ # This file demonstrates all built-in types available in FakeDataDSL.
8
+ # Run with: cd fake_data_dsl && ruby tech_example/02_types_demo.rb
9
+ # ============================================================================
10
+
11
+ # Load the local gem
12
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
13
+ require 'fake_data_dsl'
14
+ require 'json'
15
+
16
+ puts "=" * 70
17
+ puts "FakeDataDSL Types Demonstration"
18
+ puts "=" * 70
19
+ puts
20
+
21
+ # ============================================================================
22
+ # IDENTIFIER TYPES
23
+ # ============================================================================
24
+ puts "IDENTIFIER TYPES"
25
+ puts "-" * 40
26
+
27
+ id_schema = FakeDataDSL.parse(<<~DSL)
28
+ Identifiers:
29
+ uuid_v4: uuid
30
+ uuid_v7: uuid(version: 7)
31
+ ulid: ulid
32
+ sequence_id: id_sequence
33
+ DSL
34
+
35
+ puts "Generated Identifiers:"
36
+ ids = id_schema.generate
37
+ puts JSON.pretty_generate(ids)
38
+ puts
39
+
40
+ # ============================================================================
41
+ # TEXT TYPES
42
+ # ============================================================================
43
+ puts "TEXT TYPES"
44
+ puts "-" * 40
45
+
46
+ text_schema = FakeDataDSL.parse(<<~DSL)
47
+ TextTypes:
48
+ text_default: text
49
+ text_range: text(10..50)
50
+ text_exact: text(20)
51
+ paragraph: paragraph
52
+ sentence: sentence
53
+ word: word
54
+ words_multiple: words
55
+ DSL
56
+
57
+ puts "Generated Text Types:"
58
+ texts = text_schema.generate
59
+ puts JSON.pretty_generate(texts)
60
+ puts
61
+
62
+ # ============================================================================
63
+ # PERSONAL DATA TYPES
64
+ # ============================================================================
65
+ puts "PERSONAL DATA TYPES"
66
+ puts "-" * 40
67
+
68
+ personal_schema = FakeDataDSL.parse(<<~DSL)
69
+ PersonalData:
70
+ full_name: name
71
+ first_name: first_name
72
+ last_name: last_name
73
+ email: email
74
+ username: username
75
+ phone: phone
76
+ avatar: avatar
77
+ DSL
78
+
79
+ puts "Generated Personal Data:"
80
+ personal = personal_schema.generate
81
+ puts JSON.pretty_generate(personal)
82
+ puts
83
+
84
+ # ============================================================================
85
+ # NUMBER TYPES
86
+ # ============================================================================
87
+ puts "NUMBER TYPES"
88
+ puts "-" * 40
89
+
90
+ number_schema = FakeDataDSL.parse(<<~DSL)
91
+ Numbers:
92
+ integer: number(0..100)
93
+ float: number(0.0..100.0)
94
+ price: number(9.99..999.99)
95
+ percentage: number(0..100)
96
+ latitude: latitude
97
+ longitude: longitude
98
+ DSL
99
+
100
+ puts "Generated Numbers:"
101
+ numbers = number_schema.generate
102
+ puts JSON.pretty_generate(numbers)
103
+ puts
104
+
105
+ # ============================================================================
106
+ # BOOLEAN AND ENUM TYPES
107
+ # ============================================================================
108
+ puts "BOOLEAN AND ENUM TYPES"
109
+ puts "-" * 40
110
+
111
+ choice_schema = FakeDataDSL.parse(<<~DSL)
112
+ Choices:
113
+ is_active: boolean
114
+ is_verified: boolean(true:90%)
115
+ status: enum(active, inactive, pending)
116
+ role: enum(user:70%, admin:20%, superadmin:10%)
117
+ color: enum(red, green, blue, yellow, orange)
118
+ DSL
119
+
120
+ puts "Generated Choices:"
121
+ choices = choice_schema.generate
122
+ puts JSON.pretty_generate(choices)
123
+ puts
124
+
125
+ # ============================================================================
126
+ # DATE AND TIME TYPES
127
+ # ============================================================================
128
+ puts "DATE AND TIME TYPES"
129
+ puts "-" * 40
130
+
131
+ datetime_schema = FakeDataDSL.parse(<<~DSL)
132
+ DateTimes:
133
+ date: date
134
+ past_date_1y: past_date(1y)
135
+ past_date_30d: past_date(30d)
136
+ future_date_6m: future_date(6m)
137
+ future_date_1y: future_date(1y)
138
+ timestamp: timestamp
139
+ now: now
140
+ DSL
141
+
142
+ puts "Generated Date/Times:"
143
+ datetimes = datetime_schema.generate
144
+ puts JSON.pretty_generate(datetimes)
145
+ puts
146
+
147
+ # ============================================================================
148
+ # LOCATION TYPES
149
+ # ============================================================================
150
+ puts "LOCATION TYPES"
151
+ puts "-" * 40
152
+
153
+ location_schema = FakeDataDSL.parse(<<~DSL)
154
+ Locations:
155
+ address: address
156
+ city: city
157
+ country: country
158
+ country_code: country_code
159
+ postal_code: postal_code
160
+ state: state
161
+ street_address: street_address
162
+ time_zone: time_zone
163
+ DSL
164
+
165
+ puts "Generated Locations:"
166
+ locations = location_schema.generate
167
+ puts JSON.pretty_generate(locations)
168
+ puts
169
+
170
+ # ============================================================================
171
+ # TECHNOLOGY TYPES
172
+ # ============================================================================
173
+ puts "TECHNOLOGY TYPES"
174
+ puts "-" * 40
175
+
176
+ tech_schema = FakeDataDSL.parse(<<~DSL)
177
+ Technology:
178
+ url: url
179
+ domain: domain
180
+ ip: ip
181
+ ipv6: ipv6
182
+ mac_address: mac_address
183
+ user_agent: user_agent
184
+ DSL
185
+
186
+ puts "Generated Technology Data:"
187
+ tech = tech_schema.generate
188
+ puts JSON.pretty_generate(tech)
189
+ puts
190
+
191
+ # ============================================================================
192
+ # FINANCE TYPES
193
+ # ============================================================================
194
+ puts "FINANCE TYPES"
195
+ puts "-" * 40
196
+
197
+ finance_schema = FakeDataDSL.parse(<<~DSL)
198
+ Finance:
199
+ currency: currency
200
+ currency_code: currency_code
201
+ iban: iban
202
+ credit_card: credit_card
203
+ bank_name: bank_name
204
+ DSL
205
+
206
+ puts "Generated Finance Data:"
207
+ finance = finance_schema.generate
208
+ puts JSON.pretty_generate(finance)
209
+ puts
210
+
211
+ # ============================================================================
212
+ # CRYPTO TYPES
213
+ # ============================================================================
214
+ puts "CRYPTO TYPES"
215
+ puts "-" * 40
216
+
217
+ crypto_schema = FakeDataDSL.parse(<<~DSL)
218
+ Crypto:
219
+ bitcoin_address: bitcoin_address
220
+ ethereum_address: ethereum_address
221
+ hash_md5: hash
222
+ DSL
223
+
224
+ puts "Generated Crypto Data:"
225
+ crypto = crypto_schema.generate
226
+ puts JSON.pretty_generate(crypto)
227
+ puts
228
+
229
+ # ============================================================================
230
+ # CONTENT TYPES
231
+ # ============================================================================
232
+ puts "CONTENT TYPES"
233
+ puts "-" * 40
234
+
235
+ content_schema = FakeDataDSL.parse(<<~DSL)
236
+ Content:
237
+ title: title
238
+ company_name: company_name
239
+ job_title: job_title
240
+ buzzword: buzzword
241
+ color: color
242
+ color_hex: color_hex
243
+ DSL
244
+
245
+ puts "Generated Content:"
246
+ content = content_schema.generate
247
+ puts JSON.pretty_generate(content)
248
+ puts
249
+
250
+ # ============================================================================
251
+ # HEALTH/MEDICAL TYPES
252
+ # ============================================================================
253
+ puts "HEALTH/MEDICAL TYPES"
254
+ puts "-" * 40
255
+
256
+ health_schema = FakeDataDSL.parse(<<~DSL)
257
+ Health:
258
+ blood_type: blood_type
259
+ DSL
260
+
261
+ puts "Generated Health Data:"
262
+ health = health_schema.generate
263
+ puts JSON.pretty_generate(health)
264
+ puts
265
+
266
+ # ============================================================================
267
+ # TRAVEL TYPES
268
+ # ============================================================================
269
+ puts "TRAVEL TYPES"
270
+ puts "-" * 40
271
+
272
+ travel_schema = FakeDataDSL.parse(<<~DSL)
273
+ Travel:
274
+ airport_code: airport_code
275
+ airline: airline
276
+ flight_number: flight_number
277
+ DSL
278
+
279
+ puts "Generated Travel Data:"
280
+ travel = travel_schema.generate
281
+ puts JSON.pretty_generate(travel)
282
+ puts
283
+
284
+ # ============================================================================
285
+ # COMPREHENSIVE TYPE SHOWCASE
286
+ # ============================================================================
287
+ puts "=" * 70
288
+ puts "COMPREHENSIVE TYPE SHOWCASE"
289
+ puts "=" * 70
290
+
291
+ comprehensive_schema = FakeDataDSL.parse(<<~DSL)
292
+ CompleteUser:
293
+ # Identifiers
294
+ id: uuid(unique: true)
295
+ ulid: ulid
296
+
297
+ # Personal
298
+ name: name
299
+ email: email
300
+ phone: phone
301
+ username: username
302
+ avatar: avatar
303
+
304
+ # Profile
305
+ bio: text(50..200)
306
+ website: url
307
+
308
+ # Location
309
+ country: country_code
310
+ city: city
311
+ postal_code: postal_code
312
+
313
+ # Work
314
+ company: company_name
315
+ job_title: job_title
316
+
317
+ # Account
318
+ status: enum(active:80%, inactive:15%, banned:5%)
319
+ role: enum(user:70%, admin:20%, superadmin:10%)
320
+ verified: boolean(true:60%)
321
+
322
+ # Dates
323
+ created_at: past_date(2y)
324
+ updated_at: past_date(30d)
325
+ last_login: past_date(7d)
326
+ DSL
327
+
328
+ puts "Complete User Profile:"
329
+ complete_user = comprehensive_schema.generate
330
+ puts JSON.pretty_generate(complete_user)
331
+ puts
332
+
333
+ puts "=" * 70
334
+ puts "Types demonstration completed!"
335
+ puts "=" * 70
336
+