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,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Synthra
4
+ module Types
5
+ module AddressLocation
6
+ # Address type
7
+ class Address < Base
8
+ def generate_random(rng, context, args)
9
+ include_country = args[:include_country] || false
10
+
11
+ adapter = faker_adapter(context)
12
+ if adapter
13
+ if include_country
14
+ adapter.full_address
15
+
16
+ else
17
+ "#{adapter.street_address}, #{adapter.city}, #{adapter.state_abbr} #{adapter.zip_code}"
18
+ end
19
+
20
+ else
21
+ if include_country
22
+ Faker::Address.full_address
23
+ else
24
+ "#{Faker::Address.street_address}, #{Faker::Address.city}, #{Faker::Address.state_abbr} #{Faker::Address.zip_code}"
25
+ end
26
+
27
+ end
28
+
29
+ rescue StandardError
30
+ rng.sample([
31
+ "123 Main St, New York, NY 10001",
32
+ "456 Oak Avenue, Los Angeles, CA 90001",
33
+ "789 Elm Street, Chicago, IL 60601"
34
+ ])
35
+ end
36
+
37
+
38
+ def generate_edge(rng, context, args)
39
+ ["", "123 Main St", "PO Box 123", "Apt 4B, 123 Main St"].sample(random: rng.instance_variable_get(:@random))
40
+ end
41
+
42
+ def generate_invalid(rng, context, args)
43
+ [nil, 123, [], {}, true].sample(random: rng.instance_variable_get(:@random))
44
+ end
45
+ end
46
+
47
+ # AddressLine2 type
48
+ class AddressLine2 < Base
49
+ ADDRESS_LINE2_PREFIXES = ["Apt", "Suite", "Unit", "Floor", "Room", "Building", "Tower"].freeze
50
+ ADDRESS_LINE2_SUFFIXES = ["A", "B", "C", "1", "2", "3", "101", "202", "303"].freeze
51
+
52
+ def generate_random(rng, context, args)
53
+ prefix = rng.sample(ADDRESS_LINE2_PREFIXES)
54
+ suffix = rng.sample(ADDRESS_LINE2_SUFFIXES)
55
+ "#{prefix} #{suffix}"
56
+ end
57
+
58
+ def generate_edge(rng, context, args)
59
+ ["", "Apt 0", "Suite 9999", "Unit A"].sample(random: rng.instance_variable_get(:@random))
60
+ end
61
+
62
+ def generate_invalid(rng, context, args)
63
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
64
+ end
65
+ end
66
+
67
+ # StreetName type
68
+ class StreetName < Base
69
+ def generate_random(rng, context, args)
70
+ adapter = faker_adapter(context)
71
+ if adapter
72
+ adapter.street_name
73
+
74
+ else
75
+ Faker::Address.street_name
76
+ end
77
+
78
+ rescue StandardError
79
+ rng.sample(["Main St", "Oak Ave", "Park Blvd", "First St", "Second Ave"])
80
+ end
81
+
82
+
83
+ def generate_edge(rng, context, args)
84
+ ["", "A", "Very Long Street Name That Exceeds Normal Limits"].sample(random: rng.instance_variable_get(:@random))
85
+ end
86
+
87
+ def generate_invalid(rng, context, args)
88
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
89
+ end
90
+ end
91
+
92
+ # StreetNumber type
93
+ class StreetNumber < Base
94
+ def generate_random(rng, context, args)
95
+ rng.int(1, 9999).to_s
96
+ end
97
+
98
+ def generate_edge(rng, context, args)
99
+ ["0", "1", "9999", "10000"].sample(random: rng.instance_variable_get(:@random))
100
+ end
101
+
102
+ def generate_invalid(rng, context, args)
103
+ [nil, "not a number", [], {}].sample(random: rng.instance_variable_get(:@random))
104
+ end
105
+ end
106
+
107
+ # StreetSuffix type
108
+ class StreetSuffix < Base
109
+ SUFFIXES = ["St", "Ave", "Blvd", "Rd", "Dr", "Ln", "Ct", "Pl", "Way", "Pkwy"].freeze
110
+
111
+ def generate_random(rng, context, args)
112
+ rng.sample(SUFFIXES)
113
+ end
114
+
115
+ def generate_edge(rng, context, args)
116
+ ["", "St", "Ave"].sample(random: rng.instance_variable_get(:@random))
117
+ end
118
+
119
+ def generate_invalid(rng, context, args)
120
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,200 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Synthra
4
+ module Types
5
+ module AddressLocation
6
+ # AirportName type
7
+ class AirportName < Base
8
+ def generate_random(rng, context, args)
9
+ adapter = faker_adapter(context)
10
+ if adapter && adapter.respond_to?(:airport_name)
11
+ adapter.airport_name
12
+
13
+ else
14
+ # Fallback to common airport names
15
+ rng.sample([
16
+ "John F. Kennedy International Airport",
17
+ "Los Angeles International Airport",
18
+ "Heathrow Airport",
19
+ "Charles de Gaulle Airport",
20
+ "Dubai International Airport"
21
+ ])
22
+ end
23
+
24
+ rescue StandardError
25
+ rng.sample([
26
+ "John F. Kennedy International Airport",
27
+ "Los Angeles International Airport",
28
+ "Heathrow Airport"
29
+ ])
30
+ end
31
+
32
+
33
+ def generate_edge(rng, context, args)
34
+ ["", "A", "Very Long Airport Name"].sample(random: rng.instance_variable_get(:@random))
35
+ end
36
+
37
+ def generate_invalid(rng, context, args)
38
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
39
+ end
40
+ end
41
+
42
+ # AirportContinent type
43
+ class AirportContinent < Base
44
+ CONTINENTS = ["North America", "South America", "Europe", "Asia", "Africa", "Australia", "Antarctica"].freeze
45
+
46
+ def generate_random(rng, context, args)
47
+ rng.sample(CONTINENTS)
48
+ end
49
+
50
+ def generate_edge(rng, context, args)
51
+ ["", "Antarctica"].sample(random: rng.instance_variable_get(:@random))
52
+ end
53
+
54
+ def generate_invalid(rng, context, args)
55
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
56
+ end
57
+ end
58
+
59
+ # AirportCountryCode type
60
+ class AirportCountryCode < Base
61
+ def generate_random(rng, context, args)
62
+ adapter = faker_adapter(context)
63
+ if adapter
64
+ adapter.country_code
65
+
66
+ else
67
+ Faker::Address.country_code
68
+ end
69
+
70
+ rescue StandardError
71
+ rng.sample(["US", "GB", "CA", "AU", "DE"])
72
+ end
73
+
74
+
75
+ def generate_edge(rng, context, args)
76
+ ["", "US", "XX"].sample(random: rng.instance_variable_get(:@random))
77
+ end
78
+
79
+ def generate_invalid(rng, context, args)
80
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
81
+ end
82
+ end
83
+
84
+ # AirportElevation type
85
+ class AirportElevation < Base
86
+ def generate_random(rng, context, args)
87
+ rng.int(-100, 15000) # Elevation in feet (some airports below sea level)
88
+ end
89
+
90
+ def generate_edge(rng, context, args)
91
+ [-100, 0, 15000].sample(random: rng.instance_variable_get(:@random))
92
+ end
93
+
94
+ def generate_invalid(rng, context, args)
95
+ [nil, "not a number", [], {}].sample(random: rng.instance_variable_get(:@random))
96
+ end
97
+ end
98
+
99
+ # AirportGpsCode type
100
+ class AirportGpsCode < Base
101
+ def generate_random(rng, context, args)
102
+ # GPS codes are typically 4-6 alphanumeric characters
103
+ chars = ('A'..'Z').to_a + ('0'..'9').to_a
104
+ length = rng.int(4, 6)
105
+ length.times.map { rng.sample(chars) }.join
106
+ end
107
+
108
+ def generate_edge(rng, context, args)
109
+ ["", "A", "ABCDEF"].sample(random: rng.instance_variable_get(:@random))
110
+ end
111
+
112
+ def generate_invalid(rng, context, args)
113
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
114
+ end
115
+ end
116
+
117
+ # AirportLatitude type
118
+ class AirportLatitude < Base
119
+ def generate_random(rng, context, args)
120
+ # Airport latitudes range from -90 to 90
121
+ (rng.rand * 180 - 90).round(6)
122
+ end
123
+
124
+ def generate_edge(rng, context, args)
125
+ [-90.0, 0.0, 90.0].sample(random: rng.instance_variable_get(:@random))
126
+ end
127
+
128
+ def generate_invalid(rng, context, args)
129
+ [nil, "not a number", [], {}].sample(random: rng.instance_variable_get(:@random))
130
+ end
131
+ end
132
+
133
+ # AirportLongitude type
134
+ class AirportLongitude < Base
135
+ def generate_random(rng, context, args)
136
+ # Airport longitudes range from -180 to 180
137
+ (rng.rand * 360 - 180).round(6)
138
+ end
139
+
140
+ def generate_edge(rng, context, args)
141
+ [-180.0, 0.0, 180.0].sample(random: rng.instance_variable_get(:@random))
142
+ end
143
+
144
+ def generate_invalid(rng, context, args)
145
+ [nil, "not a number", [], {}].sample(random: rng.instance_variable_get(:@random))
146
+ end
147
+ end
148
+
149
+ # AirportMunicipality type
150
+ class AirportMunicipality < Base
151
+ def generate_random(rng, context, args)
152
+ adapter = faker_adapter(context)
153
+ if adapter
154
+ adapter.city
155
+
156
+ else
157
+ Faker::Address.city
158
+ end
159
+
160
+ rescue StandardError
161
+ rng.sample(["New York", "Los Angeles", "Chicago"])
162
+ end
163
+
164
+
165
+ def generate_edge(rng, context, args)
166
+ ["", "A"].sample(random: rng.instance_variable_get(:@random))
167
+ end
168
+
169
+ def generate_invalid(rng, context, args)
170
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
171
+ end
172
+ end
173
+
174
+ # AirportRegionCode type
175
+ class AirportRegionCode < Base
176
+ def generate_random(rng, context, args)
177
+ adapter = faker_adapter(context)
178
+ if adapter && adapter.respond_to?(:state)
179
+ adapter.state
180
+
181
+ else
182
+ rng.sample(["CA", "NY", "TX", "FL", "IL"])
183
+ end
184
+
185
+ rescue StandardError
186
+ rng.sample(["CA", "NY", "TX", "FL", "IL"])
187
+ end
188
+
189
+
190
+ def generate_edge(rng, context, args)
191
+ ["", "CA", "XX"].sample(random: rng.instance_variable_get(:@random))
192
+ end
193
+
194
+ def generate_invalid(rng, context, args)
195
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Synthra
4
+ module Types
5
+ module AddressLocation
6
+ # BankCity type
7
+ class BankCity < Base
8
+ def generate_random(rng, context, args)
9
+ adapter = faker_adapter(context)
10
+ if adapter
11
+ adapter.city
12
+
13
+ else
14
+ Faker::Address.city
15
+ end
16
+
17
+ rescue StandardError
18
+ rng.sample(["New York", "Los Angeles", "Chicago"])
19
+ end
20
+
21
+
22
+ def generate_edge(rng, context, args)
23
+ ["", "A"].sample(random: rng.instance_variable_get(:@random))
24
+ end
25
+
26
+ def generate_invalid(rng, context, args)
27
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
28
+ end
29
+ end
30
+
31
+ # BankCountryCode type
32
+ class BankCountryCode < Base
33
+ def generate_random(rng, context, args)
34
+ adapter = faker_adapter(context)
35
+ if adapter
36
+ adapter.country_code
37
+
38
+ else
39
+ Faker::Address.country_code
40
+ end
41
+
42
+ rescue StandardError
43
+ rng.sample(["US", "GB", "CA", "AU", "DE"])
44
+ end
45
+
46
+
47
+ def generate_edge(rng, context, args)
48
+ ["", "US", "XX"].sample(random: rng.instance_variable_get(:@random))
49
+ end
50
+
51
+ def generate_invalid(rng, context, args)
52
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
53
+ end
54
+ end
55
+
56
+ # BankStreetAddress type
57
+ class BankStreetAddress < Base
58
+ def generate_random(rng, context, args)
59
+ adapter = faker_adapter(context)
60
+ if adapter && adapter.respond_to?(:street_address)
61
+ adapter.street_address
62
+
63
+ else
64
+ Faker::Address.street_address
65
+ end
66
+
67
+ rescue StandardError
68
+ rng.sample(["123 Main St", "456 Oak Ave", "789 Elm St"])
69
+ end
70
+
71
+
72
+ def generate_edge(rng, context, args)
73
+ ["", "123 Main St"].sample(random: rng.instance_variable_get(:@random))
74
+ end
75
+
76
+ def generate_invalid(rng, context, args)
77
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
78
+ end
79
+ end
80
+
81
+ # BankState type
82
+ class BankState < Base
83
+ def generate_random(rng, context, args)
84
+ adapter = faker_adapter(context)
85
+ if adapter && adapter.respond_to?(:state)
86
+ adapter.state
87
+
88
+ else
89
+ Faker::Address.state
90
+ end
91
+
92
+ rescue StandardError
93
+ rng.sample(["California", "New York", "Texas"])
94
+ end
95
+
96
+
97
+ def generate_edge(rng, context, args)
98
+ ["", "CA"].sample(random: rng.instance_variable_get(:@random))
99
+ end
100
+
101
+ def generate_invalid(rng, context, args)
102
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
103
+ end
104
+ end
105
+
106
+ # HospitalCity type
107
+ class HospitalCity < Base
108
+ def generate_random(rng, context, args)
109
+ adapter = faker_adapter(context)
110
+ if adapter
111
+ adapter.city
112
+
113
+ else
114
+ Faker::Address.city
115
+ end
116
+
117
+ rescue StandardError
118
+ rng.sample(["New York", "Los Angeles", "Chicago"])
119
+ end
120
+
121
+
122
+ def generate_edge(rng, context, args)
123
+ ["", "A"].sample(random: rng.instance_variable_get(:@random))
124
+ end
125
+
126
+ def generate_invalid(rng, context, args)
127
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
128
+ end
129
+ end
130
+
131
+ # HospitalPostalCode type
132
+ class HospitalPostalCode < Base
133
+ def generate_random(rng, context, args)
134
+ adapter = faker_adapter(context)
135
+ if adapter
136
+ adapter.zip_code
137
+
138
+ else
139
+ Faker::Address.zip_code
140
+ end
141
+
142
+ rescue StandardError
143
+ rng.sample(["12345", "90210", "60601"])
144
+ end
145
+
146
+
147
+ def generate_edge(rng, context, args)
148
+ ["", "00000", "99999"].sample(random: rng.instance_variable_get(:@random))
149
+ end
150
+
151
+ def generate_invalid(rng, context, args)
152
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
153
+ end
154
+ end
155
+
156
+ # HospitalState type
157
+ class HospitalState < Base
158
+ def generate_random(rng, context, args)
159
+ adapter = faker_adapter(context)
160
+ if adapter && adapter.respond_to?(:state)
161
+ adapter.state
162
+
163
+ else
164
+ Faker::Address.state
165
+ end
166
+
167
+ rescue StandardError
168
+ rng.sample(["California", "New York", "Texas"])
169
+ end
170
+
171
+
172
+ def generate_edge(rng, context, args)
173
+ ["", "CA"].sample(random: rng.instance_variable_get(:@random))
174
+ end
175
+
176
+ def generate_invalid(rng, context, args)
177
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
178
+ end
179
+ end
180
+
181
+ # HospitalStreetAddress type
182
+ class HospitalStreetAddress < Base
183
+ def generate_random(rng, context, args)
184
+ adapter = faker_adapter(context)
185
+ if adapter && adapter.respond_to?(:street_address)
186
+ adapter.street_address
187
+
188
+ else
189
+ Faker::Address.street_address
190
+ end
191
+
192
+ rescue StandardError
193
+ rng.sample(["123 Main St", "456 Oak Ave", "789 Elm St"])
194
+ end
195
+
196
+
197
+ def generate_edge(rng, context, args)
198
+ ["", "123 Main St"].sample(random: rng.instance_variable_get(:@random))
199
+ end
200
+
201
+ def generate_invalid(rng, context, args)
202
+ [nil, 123, [], {}].sample(random: rng.instance_variable_get(:@random))
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end