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
data/docs/API_SERVER.md
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# Production API Server
|
|
2
|
+
|
|
3
|
+
FakeDataDSL includes a **production-ready REST API server** for data generation. Use it as the core of your data generation platform.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Start server with default settings
|
|
9
|
+
fake_data_dsl server schemas/ --port 3000
|
|
10
|
+
|
|
11
|
+
# Start with authentication
|
|
12
|
+
fake_data_dsl server schemas/ --port 3000 --api-key secret123
|
|
13
|
+
|
|
14
|
+
# Production mode with rate limiting
|
|
15
|
+
fake_data_dsl server schemas/ --port 3000 --env production --rate-limit 100
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## CLI Options
|
|
19
|
+
|
|
20
|
+
| Option | Description | Default |
|
|
21
|
+
|--------|-------------|---------|
|
|
22
|
+
| `-d, --dir DIR` | Schema directory | Required |
|
|
23
|
+
| `-p, --port PORT` | Server port | 3000 |
|
|
24
|
+
| `-h, --host HOST` | Bind address | 0.0.0.0 |
|
|
25
|
+
| `-e, --env ENV` | Environment | development |
|
|
26
|
+
| `--no-cors` | Disable CORS | CORS enabled |
|
|
27
|
+
| `--rate-limit N` | Requests/minute | 0 (unlimited) |
|
|
28
|
+
| `--api-key KEY` | Require API key | None |
|
|
29
|
+
|
|
30
|
+
## API Endpoints
|
|
31
|
+
|
|
32
|
+
### List Schemas
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
GET /api/schemas
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Response:
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"schemas": [
|
|
42
|
+
{ "name": "User", "fields": 5, "endpoint": "/api/user" },
|
|
43
|
+
{ "name": "Order", "fields": 8, "endpoint": "/api/order" }
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Generate Single Record
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
GET /api/:schema?seed=42&mode=random
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Query Parameters:
|
|
55
|
+
- `seed` - Random seed for deterministic output
|
|
56
|
+
- `mode` - Generation mode: random, edge, invalid, hostile, mixed
|
|
57
|
+
|
|
58
|
+
Response:
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
62
|
+
"name": "John Doe",
|
|
63
|
+
"email": "john@example.com"
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Generate Batch
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
GET /api/:schema/batch?count=100&seed=42
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Response:
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"data": [...],
|
|
77
|
+
"meta": {
|
|
78
|
+
"count": 100,
|
|
79
|
+
"schema": "User",
|
|
80
|
+
"seed": 42,
|
|
81
|
+
"mode": "random"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Stream Records
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
GET /api/:schema/stream?count=1000
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Returns NDJSON (newline-delimited JSON) for streaming:
|
|
93
|
+
```
|
|
94
|
+
{"id":"...","name":"John"}
|
|
95
|
+
{"id":"...","name":"Jane"}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Generate with Overrides
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
POST /api/:schema
|
|
102
|
+
Content-Type: application/json
|
|
103
|
+
|
|
104
|
+
{
|
|
105
|
+
"count": 10,
|
|
106
|
+
"seed": 42,
|
|
107
|
+
"mode": "random",
|
|
108
|
+
"overrides": {
|
|
109
|
+
"role": "admin",
|
|
110
|
+
"active": true
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Get Schema Info
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
GET /api/:schema/schema
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Export OpenAPI/Protobuf
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
GET /api/:schema/openapi
|
|
125
|
+
GET /api/:schema/protobuf
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Ruby API
|
|
129
|
+
|
|
130
|
+
```ruby
|
|
131
|
+
require 'fake_data_dsl'
|
|
132
|
+
|
|
133
|
+
# Start server
|
|
134
|
+
FakeDataDSL::APIServer.start(
|
|
135
|
+
schema_dir: "schemas/",
|
|
136
|
+
port: 3000,
|
|
137
|
+
host: "0.0.0.0",
|
|
138
|
+
environment: :production,
|
|
139
|
+
cors: true,
|
|
140
|
+
rate_limit: 100,
|
|
141
|
+
auth: { type: :api_key, keys: ["secret123"] },
|
|
142
|
+
enable_metrics: true,
|
|
143
|
+
enable_caching: true,
|
|
144
|
+
cache_ttl: 60
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Start in background
|
|
148
|
+
thread = FakeDataDSL::APIServer.new(schema_dir: "schemas/").start_async
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Rack Integration
|
|
152
|
+
|
|
153
|
+
Deploy with Puma, Unicorn, or any Rack-compatible server:
|
|
154
|
+
|
|
155
|
+
```ruby
|
|
156
|
+
# config.ru
|
|
157
|
+
require 'fake_data_dsl'
|
|
158
|
+
|
|
159
|
+
run FakeDataDSL::APIServer.rack_app(
|
|
160
|
+
schema_dir: "schemas/",
|
|
161
|
+
auth: { type: :api_key, keys: [ENV['API_KEY']] }
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Then run:
|
|
166
|
+
```bash
|
|
167
|
+
puma config.ru -p 3000 -t 4:16
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Authentication
|
|
171
|
+
|
|
172
|
+
### API Key
|
|
173
|
+
|
|
174
|
+
```ruby
|
|
175
|
+
FakeDataDSL::APIServer.start(
|
|
176
|
+
schema_dir: "schemas/",
|
|
177
|
+
auth: { type: :api_key, keys: ["key1", "key2"] }
|
|
178
|
+
)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Clients must include:
|
|
182
|
+
```
|
|
183
|
+
X-API-Key: key1
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Bearer Token
|
|
187
|
+
|
|
188
|
+
```ruby
|
|
189
|
+
FakeDataDSL::APIServer.start(
|
|
190
|
+
schema_dir: "schemas/",
|
|
191
|
+
auth: { type: :bearer, tokens: ["token1", "token2"] }
|
|
192
|
+
)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Clients must include:
|
|
196
|
+
```
|
|
197
|
+
Authorization: Bearer token1
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Rate Limiting
|
|
201
|
+
|
|
202
|
+
```ruby
|
|
203
|
+
FakeDataDSL::APIServer.start(
|
|
204
|
+
schema_dir: "schemas/",
|
|
205
|
+
rate_limit: 100 # 100 requests per minute per IP
|
|
206
|
+
)
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
When rate limited, returns:
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"error": "Rate limit exceeded",
|
|
213
|
+
"retry_after": 45
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Metrics
|
|
218
|
+
|
|
219
|
+
Enable metrics with `enable_metrics: true`:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
GET /metrics
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Response:
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"total_requests": 1250,
|
|
229
|
+
"endpoints": [
|
|
230
|
+
{
|
|
231
|
+
"endpoint": "GET /api/user",
|
|
232
|
+
"requests": 500,
|
|
233
|
+
"errors": 2,
|
|
234
|
+
"avg_duration_ms": 15.5,
|
|
235
|
+
"p99_duration_ms": 45.2
|
|
236
|
+
}
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Configuration
|
|
242
|
+
|
|
243
|
+
All configuration options:
|
|
244
|
+
|
|
245
|
+
| Option | Type | Default | Description |
|
|
246
|
+
|--------|------|---------|-------------|
|
|
247
|
+
| `port` | Integer | 3000 | Server port |
|
|
248
|
+
| `host` | String | "0.0.0.0" | Bind address |
|
|
249
|
+
| `environment` | Symbol | :development | :development or :production |
|
|
250
|
+
| `cors` | Boolean | true | Enable CORS |
|
|
251
|
+
| `rate_limit` | Integer | 0 | Requests/minute (0=unlimited) |
|
|
252
|
+
| `max_batch_size` | Integer | 10,000 | Max records per batch |
|
|
253
|
+
| `max_stream_size` | Integer | 1,000,000 | Max streaming records |
|
|
254
|
+
| `request_timeout` | Integer | 30 | Request timeout (seconds) |
|
|
255
|
+
| `enable_metrics` | Boolean | true | Enable /metrics endpoint |
|
|
256
|
+
| `enable_caching` | Boolean | false | Enable response caching |
|
|
257
|
+
| `cache_ttl` | Integer | 60 | Cache TTL (seconds) |
|
|
258
|
+
| `auth` | Hash | nil | Authentication config |
|
|
259
|
+
|
|
260
|
+
## Docker Deployment
|
|
261
|
+
|
|
262
|
+
```dockerfile
|
|
263
|
+
FROM ruby:3.2
|
|
264
|
+
|
|
265
|
+
WORKDIR /app
|
|
266
|
+
COPY Gemfile* ./
|
|
267
|
+
RUN bundle install
|
|
268
|
+
COPY schemas/ ./schemas/
|
|
269
|
+
|
|
270
|
+
EXPOSE 3000
|
|
271
|
+
|
|
272
|
+
CMD ["fake_data_dsl", "server", "schemas/", "--port", "3000", "--env", "production"]
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
docker build -t fake-data-api .
|
|
277
|
+
docker run -p 3000:3000 fake-data-api
|
|
278
|
+
```
|
data/docs/CONFIG_FILE.md
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# Configuration File Guide
|
|
2
|
+
|
|
3
|
+
FakeDataDSL supports YAML configuration files following Rails conventions. This allows you to configure the gem without code changes and have environment-specific settings.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
Create `config/fake_data_dsl.yml`:
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
default_mode: random
|
|
11
|
+
max_unique_retries: 1000
|
|
12
|
+
|
|
13
|
+
limits:
|
|
14
|
+
max_array_size: 100
|
|
15
|
+
max_recursion: 5
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The configuration is automatically loaded when FakeDataDSL initializes.
|
|
19
|
+
|
|
20
|
+
## File Locations
|
|
21
|
+
|
|
22
|
+
FakeDataDSL searches for configuration files in this order:
|
|
23
|
+
|
|
24
|
+
1. `config/fake_data_dsl.yml` (Rails convention)
|
|
25
|
+
2. `fake_data_dsl.yml` (project root)
|
|
26
|
+
3. `.fake_data_dsl.yml` (hidden file)
|
|
27
|
+
|
|
28
|
+
The first file found is used.
|
|
29
|
+
|
|
30
|
+
## Configuration Options
|
|
31
|
+
|
|
32
|
+
### Core Settings
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
# Default generation mode
|
|
36
|
+
# Options: random, edge, invalid, hostile, mixed
|
|
37
|
+
default_mode: random
|
|
38
|
+
|
|
39
|
+
# Maximum retries for unique value generation
|
|
40
|
+
max_unique_retries: 1000
|
|
41
|
+
|
|
42
|
+
# Allow eval() in custom expressions (security risk!)
|
|
43
|
+
allow_eval: false
|
|
44
|
+
|
|
45
|
+
# Use FastEngine for batch generation (not thread-safe)
|
|
46
|
+
fast_mode: false
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Field Handling
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
# Probability that optional fields appear (0.0 - 1.0)
|
|
53
|
+
optional_field_presence_rate: 0.8
|
|
54
|
+
|
|
55
|
+
# Probability that nullable fields are null (0.0 - 1.0)
|
|
56
|
+
nullable_field_null_rate: 0.1
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Resource Limits
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
limits:
|
|
63
|
+
# Maximum artificial latency in milliseconds
|
|
64
|
+
max_latency_ms: 10000
|
|
65
|
+
|
|
66
|
+
# Maximum recursion depth for nested schemas
|
|
67
|
+
max_recursion: 10
|
|
68
|
+
|
|
69
|
+
# Maximum array size
|
|
70
|
+
max_array_size: 1000
|
|
71
|
+
|
|
72
|
+
# Maximum text length
|
|
73
|
+
max_text_length: 10000
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Environment-Specific Configuration
|
|
77
|
+
|
|
78
|
+
Override settings per environment:
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
# Base configuration (applies to all environments)
|
|
82
|
+
default_mode: random
|
|
83
|
+
max_unique_retries: 1000
|
|
84
|
+
|
|
85
|
+
limits:
|
|
86
|
+
max_array_size: 100
|
|
87
|
+
|
|
88
|
+
# Test environment overrides
|
|
89
|
+
test:
|
|
90
|
+
default_mode: edge # Use edge cases in tests
|
|
91
|
+
max_unique_retries: 100 # Faster test failures
|
|
92
|
+
limits:
|
|
93
|
+
max_array_size: 10 # Smaller arrays in tests
|
|
94
|
+
|
|
95
|
+
# Development environment
|
|
96
|
+
development:
|
|
97
|
+
default_mode: random
|
|
98
|
+
|
|
99
|
+
# Production environment
|
|
100
|
+
production:
|
|
101
|
+
fast_mode: true
|
|
102
|
+
limits:
|
|
103
|
+
max_array_size: 1000
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Environment Detection
|
|
107
|
+
|
|
108
|
+
FakeDataDSL detects the environment from these variables (in order):
|
|
109
|
+
|
|
110
|
+
1. `RAILS_ENV`
|
|
111
|
+
2. `RACK_ENV`
|
|
112
|
+
3. `FAKE_DATA_DSL_ENV`
|
|
113
|
+
4. Default: `"development"`
|
|
114
|
+
|
|
115
|
+
## Manual Configuration
|
|
116
|
+
|
|
117
|
+
### Load from Custom Path
|
|
118
|
+
|
|
119
|
+
```ruby
|
|
120
|
+
# Load specific file
|
|
121
|
+
FakeDataDSL::ConfigFile.load_and_apply("custom/path/config.yml")
|
|
122
|
+
|
|
123
|
+
# Load with specific environment
|
|
124
|
+
FakeDataDSL::ConfigFile.load_and_apply("config.yml", env: "staging")
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Load Without Applying
|
|
128
|
+
|
|
129
|
+
```ruby
|
|
130
|
+
# Just load the config hash
|
|
131
|
+
config = FakeDataDSL::ConfigFile.load("config.yml", env: "test")
|
|
132
|
+
puts config["default_mode"] # => "edge"
|
|
133
|
+
|
|
134
|
+
# Apply later
|
|
135
|
+
FakeDataDSL::ConfigFile.apply(config)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Check Config File Location
|
|
139
|
+
|
|
140
|
+
```ruby
|
|
141
|
+
path = FakeDataDSL::ConfigFile.find_config_file
|
|
142
|
+
puts "Using config: #{path || 'none found'}"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Complete Example
|
|
146
|
+
|
|
147
|
+
```yaml
|
|
148
|
+
# config/fake_data_dsl.yml
|
|
149
|
+
|
|
150
|
+
# =========================================
|
|
151
|
+
# Base Configuration (all environments)
|
|
152
|
+
# =========================================
|
|
153
|
+
|
|
154
|
+
# Generation settings
|
|
155
|
+
default_mode: random
|
|
156
|
+
max_unique_retries: 1000
|
|
157
|
+
|
|
158
|
+
# Field behavior
|
|
159
|
+
optional_field_presence_rate: 0.8
|
|
160
|
+
nullable_field_null_rate: 0.1
|
|
161
|
+
|
|
162
|
+
# Resource limits
|
|
163
|
+
limits:
|
|
164
|
+
max_latency_ms: 10000
|
|
165
|
+
max_recursion: 10
|
|
166
|
+
max_array_size: 100
|
|
167
|
+
max_text_length: 10000
|
|
168
|
+
|
|
169
|
+
# =========================================
|
|
170
|
+
# Test Environment
|
|
171
|
+
# =========================================
|
|
172
|
+
test:
|
|
173
|
+
# Deterministic for reproducible tests
|
|
174
|
+
default_mode: random
|
|
175
|
+
|
|
176
|
+
# Fail fast on uniqueness issues
|
|
177
|
+
max_unique_retries: 50
|
|
178
|
+
|
|
179
|
+
# Smaller data for faster tests
|
|
180
|
+
limits:
|
|
181
|
+
max_array_size: 5
|
|
182
|
+
max_text_length: 100
|
|
183
|
+
|
|
184
|
+
# =========================================
|
|
185
|
+
# Development Environment
|
|
186
|
+
# =========================================
|
|
187
|
+
development:
|
|
188
|
+
# More realistic data
|
|
189
|
+
default_mode: random
|
|
190
|
+
|
|
191
|
+
# Allow more retries during development
|
|
192
|
+
max_unique_retries: 2000
|
|
193
|
+
|
|
194
|
+
# =========================================
|
|
195
|
+
# CI Environment
|
|
196
|
+
# =========================================
|
|
197
|
+
ci:
|
|
198
|
+
# Test edge cases in CI
|
|
199
|
+
default_mode: mixed
|
|
200
|
+
|
|
201
|
+
# Strict limits
|
|
202
|
+
limits:
|
|
203
|
+
max_recursion: 5
|
|
204
|
+
max_array_size: 50
|
|
205
|
+
|
|
206
|
+
# =========================================
|
|
207
|
+
# Production Environment
|
|
208
|
+
# =========================================
|
|
209
|
+
production:
|
|
210
|
+
# Maximum performance
|
|
211
|
+
fast_mode: true
|
|
212
|
+
|
|
213
|
+
# Higher limits for bulk operations
|
|
214
|
+
limits:
|
|
215
|
+
max_array_size: 10000
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Programmatic Configuration
|
|
219
|
+
|
|
220
|
+
You can still configure FakeDataDSL programmatically, which takes precedence over file config:
|
|
221
|
+
|
|
222
|
+
```ruby
|
|
223
|
+
# File config is loaded first, then this overrides
|
|
224
|
+
FakeDataDSL.configure do |config|
|
|
225
|
+
config.default_mode = :edge
|
|
226
|
+
config.limits.max_array_size = 50
|
|
227
|
+
end
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Disabling Auto-Loading
|
|
231
|
+
|
|
232
|
+
To prevent automatic config file loading:
|
|
233
|
+
|
|
234
|
+
```ruby
|
|
235
|
+
# Set before requiring the gem
|
|
236
|
+
ENV['FAKE_DATA_DSL_SKIP_CONFIG'] = 'true'
|
|
237
|
+
require 'fake_data_dsl'
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Or remove/rename the config file.
|
|
241
|
+
|
|
242
|
+
## Best Practices
|
|
243
|
+
|
|
244
|
+
### 1. Version Control Your Config
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
git add config/fake_data_dsl.yml
|
|
248
|
+
git commit -m "Add FakeDataDSL configuration"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 2. Document Environment Differences
|
|
252
|
+
|
|
253
|
+
```yaml
|
|
254
|
+
# Test: Fast, small datasets, edge cases
|
|
255
|
+
test:
|
|
256
|
+
max_unique_retries: 50 # Fail fast
|
|
257
|
+
limits:
|
|
258
|
+
max_array_size: 5 # Faster tests
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 3. Use Sensible Defaults
|
|
262
|
+
|
|
263
|
+
Don't over-configure. The defaults are designed for common use cases.
|
|
264
|
+
|
|
265
|
+
### 4. Keep Secrets Out
|
|
266
|
+
|
|
267
|
+
Config files shouldn't contain secrets. Use environment variables if needed:
|
|
268
|
+
|
|
269
|
+
```ruby
|
|
270
|
+
# In code, not in config file
|
|
271
|
+
FakeDataDSL.configure do |config|
|
|
272
|
+
config.api_key = ENV['FAKE_DATA_API_KEY']
|
|
273
|
+
end
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Troubleshooting
|
|
277
|
+
|
|
278
|
+
### Config Not Loading
|
|
279
|
+
|
|
280
|
+
```ruby
|
|
281
|
+
# Check if config file was found
|
|
282
|
+
puts FakeDataDSL::ConfigFile.find_config_file
|
|
283
|
+
# => nil means no config file found
|
|
284
|
+
|
|
285
|
+
# Check current configuration
|
|
286
|
+
puts FakeDataDSL.configuration.default_mode
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Wrong Environment
|
|
290
|
+
|
|
291
|
+
```ruby
|
|
292
|
+
# Check detected environment
|
|
293
|
+
puts ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
|
|
294
|
+
|
|
295
|
+
# Force specific environment
|
|
296
|
+
FakeDataDSL::ConfigFile.load_and_apply(env: "production")
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Invalid YAML
|
|
300
|
+
|
|
301
|
+
```yaml
|
|
302
|
+
# Bad: Tabs instead of spaces
|
|
303
|
+
limits:
|
|
304
|
+
max_array_size: 100 # Tab character causes error
|
|
305
|
+
|
|
306
|
+
# Good: Use spaces
|
|
307
|
+
limits:
|
|
308
|
+
max_array_size: 100 # Spaces work
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## See Also
|
|
312
|
+
|
|
313
|
+
- [Quick Start Guide](../tech_docs/quick_start.md)
|
|
314
|
+
- [Configuration API](../tech_docs/api/overview.md)
|
|
315
|
+
- [Resource Limits](../tech_docs/performance/resource_limits.md)
|