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,279 @@
1
+ # frozen_string_literal: true
2
+
3
+ # =============================================================================
4
+
5
+ # Synthra Resource Limits
6
+ # =============================================================================
7
+ #
8
+ # This file defines resource limits to prevent runaway generation scenarios
9
+ # that could exhaust system resources. Limits include:
10
+ #
11
+ # - Maximum latency for @latency behaviors
12
+ # - Maximum recursion depth for nested schemas
13
+ # - Maximum array size for array fields
14
+ #
15
+ # Configure limits via Synthra.configuration.limits
16
+ #
17
+ # @example Configure limits
18
+ # Synthra.configure do |config|
19
+ # config.limits.max_latency_ms = 10000
20
+ # config.limits.max_recursion = 5
21
+ # config.limits.max_array_size = 100
22
+ # end
23
+ #
24
+ # =============================================================================
25
+
26
+
27
+ module Synthra
28
+
29
+ # Resource limits to prevent runaway generation
30
+ #
31
+ # The Limits class provides configurable safety limits that prevent
32
+ # accidental resource exhaustion during data generation. Each limit
33
+ # has a default value and can be customized per application needs.
34
+ #
35
+ # Limits are validated during generation, and appropriate errors are
36
+ # raised when limits are exceeded.
37
+ #
38
+ # @example Access limits
39
+ # limits = Synthra.configuration.limits
40
+ # limits.max_latency_ms # => 5000
41
+ # limits.max_recursion # => 10
42
+ # limits.max_array_size # => 1000
43
+ #
44
+ # @example Configure limits
45
+ # Synthra.configure do |config|
46
+ # config.limits.max_latency_ms = 10000 # Allow up to 10 second delays
47
+ # config.limits.max_recursion = 3 # Limit nesting to 3 levels
48
+ # config.limits.max_array_size = 50 # Limit arrays to 50 elements
49
+ # end
50
+ #
51
+ # @example Handle limit errors
52
+ # begin
53
+ # schema.generate
54
+ # rescue Synthra::LatencyLimitError => e
55
+ # puts "Latency too high: #{e.requested}ms > #{e.max_allowed}ms"
56
+ # rescue Synthra::RecursionLimitError => e
57
+ # puts "Too deeply nested: #{e.depth} > #{e.max_allowed}"
58
+ # rescue Synthra::ArraySizeLimitError => e
59
+ # puts "Array too large: #{e.size} > #{e.max_allowed}"
60
+ # end
61
+ #
62
+
63
+ class Limits
64
+
65
+ # Default maximum latency in milliseconds (5 seconds)
66
+ #
67
+ # This prevents behaviors from creating excessively long delays
68
+ # that could cause timeouts in tests.
69
+ #
70
+ # @return [Integer] default maximum latency in milliseconds
71
+ #
72
+
73
+ DEFAULT_MAX_LATENCY_MS = 5000
74
+
75
+
76
+ # Default maximum recursion depth (10 levels)
77
+ #
78
+ # This prevents infinite recursion when schemas reference each other.
79
+ # Most real-world schemas don't need more than 5-10 levels of nesting.
80
+ #
81
+ # @return [Integer] default maximum recursion depth
82
+ #
83
+
84
+ DEFAULT_MAX_RECURSION = 10
85
+
86
+
87
+ # Default maximum array size (1000 elements)
88
+ #
89
+ # This prevents generating extremely large arrays that could
90
+ # consume excessive memory or take too long to generate.
91
+ #
92
+ # @return [Integer] default maximum array elements
93
+ #
94
+
95
+ DEFAULT_MAX_ARRAY_SIZE = 1000
96
+
97
+
98
+ # Default maximum text length (10,000 characters)
99
+ #
100
+ # This prevents generating extremely long text strings that could
101
+ # consume excessive memory or cause performance issues.
102
+ #
103
+ # @return [Integer] default maximum text length in characters
104
+ #
105
+
106
+ DEFAULT_MAX_TEXT_LENGTH = 10_000
107
+
108
+
109
+ # @!attribute max_latency_ms
110
+ # Maximum allowed latency for @latency behaviors
111
+ # @return [Integer] maximum latency in milliseconds
112
+ # @see LatencyLimitError raised when exceeded
113
+ #
114
+ # @example Allow longer delays for integration tests
115
+ # limits.max_latency_ms = 30000 # 30 seconds
116
+ #
117
+
118
+ attr_accessor :max_latency_ms
119
+
120
+
121
+ # @!attribute max_recursion
122
+ # Maximum allowed recursion depth for nested schemas
123
+ # @return [Integer] maximum nesting depth
124
+ # @see RecursionLimitError raised when exceeded
125
+ #
126
+ # @example Limit nesting for performance
127
+ # limits.max_recursion = 3 # Only 3 levels of nesting
128
+ #
129
+
130
+ attr_accessor :max_recursion
131
+
132
+
133
+ # @!attribute max_array_size
134
+ # Maximum allowed number of elements in generated arrays
135
+ # @return [Integer] maximum array size
136
+ # @see ArraySizeLimitError raised when exceeded
137
+ #
138
+ # @example Limit array sizes for memory
139
+ # limits.max_array_size = 100 # Maximum 100 elements
140
+ #
141
+
142
+ attr_accessor :max_array_size
143
+
144
+
145
+ # @!attribute max_text_length
146
+ # Maximum allowed length for generated text strings
147
+ # @return [Integer] maximum text length in characters
148
+ # @see TextLengthLimitError raised when exceeded
149
+ #
150
+ # @example Limit text length for memory
151
+ # limits.max_text_length = 5000 # Maximum 5000 characters
152
+ #
153
+
154
+ attr_accessor :max_text_length
155
+
156
+
157
+ # Create a new Limits instance with default values
158
+ #
159
+ # @return [Limits] a new limits instance with defaults
160
+ #
161
+ # @example
162
+ # limits = Synthra::Limits.new
163
+ # limits.max_latency_ms # => 5000
164
+ # limits.max_recursion # => 10
165
+ # limits.max_array_size # => 1000
166
+ #
167
+
168
+ def initialize
169
+ @max_latency_ms = DEFAULT_MAX_LATENCY_MS
170
+ @max_recursion = DEFAULT_MAX_RECURSION
171
+ @max_array_size = DEFAULT_MAX_ARRAY_SIZE
172
+ @max_text_length = DEFAULT_MAX_TEXT_LENGTH
173
+ end
174
+
175
+
176
+ # Validate that a latency value is within limits
177
+ #
178
+ # Checks if the requested latency (in milliseconds) is within
179
+ # the configured maximum. If not, raises a LatencyLimitError.
180
+ #
181
+ # @param ms [Integer] the latency value in milliseconds to validate
182
+ # @raise [LatencyLimitError] if ms exceeds max_latency_ms
183
+ # @return [void] returns nil if validation passes
184
+ #
185
+ # @example Valid latency
186
+ # limits.validate_latency!(1000) # => nil (1 second is OK)
187
+ #
188
+ # @example Invalid latency
189
+ # limits.max_latency_ms = 5000
190
+ # limits.validate_latency!(10000)
191
+ # # => LatencyLimitError: Latency 10000ms exceeds maximum allowed 5000ms
192
+ #
193
+
194
+ def validate_latency!(ms)
195
+ return if ms <= max_latency_ms
196
+
197
+ raise LatencyLimitError.new(requested: ms, max_allowed: max_latency_ms)
198
+ end
199
+
200
+
201
+ # Validate that a recursion depth is within limits
202
+ #
203
+ # Checks if the current recursion depth is within the configured
204
+ # maximum. This is called during nested schema generation to prevent
205
+ # infinite recursion.
206
+ #
207
+ # @param depth [Integer] the current recursion depth to validate
208
+ # @raise [RecursionLimitError] if depth exceeds max_recursion
209
+ # @return [void] returns nil if validation passes
210
+ #
211
+ # @example Valid depth
212
+ # limits.validate_recursion!(5) # => nil (5 levels is OK)
213
+ #
214
+ # @example Invalid depth
215
+ # limits.max_recursion = 10
216
+ # limits.validate_recursion!(15)
217
+ # # => RecursionLimitError: Recursion depth 15 exceeds maximum allowed 10
218
+ #
219
+
220
+ def validate_recursion!(depth)
221
+ return if depth < max_recursion
222
+
223
+ raise RecursionLimitError.new(depth: depth, max_allowed: max_recursion)
224
+ end
225
+
226
+
227
+ # Validate that an array size is within limits
228
+ #
229
+ # Checks if the requested array size is within the configured
230
+ # maximum. This prevents generating arrays with excessive elements
231
+ # that could exhaust memory.
232
+ #
233
+ # @param size [Integer] the array size to validate
234
+ # @raise [ArraySizeLimitError] if size exceeds max_array_size
235
+ # @return [void] returns nil if validation passes
236
+ #
237
+ # @example Valid size
238
+ # limits.validate_array_size!(100) # => nil (100 elements is OK)
239
+ #
240
+ # @example Invalid size
241
+ # limits.max_array_size = 1000
242
+ # limits.validate_array_size!(5000)
243
+ # # => ArraySizeLimitError: Array size 5000 exceeds maximum allowed 1000
244
+ #
245
+
246
+ def validate_array_size!(size)
247
+ return if size <= max_array_size
248
+
249
+ raise ArraySizeLimitError.new(size: size, max_allowed: max_array_size)
250
+ end
251
+
252
+
253
+ # Validate that a text length is within limits
254
+ #
255
+ # Checks if the requested text length is within the configured
256
+ # maximum. This prevents generating text strings with excessive
257
+ # characters that could exhaust memory.
258
+ #
259
+ # @param length [Integer] the text length in characters to validate
260
+ # @raise [TextLengthLimitError] if length exceeds max_text_length
261
+ # @return [void] returns nil if validation passes
262
+ #
263
+ # @example Valid length
264
+ # limits.validate_text_length!(1000) # => nil (1000 chars is OK)
265
+ #
266
+ # @example Invalid length
267
+ # limits.max_text_length = 10000
268
+ # limits.validate_text_length!(20000)
269
+ # # => TextLengthLimitError: Text length 20000 exceeds maximum allowed 10000
270
+ #
271
+
272
+ def validate_text_length!(length)
273
+ return if length <= max_text_length
274
+ # :nocov:
275
+ raise TextLengthLimitError.new(length: length, max_allowed: max_text_length)
276
+ # :nocov:
277
+ end
278
+ end
279
+ end