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.
- checksums.yaml +7 -0
- data/.rspec +4 -0
- data/.rubocop.yml +40 -0
- data/.yardopts +18 -0
- data/ACCESS_DOCS.md +116 -0
- data/ADVANCED_FEATURES_SUMMARY.md +245 -0
- data/CHANGELOG.md +498 -0
- data/CODE_OF_CONDUCT.md +122 -0
- data/CONTRIBUTING.md +307 -0
- data/DOCUMENTATION.md +204 -0
- data/DOCUMENTATION_GUIDE.md +194 -0
- data/LICENSE +22 -0
- data/README.md +1458 -0
- data/Rakefile +128 -0
- data/benchmark/README.md +591 -0
- data/benchmark/batch_generation.rb +63 -0
- data/benchmark/engine_comparison.rb +295 -0
- data/benchmark/single_record.rb +108 -0
- data/benchmark/streaming.rb +74 -0
- data/docs/ACTIVERECORD_INFERENCE.md +524 -0
- data/docs/API_SERVER.md +278 -0
- data/docs/CONFIG_FILE.md +315 -0
- data/docs/DATA_CONTRACTS.md +312 -0
- data/docs/ENHANCED_REPL.md +304 -0
- data/docs/FACTORY_BOT.md +271 -0
- data/docs/GITHUB_ACTION.md +420 -0
- data/docs/GRAPHQL_EXPORT.md +303 -0
- data/docs/GRAPHQL_FEDERATION.md +651 -0
- data/docs/HOW_TO_GENERATE_DOCS.md +252 -0
- data/docs/LSP.md +189 -0
- data/docs/MIGRATION_GENERATOR.md +547 -0
- data/docs/MOCK_SERVER.md +280 -0
- data/docs/NATIVE_ENGINE.md +298 -0
- data/docs/OPENAPI_EXPORT.md +252 -0
- data/docs/PERFORMANCE_MODE.md +228 -0
- data/docs/PERSONAS.md +547 -0
- data/docs/PROPERTY_TESTING.md +284 -0
- data/docs/PROTOBUF_EXPORT.md +276 -0
- data/docs/QUALITY_METRICS.md +555 -0
- data/docs/QUICK_REFERENCE.md +88 -0
- data/docs/RAILS_ENGINE.md +404 -0
- data/docs/RAILS_INTEGRATION.md +454 -0
- data/docs/README.md +175 -0
- data/docs/REPL_QUICK_REFERENCE.md +149 -0
- data/docs/RUST_INTEGRATION_GUIDE.md +1376 -0
- data/docs/SCENARIOS.md +576 -0
- data/docs/SECURITY_TESTING.md +318 -0
- data/docs/SNAPSHOT_TESTING.md +308 -0
- data/docs/STRING_TEXT_TYPES_REFERENCE.md +512 -0
- data/docs/TERRAFORM_EXPORT.md +447 -0
- data/docs/TIME_TRAVEL.md +507 -0
- data/docs/USAGE_GUIDE.md +980 -0
- data/docs/WEBHOOK_SIMULATOR.md +579 -0
- data/docs/advanced_features.md +183 -0
- data/docs/api_reference.md +153 -0
- data/docs/behaviors.md +138 -0
- data/docs/best_practices.md +191 -0
- data/docs/dsl_reference.md +172 -0
- data/docs/examples.md +162 -0
- data/docs/generation_modes.md +125 -0
- data/docs/getting_started.md +92 -0
- data/docs/index.html +177 -0
- data/docs/strategic/CLOUD_REGISTRY_ARCHITECTURE.md +268 -0
- data/docs/strategic/SIMD_OPTIMIZATION_STRATEGY.md +153 -0
- data/docs/troubleshooting.md +215 -0
- data/docs/type_reference.md +224 -0
- data/examples/hostile_mode_demo.rb +64 -0
- data/exe/synthra +6 -0
- data/ext/synthra_native/Cargo.lock +972 -0
- data/ext/synthra_native/Cargo.toml +46 -0
- data/ext/synthra_native/extconf.rb +41 -0
- data/ext/synthra_native/src/generator.rs +397 -0
- data/ext/synthra_native/src/lib.rs +229 -0
- data/ext/synthra_native/src/types.rs +1485 -0
- data/lib/generators/synthra/install_generator.rb +86 -0
- data/lib/generators/synthra/templates/api_response.dsl +15 -0
- data/lib/generators/synthra/templates/fake_data.rake +116 -0
- data/lib/generators/synthra/templates/synthra.yml +31 -0
- data/lib/generators/synthra/templates/synthra_support.rb +19 -0
- data/lib/generators/synthra/templates/user.dsl +11 -0
- data/lib/synthra/activerecord_inference.rb +394 -0
- data/lib/synthra/api.rb +381 -0
- data/lib/synthra/api_server.rb +718 -0
- data/lib/synthra/behaviors/applicator.rb +165 -0
- data/lib/synthra/behaviors/base.rb +155 -0
- data/lib/synthra/behaviors/close_connection.rb +60 -0
- data/lib/synthra/behaviors/deprecated.rb +100 -0
- data/lib/synthra/behaviors/failure.rb +69 -0
- data/lib/synthra/behaviors/latency.rb +103 -0
- data/lib/synthra/behaviors/partial_data.rb +83 -0
- data/lib/synthra/behaviors/randomize_order.rb +74 -0
- data/lib/synthra/behaviors/registry.rb +238 -0
- data/lib/synthra/behaviors/simulate_error.rb +79 -0
- data/lib/synthra/cli/commands/base.rb +105 -0
- data/lib/synthra/cli/commands/diff.rb +227 -0
- data/lib/synthra/cli/commands/docs.rb +67 -0
- data/lib/synthra/cli/commands/export.rb +150 -0
- data/lib/synthra/cli/commands/generate.rb +72 -0
- data/lib/synthra/cli/commands/import.rb +80 -0
- data/lib/synthra/cli/commands/lint.rb +53 -0
- data/lib/synthra/cli/commands/live.rb +57 -0
- data/lib/synthra/cli/commands/seed.rb +99 -0
- data/lib/synthra/cli/commands/validate.rb +28 -0
- data/lib/synthra/cli.rb +2471 -0
- data/lib/synthra/config_file.rb +129 -0
- data/lib/synthra/configuration.rb +281 -0
- data/lib/synthra/contracts_registry.rb +408 -0
- data/lib/synthra/database_seeder.rb +268 -0
- data/lib/synthra/deterministic_ids.rb +218 -0
- data/lib/synthra/documentation_generator.rb +414 -0
- data/lib/synthra/engine.rb +251 -0
- data/lib/synthra/errors.rb +1169 -0
- data/lib/synthra/export/base.rb +85 -0
- data/lib/synthra/export/csv.rb +101 -0
- data/lib/synthra/export/graphql.rb +266 -0
- data/lib/synthra/export/graphql_federation.rb +377 -0
- data/lib/synthra/export/graphviz.rb +258 -0
- data/lib/synthra/export/javascript.rb +327 -0
- data/lib/synthra/export/json_data.rb +61 -0
- data/lib/synthra/export/json_schema.rb +290 -0
- data/lib/synthra/export/openapi.rb +514 -0
- data/lib/synthra/export/protobuf.rb +483 -0
- data/lib/synthra/export/python.rb +560 -0
- data/lib/synthra/export/sql.rb +381 -0
- data/lib/synthra/export/sql_insert.rb +152 -0
- data/lib/synthra/export/terraform.rb +501 -0
- data/lib/synthra/export/type_mapping.rb +389 -0
- data/lib/synthra/export/typescript.rb +300 -0
- data/lib/synthra/export/xml_data.rb +104 -0
- data/lib/synthra/export/yaml_data.rb +56 -0
- data/lib/synthra/export.rb +404 -0
- data/lib/synthra/factory_bot_integration.rb +157 -0
- data/lib/synthra/field.rb +440 -0
- data/lib/synthra/functions/registry.rb +104 -0
- data/lib/synthra/generator/context.rb +372 -0
- data/lib/synthra/generator/engine.rb +336 -0
- data/lib/synthra/generator/faker_adapter.rb +425 -0
- data/lib/synthra/generator/modes.rb +444 -0
- data/lib/synthra/generator/resolver.rb +256 -0
- data/lib/synthra/generator/rng.rb +273 -0
- data/lib/synthra/generator/streamer.rb +63 -0
- data/lib/synthra/generator/uniqueness.rb +118 -0
- data/lib/synthra/initializer.rb +97 -0
- data/lib/synthra/limits.rb +279 -0
- data/lib/synthra/live_preview.rb +518 -0
- data/lib/synthra/loader_config.rb +78 -0
- data/lib/synthra/lsp/server.rb +689 -0
- data/lib/synthra/migration_generator.rb +301 -0
- data/lib/synthra/mixin.rb +174 -0
- data/lib/synthra/mock_server.rb +458 -0
- data/lib/synthra/native_engine.rb +304 -0
- data/lib/synthra/openapi_importer.rb +228 -0
- data/lib/synthra/output/json_formatter.rb +40 -0
- data/lib/synthra/output/ndjson_formatter.rb +55 -0
- data/lib/synthra/parser/ast.rb +1287 -0
- data/lib/synthra/parser/lexer.rb +1152 -0
- data/lib/synthra/parser/parser.rb +1664 -0
- data/lib/synthra/parser/tokens.rb +461 -0
- data/lib/synthra/performance_mode.rb +364 -0
- data/lib/synthra/personas.rb +397 -0
- data/lib/synthra/property_testing.rb +172 -0
- data/lib/synthra/quality_metrics.rb +405 -0
- data/lib/synthra/rails_test_helper.rb +248 -0
- data/lib/synthra/registry.rb +533 -0
- data/lib/synthra/relationships.rb +193 -0
- data/lib/synthra/repl/enhanced_repl.rb +607 -0
- data/lib/synthra/repl/formatter.rb +191 -0
- data/lib/synthra/scenarios.rb +423 -0
- data/lib/synthra/schema.rb +605 -0
- data/lib/synthra/schema_inheritance.rb +104 -0
- data/lib/synthra/schema_versioning.rb +212 -0
- data/lib/synthra/snapshot_testing.rb +199 -0
- data/lib/synthra/time_travel.rb +338 -0
- data/lib/synthra/type_definitions.rb +274 -0
- data/lib/synthra/types/address_location/addresses.rb +125 -0
- data/lib/synthra/types/address_location/airports.rb +200 -0
- data/lib/synthra/types/address_location/banks_hospitals.rb +207 -0
- data/lib/synthra/types/address_location/locations.rb +406 -0
- data/lib/synthra/types/base.rb +48 -0
- data/lib/synthra/types/commerce_products/commerce.rb +119 -0
- data/lib/synthra/types/commerce_products/companies.rb +71 -0
- data/lib/synthra/types/commerce_products/construction.rb +126 -0
- data/lib/synthra/types/commerce_products/products.rb +205 -0
- data/lib/synthra/types/core/collections.rb +513 -0
- data/lib/synthra/types/core/defaults.rb +76 -0
- data/lib/synthra/types/core/enums.rb +102 -0
- data/lib/synthra/types/core/identifiers.rb +445 -0
- data/lib/synthra/types/core/primitives.rb +586 -0
- data/lib/synthra/types/core/references.rb +466 -0
- data/lib/synthra/types/core/sequences.rb +304 -0
- data/lib/synthra/types/crypto/crypto.rb +162 -0
- data/lib/synthra/types/date_time/dates.rb +387 -0
- data/lib/synthra/types/finance_banking/banking.rb +424 -0
- data/lib/synthra/types/finance_banking/credit_cards.rb +24 -0
- data/lib/synthra/types/finance_banking/identifiers.rb +93 -0
- data/lib/synthra/types/formula.rb +184 -0
- data/lib/synthra/types/health_medical/medical.rb +150 -0
- data/lib/synthra/types/hostile_payloads.rb +122 -0
- data/lib/synthra/types/json_array.rb +51 -0
- data/lib/synthra/types/media_entertainment/media.rb +62 -0
- data/lib/synthra/types/naughty_string.rb +30 -0
- data/lib/synthra/types/personal_names/chinese.rb +41 -0
- data/lib/synthra/types/personal_names/identifiers.rb +187 -0
- data/lib/synthra/types/personal_names/names.rb +246 -0
- data/lib/synthra/types/personal_names/national_id.rb +89 -0
- data/lib/synthra/types/personal_names/titles_suffixes.rb +41 -0
- data/lib/synthra/types/regex.rb +248 -0
- data/lib/synthra/types/registry.rb +182 -0
- data/lib/synthra/types/repeating_element.rb +50 -0
- data/lib/synthra/types/scenario.rb +29 -0
- data/lib/synthra/types/technology_internet/apps.rb +67 -0
- data/lib/synthra/types/technology_internet/communication.rb +162 -0
- data/lib/synthra/types/technology_internet/devices.rb +80 -0
- data/lib/synthra/types/technology_internet/formats.rb +139 -0
- data/lib/synthra/types/technology_internet/networking.rb +143 -0
- data/lib/synthra/types/template.rb +92 -0
- data/lib/synthra/types/text_content/business.rb +128 -0
- data/lib/synthra/types/text_content/colors.rb +70 -0
- data/lib/synthra/types/text_content/misc.rb +237 -0
- data/lib/synthra/types/text_content/security.rb +130 -0
- data/lib/synthra/types/text_content/text_generation.rb +532 -0
- data/lib/synthra/types/travel/travel.rb +150 -0
- data/lib/synthra/utils/string_distance.rb +133 -0
- data/lib/synthra/validator/dsl_validator.rb +339 -0
- data/lib/synthra/validator/path_validator.rb +615 -0
- data/lib/synthra/version.rb +35 -0
- data/lib/synthra/webhook_simulator.rb +341 -0
- data/lib/synthra.rb +259 -0
- data/schemas/address.dsl +16 -0
- data/schemas/api_response.dsl +8 -0
- data/schemas/error_payload.dsl +9 -0
- data/schemas/order.dsl +10 -0
- data/schemas/order_item.dsl +8 -0
- data/schemas/payment.dsl +11 -0
- data/schemas/social_post.dsl +13 -0
- data/schemas/user.dsl +10 -0
- data/scripts/batch_fix_all.rb +96 -0
- data/scripts/delete_old_files.rb +32 -0
- data/scripts/fix_all_grouped_files.rb +137 -0
- data/scripts/fix_all_indentation.rb +48 -0
- data/scripts/fix_all_syntax.rb +124 -0
- data/scripts/fix_grouped_files.rb +184 -0
- data/scripts/fix_syntax_errors.rb +108 -0
- data/scripts/group_domain_types.rb +112 -0
- data/scripts/group_domain_types_fixed.rb +150 -0
- data/scripts/merge_domains_to_one_file.rb +68 -0
- data/scripts/move_existing_types.rb +130 -0
- data/scripts/split_grouped_types.rb +142 -0
- data/tech_docs/README.md +134 -0
- data/tech_docs/advanced/streaming.md +405 -0
- data/tech_docs/advanced/thread_safety.md +253 -0
- data/tech_docs/api/overview.md +485 -0
- data/tech_docs/appendices/type_chart.md +193 -0
- data/tech_docs/basic_concepts.md +383 -0
- data/tech_docs/behaviors/overview.md +346 -0
- data/tech_docs/dsl/complex_types.md +790 -0
- data/tech_docs/dsl/core_types.md +464 -0
- data/tech_docs/dsl/datetime_types.md +325 -0
- data/tech_docs/dsl/field_modifiers.md +414 -0
- data/tech_docs/dsl/grammar.md +431 -0
- data/tech_docs/dsl/schema_definition.md +399 -0
- data/tech_docs/export/README.md +276 -0
- data/tech_docs/installation.md +273 -0
- data/tech_docs/integration/ci_cd.md +707 -0
- data/tech_docs/integration/ci_cd_guide.md +579 -0
- data/tech_docs/integration/factory_bot.md +485 -0
- data/tech_docs/integration/rails.md +630 -0
- data/tech_docs/integration/rspec.md +449 -0
- data/tech_docs/modes/overview.md +350 -0
- data/tech_docs/performance/NATIVE_RUST_EXTENSION.md +1270 -0
- data/tech_docs/performance/OPTIMIZATION_GUIDE.md +901 -0
- data/tech_docs/quick_start.md +256 -0
- data/tech_docs/templates/README.md +805 -0
- data/tech_docs/tutorials/advanced.md +371 -0
- data/tech_docs/tutorials/getting_started.md +189 -0
- data/tech_docs/tutorials/intermediate.md +231 -0
- data/tech_docs/tutorials/template_gallery.md +569 -0
- data/tech_example/01_basic_usage.rb +238 -0
- data/tech_example/02_types_demo.rb +336 -0
- data/tech_example/04_cli_usage.md +429 -0
- data/tech_example/05_database_seeding.rb +283 -0
- data/tech_example/07_rspec_integration.rb +359 -0
- data/tech_example/10_custom_types.rb +387 -0
- data/tech_example/12_behaviors.rb +372 -0
- data/tech_example/13_twitter_dm_example.rb +120 -0
- data/tech_example/14_exact_json_structure.rb +253 -0
- data/tech_example/16_lsp_server.rb +56 -0
- data/tech_example/17_property_testing.rb +92 -0
- data/tech_example/18_enhanced_repl.rb +120 -0
- data/tech_example/19_security_fuzzing.rb +145 -0
- data/tech_example/NEW_FEATURES.md +169 -0
- data/tech_example/README.md +118 -0
- data/tech_example/schemas/api_response.dsl +123 -0
- data/tech_example/schemas/ecommerce.dsl +121 -0
- data/tech_example/schemas/twitter_dm.dsl +109 -0
- data/tech_example/schemas/user.dsl +36 -0
- data/vscode-extension/README.md +246 -0
- data/vscode-extension/language-configuration.json +31 -0
- data/vscode-extension/package.json +55 -0
- data/vscode-extension/snippets/fakedatadsl.json +198 -0
- data/vscode-extension/syntaxes/fakedatadsl.tmLanguage.json +128 -0
- 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
|