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,252 @@
|
|
|
1
|
+
# OpenAPI Export
|
|
2
|
+
|
|
3
|
+
Export your FakeDataDSL schemas to **OpenAPI 3.0 specifications** for API documentation and client generation.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Export as YAML
|
|
9
|
+
fake_data_dsl export --all -d schemas/ -f openapi -o api.yaml
|
|
10
|
+
|
|
11
|
+
# Export as JSON
|
|
12
|
+
fake_data_dsl export --all -d schemas/ -f openapi -o api.json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Generated Specification
|
|
16
|
+
|
|
17
|
+
The exporter generates a complete OpenAPI 3.0 spec with:
|
|
18
|
+
|
|
19
|
+
- **Info section** - API title, version, description
|
|
20
|
+
- **Server definitions** - Base URLs
|
|
21
|
+
- **Tags** - One per schema for organization
|
|
22
|
+
- **Paths** - CRUD + generation endpoints
|
|
23
|
+
- **Components/Schemas** - Full schema definitions
|
|
24
|
+
- **Parameters** - Reusable query parameters
|
|
25
|
+
|
|
26
|
+
## API Endpoints Generated
|
|
27
|
+
|
|
28
|
+
For each schema (e.g., `User`):
|
|
29
|
+
|
|
30
|
+
| Method | Path | Description |
|
|
31
|
+
|--------|------|-------------|
|
|
32
|
+
| GET | `/api/user` | Generate single record |
|
|
33
|
+
| GET | `/api/user/batch` | Generate multiple records |
|
|
34
|
+
| GET | `/api/user/stream` | Stream records (NDJSON) |
|
|
35
|
+
| POST | `/api/user` | Generate with overrides |
|
|
36
|
+
| GET | `/api/user/schema` | Get schema definition |
|
|
37
|
+
|
|
38
|
+
Plus:
|
|
39
|
+
- `GET /api/schemas` - List all schemas
|
|
40
|
+
|
|
41
|
+
## Ruby API
|
|
42
|
+
|
|
43
|
+
### Basic Export
|
|
44
|
+
|
|
45
|
+
```ruby
|
|
46
|
+
exporter = FakeDataDSL::Export::OpenAPI.new(registry)
|
|
47
|
+
yaml_spec = exporter.export
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Custom Options
|
|
51
|
+
|
|
52
|
+
```ruby
|
|
53
|
+
exporter = FakeDataDSL::Export::OpenAPI.new(
|
|
54
|
+
registry,
|
|
55
|
+
title: "My Data Generation API",
|
|
56
|
+
version: "2.0.0",
|
|
57
|
+
description: "API for generating test data",
|
|
58
|
+
server_url: "https://api.example.com",
|
|
59
|
+
format: :yaml
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
spec = exporter.export
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Export Formats
|
|
66
|
+
|
|
67
|
+
```ruby
|
|
68
|
+
# YAML (default)
|
|
69
|
+
yaml = exporter.export_as(:yaml)
|
|
70
|
+
|
|
71
|
+
# JSON
|
|
72
|
+
json = exporter.export_as(:json)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Configuration Options
|
|
76
|
+
|
|
77
|
+
| Option | Type | Default | Description |
|
|
78
|
+
|--------|------|---------|-------------|
|
|
79
|
+
| `title` | String | "FakeDataDSL Data Generation API" | API title |
|
|
80
|
+
| `version` | String | "1.0.0" | API version |
|
|
81
|
+
| `description` | String | "API for generating fake data" | API description |
|
|
82
|
+
| `server_url` | String | "http://localhost:3000" | Base server URL |
|
|
83
|
+
| `format` | Symbol | :yaml | Output format (:yaml or :json) |
|
|
84
|
+
|
|
85
|
+
## Type Mapping
|
|
86
|
+
|
|
87
|
+
| FakeDataDSL | OpenAPI |
|
|
88
|
+
|-------------|---------|
|
|
89
|
+
| `text`, `name`, etc. | `string` |
|
|
90
|
+
| `email` | `string`, format: "email" |
|
|
91
|
+
| `url` | `string`, format: "uri" |
|
|
92
|
+
| `uuid` | `string`, format: "uuid" |
|
|
93
|
+
| `date` | `string`, format: "date" |
|
|
94
|
+
| `timestamp`, `datetime` | `string`, format: "date-time" |
|
|
95
|
+
| `password` | `string`, format: "password" |
|
|
96
|
+
| `ip` | `string`, format: "ipv4" |
|
|
97
|
+
| `ipv6` | `string`, format: "ipv6" |
|
|
98
|
+
| `number`, `integer` | `integer`, format: "int64" |
|
|
99
|
+
| `float` | `number`, format: "double" |
|
|
100
|
+
| `boolean` | `boolean` |
|
|
101
|
+
| `binary` | `string`, format: "binary" |
|
|
102
|
+
| `array(T)` | `array`, items: T |
|
|
103
|
+
| `enum(a, b)` | `string`, enum: ["a", "b"] |
|
|
104
|
+
|
|
105
|
+
## Example Output
|
|
106
|
+
|
|
107
|
+
```yaml
|
|
108
|
+
openapi: "3.0.3"
|
|
109
|
+
info:
|
|
110
|
+
title: FakeDataDSL Data Generation API
|
|
111
|
+
version: "1.0.0"
|
|
112
|
+
description: API for generating fake data from schemas
|
|
113
|
+
contact:
|
|
114
|
+
name: FakeDataDSL
|
|
115
|
+
url: https://github.com/talaatmagdyx/fake_data_dsl
|
|
116
|
+
|
|
117
|
+
servers:
|
|
118
|
+
- url: http://localhost:3000
|
|
119
|
+
description: Data Generation Server
|
|
120
|
+
|
|
121
|
+
tags:
|
|
122
|
+
- name: User
|
|
123
|
+
description: Operations for User schema
|
|
124
|
+
|
|
125
|
+
paths:
|
|
126
|
+
/api/schemas:
|
|
127
|
+
get:
|
|
128
|
+
tags: [Schemas]
|
|
129
|
+
summary: List all available schemas
|
|
130
|
+
responses:
|
|
131
|
+
"200":
|
|
132
|
+
description: List of schema names
|
|
133
|
+
content:
|
|
134
|
+
application/json:
|
|
135
|
+
schema:
|
|
136
|
+
type: object
|
|
137
|
+
properties:
|
|
138
|
+
schemas:
|
|
139
|
+
type: array
|
|
140
|
+
items:
|
|
141
|
+
type: string
|
|
142
|
+
|
|
143
|
+
/api/user:
|
|
144
|
+
get:
|
|
145
|
+
tags: [User]
|
|
146
|
+
summary: Generate a single User
|
|
147
|
+
parameters:
|
|
148
|
+
- name: seed
|
|
149
|
+
in: query
|
|
150
|
+
description: Random seed for deterministic generation
|
|
151
|
+
schema:
|
|
152
|
+
type: integer
|
|
153
|
+
- name: mode
|
|
154
|
+
in: query
|
|
155
|
+
description: Generation mode
|
|
156
|
+
schema:
|
|
157
|
+
type: string
|
|
158
|
+
enum: [random, edge, invalid, hostile, mixed]
|
|
159
|
+
responses:
|
|
160
|
+
"200":
|
|
161
|
+
description: Generated User
|
|
162
|
+
content:
|
|
163
|
+
application/json:
|
|
164
|
+
schema:
|
|
165
|
+
$ref: "#/components/schemas/User"
|
|
166
|
+
|
|
167
|
+
components:
|
|
168
|
+
schemas:
|
|
169
|
+
User:
|
|
170
|
+
type: object
|
|
171
|
+
required: [id, name, email]
|
|
172
|
+
properties:
|
|
173
|
+
id:
|
|
174
|
+
type: string
|
|
175
|
+
format: uuid
|
|
176
|
+
name:
|
|
177
|
+
type: string
|
|
178
|
+
email:
|
|
179
|
+
type: string
|
|
180
|
+
format: email
|
|
181
|
+
age:
|
|
182
|
+
type: integer
|
|
183
|
+
format: int64
|
|
184
|
+
active:
|
|
185
|
+
type: boolean
|
|
186
|
+
role:
|
|
187
|
+
type: string
|
|
188
|
+
enum: [admin, user, moderator]
|
|
189
|
+
|
|
190
|
+
GenerationRequest:
|
|
191
|
+
type: object
|
|
192
|
+
properties:
|
|
193
|
+
count:
|
|
194
|
+
type: integer
|
|
195
|
+
default: 10
|
|
196
|
+
seed:
|
|
197
|
+
type: integer
|
|
198
|
+
mode:
|
|
199
|
+
type: string
|
|
200
|
+
enum: [random, edge, invalid, hostile, mixed]
|
|
201
|
+
overrides:
|
|
202
|
+
type: object
|
|
203
|
+
additionalProperties: true
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Using Generated Spec
|
|
207
|
+
|
|
208
|
+
### Swagger UI
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# Serve with Swagger UI
|
|
212
|
+
docker run -p 8080:8080 \
|
|
213
|
+
-e SWAGGER_JSON=/api.yaml \
|
|
214
|
+
-v ./api.yaml:/api.yaml \
|
|
215
|
+
swaggerapi/swagger-ui
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Client Generation
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# Generate TypeScript client
|
|
222
|
+
openapi-generator generate -i api.yaml -g typescript-axios -o ./client
|
|
223
|
+
|
|
224
|
+
# Generate Python client
|
|
225
|
+
openapi-generator generate -i api.yaml -g python -o ./client
|
|
226
|
+
|
|
227
|
+
# Generate Go client
|
|
228
|
+
openapi-generator generate -i api.yaml -g go -o ./client
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### API Testing
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# Import into Postman
|
|
235
|
+
# 1. Open Postman
|
|
236
|
+
# 2. Import > File > api.yaml
|
|
237
|
+
# 3. All endpoints are ready to test
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Integration with API Server
|
|
241
|
+
|
|
242
|
+
The OpenAPI export matches the API Server exactly:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# Start server
|
|
246
|
+
fake_data_dsl server schemas/ --port 3000
|
|
247
|
+
|
|
248
|
+
# Export matching spec
|
|
249
|
+
fake_data_dsl export --all -d schemas/ -f openapi -o api.yaml
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
The generated spec documents exactly what the server provides.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Performance Mode
|
|
2
|
+
|
|
3
|
+
Generate **millions of records** with parallel processing, streaming, and optimized memory usage.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Generate 1 million records to file
|
|
9
|
+
fake_data_dsl perf User -d schemas/ -c 1000000 -o users.ndjson
|
|
10
|
+
|
|
11
|
+
# CSV format
|
|
12
|
+
fake_data_dsl perf User -d schemas/ -c 1000000 -f csv -o users.csv
|
|
13
|
+
|
|
14
|
+
# Benchmark mode
|
|
15
|
+
fake_data_dsl perf User -d schemas/ --benchmark
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## CLI Options
|
|
19
|
+
|
|
20
|
+
| Option | Description | Default |
|
|
21
|
+
|--------|-------------|---------|
|
|
22
|
+
| `-d, --dir DIR` | Schema directory | "." |
|
|
23
|
+
| `-c, --count N` | Number of records | 100,000 |
|
|
24
|
+
| `-o, --output FILE` | Output file | stdout |
|
|
25
|
+
| `-f, --format FMT` | Format: ndjson, json, csv | ndjson |
|
|
26
|
+
| `-s, --seed N` | Random seed | random |
|
|
27
|
+
| `-m, --mode MODE` | Generation mode | random |
|
|
28
|
+
| `-b, --benchmark` | Run benchmark | false |
|
|
29
|
+
|
|
30
|
+
## Ruby API
|
|
31
|
+
|
|
32
|
+
### Basic Generation
|
|
33
|
+
|
|
34
|
+
```ruby
|
|
35
|
+
# Generate records in parallel
|
|
36
|
+
records = FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### With Progress Callback
|
|
40
|
+
|
|
41
|
+
```ruby
|
|
42
|
+
FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000) do |progress|
|
|
43
|
+
puts "#{progress[:current]} / #{progress[:total]}"
|
|
44
|
+
puts "Rate: #{progress[:rate]} rec/s"
|
|
45
|
+
puts "ETA: #{progress[:eta]}s"
|
|
46
|
+
end
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Progress hash contains:
|
|
50
|
+
- `current` - Records generated so far
|
|
51
|
+
- `total` - Total records to generate
|
|
52
|
+
- `percent` - Completion percentage
|
|
53
|
+
- `rate` - Records per second
|
|
54
|
+
- `elapsed` - Elapsed time (seconds)
|
|
55
|
+
- `eta` - Estimated time remaining (seconds)
|
|
56
|
+
|
|
57
|
+
### Streaming
|
|
58
|
+
|
|
59
|
+
Stream records without loading all into memory:
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
stream = FakeDataDSL::PerformanceMode.stream(schema, count: 10_000_000)
|
|
63
|
+
|
|
64
|
+
stream.each do |record|
|
|
65
|
+
# Process one record at a time
|
|
66
|
+
process(record)
|
|
67
|
+
end
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### File Output
|
|
71
|
+
|
|
72
|
+
Write directly to file with streaming:
|
|
73
|
+
|
|
74
|
+
```ruby
|
|
75
|
+
result = FakeDataDSL::PerformanceMode.to_file(
|
|
76
|
+
schema,
|
|
77
|
+
count: 10_000_000,
|
|
78
|
+
output: "users.ndjson",
|
|
79
|
+
format: :ndjson,
|
|
80
|
+
seed: 42,
|
|
81
|
+
mode: :random
|
|
82
|
+
) do |progress|
|
|
83
|
+
puts "#{progress[:percent]}% - #{progress[:rate]} rec/s - ETA: #{progress[:eta]}s"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
puts "Generated #{result[:records]} in #{result[:elapsed]}s"
|
|
87
|
+
puts "Rate: #{result[:rate]} records/second"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Supported formats:
|
|
91
|
+
- `:ndjson` - Newline-delimited JSON (default, best for streaming)
|
|
92
|
+
- `:json` - JSON array
|
|
93
|
+
- `:csv` - CSV with headers
|
|
94
|
+
|
|
95
|
+
### Benchmarking
|
|
96
|
+
|
|
97
|
+
```ruby
|
|
98
|
+
results = FakeDataDSL::PerformanceMode.benchmark(
|
|
99
|
+
schema,
|
|
100
|
+
counts: [1_000, 10_000, 100_000, 1_000_000]
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
results.each do |count, metrics|
|
|
104
|
+
puts "#{count} records:"
|
|
105
|
+
puts " Time: #{metrics[:elapsed]}s"
|
|
106
|
+
puts " Rate: #{metrics[:rate]} rec/s"
|
|
107
|
+
puts " Memory: #{metrics[:memory_mb]} MB"
|
|
108
|
+
end
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### System Info
|
|
112
|
+
|
|
113
|
+
Check system capabilities:
|
|
114
|
+
|
|
115
|
+
```ruby
|
|
116
|
+
info = FakeDataDSL::PerformanceMode.system_info
|
|
117
|
+
|
|
118
|
+
puts "CPU cores: #{info[:cpu_cores]}"
|
|
119
|
+
puts "Optimal threads: #{info[:optimal_threads]}"
|
|
120
|
+
puts "Native engine: #{info[:native_available]}"
|
|
121
|
+
puts "Recommended batch: #{info[:recommended_batch_size]}"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Configuration
|
|
125
|
+
|
|
126
|
+
Customize generation behavior:
|
|
127
|
+
|
|
128
|
+
```ruby
|
|
129
|
+
records = FakeDataDSL::PerformanceMode.generate(
|
|
130
|
+
schema,
|
|
131
|
+
count: 1_000_000,
|
|
132
|
+
batch_size: 10_000, # Records per batch
|
|
133
|
+
threads: 4, # Parallel threads (nil = auto)
|
|
134
|
+
memory_limit_mb: 512, # Max memory per batch
|
|
135
|
+
use_native: true, # Use Rust engine if available
|
|
136
|
+
progress_interval: 100_000, # Report every N records
|
|
137
|
+
gc_interval: 500_000, # Force GC every N records
|
|
138
|
+
seed: 42, # Random seed
|
|
139
|
+
mode: :random # Generation mode
|
|
140
|
+
)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Performance Tips
|
|
144
|
+
|
|
145
|
+
### 1. Use NDJSON for Large Datasets
|
|
146
|
+
|
|
147
|
+
NDJSON streams records one at a time, minimizing memory:
|
|
148
|
+
|
|
149
|
+
```ruby
|
|
150
|
+
FakeDataDSL::PerformanceMode.to_file(schema, count: 10_000_000, format: :ndjson, ...)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 2. Tune Batch Size
|
|
154
|
+
|
|
155
|
+
Larger batches = faster, but more memory:
|
|
156
|
+
|
|
157
|
+
```ruby
|
|
158
|
+
# For machines with lots of RAM
|
|
159
|
+
FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000, batch_size: 50_000)
|
|
160
|
+
|
|
161
|
+
# For limited memory
|
|
162
|
+
FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000, batch_size: 1_000)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 3. Enable Native Engine
|
|
166
|
+
|
|
167
|
+
The Rust native engine provides 3-4x performance:
|
|
168
|
+
|
|
169
|
+
```ruby
|
|
170
|
+
# Check if available
|
|
171
|
+
FakeDataDSL::PerformanceMode.system_info[:native_available]
|
|
172
|
+
|
|
173
|
+
# Force native engine
|
|
174
|
+
FakeDataDSL::PerformanceMode.generate(schema, count: 1_000_000, use_native: true)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 4. Adjust Thread Count
|
|
178
|
+
|
|
179
|
+
```ruby
|
|
180
|
+
# Use all CPU cores
|
|
181
|
+
FakeDataDSL::PerformanceMode.generate(
|
|
182
|
+
schema,
|
|
183
|
+
count: 1_000_000,
|
|
184
|
+
threads: Etc.nprocessors
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
# Leave one core for other work
|
|
188
|
+
FakeDataDSL::PerformanceMode.generate(
|
|
189
|
+
schema,
|
|
190
|
+
count: 1_000_000,
|
|
191
|
+
threads: Etc.nprocessors - 1
|
|
192
|
+
)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 5. Disable Observability for Speed
|
|
196
|
+
|
|
197
|
+
```ruby
|
|
198
|
+
FakeDataDSL.configure do |config|
|
|
199
|
+
config.metrics_collector = nil
|
|
200
|
+
config.logger = nil
|
|
201
|
+
config.on_field_generated = nil
|
|
202
|
+
end
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Benchmarks
|
|
206
|
+
|
|
207
|
+
Typical performance on modern hardware:
|
|
208
|
+
|
|
209
|
+
| Records | NDJSON | JSON | CSV |
|
|
210
|
+
|---------|--------|------|-----|
|
|
211
|
+
| 10K | 0.2s | 0.3s | 0.2s |
|
|
212
|
+
| 100K | 1.5s | 2.0s | 1.8s |
|
|
213
|
+
| 1M | 12s | 18s | 15s |
|
|
214
|
+
| 10M | 120s | 180s | 150s |
|
|
215
|
+
|
|
216
|
+
*Results vary based on schema complexity and hardware.*
|
|
217
|
+
|
|
218
|
+
## Memory Usage
|
|
219
|
+
|
|
220
|
+
Approximate memory requirements:
|
|
221
|
+
|
|
222
|
+
| Records | Stream Mode | Batch Mode |
|
|
223
|
+
|---------|-------------|------------|
|
|
224
|
+
| 100K | ~50 MB | ~100 MB |
|
|
225
|
+
| 1M | ~50 MB | ~1 GB |
|
|
226
|
+
| 10M | ~50 MB | ~10 GB |
|
|
227
|
+
|
|
228
|
+
Stream mode maintains constant memory regardless of total count.
|