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,193 @@
|
|
|
1
|
+
# Type Reference Chart
|
|
2
|
+
|
|
3
|
+
Quick reference for all available types in FakeDataDSL.
|
|
4
|
+
|
|
5
|
+
## Identifier Types
|
|
6
|
+
|
|
7
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
8
|
+
|------|-------------|-----------|----------------|--------------|
|
|
9
|
+
| `uuid` | UUID v4/v6/v7 | `version: 4\|6\|7`, `unique: true` | `"550e8400-e29b-41d4-a716-446655440000"` | `"00000000-0000-0000-0000-000000000000"` |
|
|
10
|
+
| `ulid` | ULID | - | `"01ARZ3NDEKTSV4RRFQ69G5FAV"` | `"00000000000000000000000000"` |
|
|
11
|
+
| `id_sequence` | Auto-increment | `start: N`, `step: N` | `1`, `2`, `3`... | Same as random |
|
|
12
|
+
|
|
13
|
+
## Personal Data Types
|
|
14
|
+
|
|
15
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
16
|
+
|------|-------------|-----------|----------------|--------------|
|
|
17
|
+
| `name` | Full name | - | `"John Smith"` | `""`, `"X"` |
|
|
18
|
+
| `first_name` | First name | - | `"John"` | `""` |
|
|
19
|
+
| `last_name` | Last name | - | `"Smith"` | `""` |
|
|
20
|
+
| `email` | Email address | `unique: true` | `"john@example.com"` | `"a@b.c"` |
|
|
21
|
+
| `phone` | Phone number | `locale: XX` | `"+1-555-123-4567"` | `""` |
|
|
22
|
+
| `username` | Username | - | `"john_smith42"` | `""`, `"x"` |
|
|
23
|
+
| `avatar` | Avatar URL | - | `"https://example.com/avatar.jpg"` | `""` |
|
|
24
|
+
|
|
25
|
+
## Text Types
|
|
26
|
+
|
|
27
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
28
|
+
|------|-------------|-----------|----------------|--------------|
|
|
29
|
+
| `text` | Random text | `min..max`, `length: N` | `"Lorem ipsum..."` | `""`, max length |
|
|
30
|
+
| `paragraph` | Paragraph(s) | `count: N` | Multi-sentence text | `""` |
|
|
31
|
+
| `sentence` | Sentence(s) | `count: N` | `"The quick brown fox."` | `""` |
|
|
32
|
+
| `word` | Word(s) | `count: N` | `"hello"` | `""` |
|
|
33
|
+
| `words` | Multiple words | `count: N` | `"hello world foo"` | `""` |
|
|
34
|
+
|
|
35
|
+
## Number Types
|
|
36
|
+
|
|
37
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
38
|
+
|------|-------------|-----------|----------------|--------------|
|
|
39
|
+
| `number` | Integer/float | `min..max`, `precision: N` | `42`, `3.14` | `0`, min, max |
|
|
40
|
+
| `integer` | Integer only | `min..max` | `42` | `0`, min, max |
|
|
41
|
+
| `float` | Float only | `min..max` | `42.5` | `0.0`, min, max |
|
|
42
|
+
| `latitude` | Latitude | - | `40.7128` | `-90.0`, `90.0` |
|
|
43
|
+
| `longitude` | Longitude | - | `-74.0060` | `-180.0`, `180.0` |
|
|
44
|
+
|
|
45
|
+
## Boolean & Enum
|
|
46
|
+
|
|
47
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
48
|
+
|------|-------------|-----------|----------------|--------------|
|
|
49
|
+
| `boolean` | True/false | `true:N%`, `false:N%` | `true`, `false` | `true`, `false` |
|
|
50
|
+
| `enum` | One of values | `val1, val2:N%` | `"val1"` | First, last value |
|
|
51
|
+
|
|
52
|
+
## Date & Time Types
|
|
53
|
+
|
|
54
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
55
|
+
|------|-------------|-----------|----------------|--------------|
|
|
56
|
+
| `date` | Random date | - | `"2024-06-15"` | `"1970-01-01"` |
|
|
57
|
+
| `past_date` | Past date | `Nd`, `Nm`, `Ny` | `"2024-01-15"` | Min date |
|
|
58
|
+
| `future_date` | Future date | `Nd`, `Nm`, `Ny` | `"2025-06-15"` | Max date |
|
|
59
|
+
| `timestamp` | DateTime | - | `"2024-06-15T14:30:00Z"` | Min/max timestamp |
|
|
60
|
+
| `now` | Current time | - | `"2024-07-15T10:30:00Z"` | Current time |
|
|
61
|
+
| `datetime` | DateTime range | `from:`, `to:` | `"2024-06-15T14:30:00Z"` | From/to bounds |
|
|
62
|
+
| `time` | Time only | - | `"14:30:00"` | `"00:00:00"` |
|
|
63
|
+
|
|
64
|
+
## Location Types
|
|
65
|
+
|
|
66
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
67
|
+
|------|-------------|-----------|----------------|--------------|
|
|
68
|
+
| `address` | Full address | - | `"123 Main St, City, ST 12345"` | `""` |
|
|
69
|
+
| `street_address` | Street address | - | `"123 Main Street"` | `""` |
|
|
70
|
+
| `city` | City name | - | `"New York"` | `""` |
|
|
71
|
+
| `state` | State/province | - | `"California"` | `""` |
|
|
72
|
+
| `country` | Country name | - | `"United States"` | `""` |
|
|
73
|
+
| `country_code` | ISO country code | - | `"US"` | `"XX"` |
|
|
74
|
+
| `postal_code` | ZIP/postal code | `country: XX` | `"10001"` | `"00000"` |
|
|
75
|
+
| `time_zone` | Timezone | - | `"America/New_York"` | `"UTC"` |
|
|
76
|
+
|
|
77
|
+
## Technology Types
|
|
78
|
+
|
|
79
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
80
|
+
|------|-------------|-----------|----------------|--------------|
|
|
81
|
+
| `url` | URL | - | `"https://example.com"` | `""`, long URL |
|
|
82
|
+
| `domain` | Domain name | - | `"example.com"` | `""` |
|
|
83
|
+
| `ip` | IPv4 address | - | `"192.168.1.1"` | `"0.0.0.0"` |
|
|
84
|
+
| `ipv6` | IPv6 address | - | `"2001:db8::1"` | `"::"` |
|
|
85
|
+
| `mac_address` | MAC address | - | `"00:1B:44:11:3A:B7"` | `"00:00:00:00:00:00"` |
|
|
86
|
+
| `user_agent` | User agent | - | `"Mozilla/5.0..."` | `""` |
|
|
87
|
+
|
|
88
|
+
## Finance Types
|
|
89
|
+
|
|
90
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
91
|
+
|------|-------------|-----------|----------------|--------------|
|
|
92
|
+
| `money` | Amount + currency | `range:`, `currency:` | `{"amount": 99.99, "currency": "USD"}` | Min/max |
|
|
93
|
+
| `currency` | Currency name | - | `"US Dollar"` | `""` |
|
|
94
|
+
| `currency_code` | ISO currency | - | `"USD"` | `"XXX"` |
|
|
95
|
+
| `iban` | IBAN | - | `"GB82WEST12345698765432"` | Invalid format |
|
|
96
|
+
| `credit_card` | Card number | - | `"4111111111111111"` | Test numbers |
|
|
97
|
+
| `bank_name` | Bank name | - | `"Chase"` | `""` |
|
|
98
|
+
|
|
99
|
+
## Crypto Types
|
|
100
|
+
|
|
101
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
102
|
+
|------|-------------|-----------|----------------|--------------|
|
|
103
|
+
| `bitcoin_address` | BTC address | - | `"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"` | Invalid |
|
|
104
|
+
| `ethereum_address` | ETH address | - | `"0x71C7656EC7ab88b098defB751B7401B5f6d8976F"` | Invalid |
|
|
105
|
+
| `hash` | Hash string | `algorithm: md5\|sha256` | `"d41d8cd98f00b..."` | `""` |
|
|
106
|
+
|
|
107
|
+
## Content Types
|
|
108
|
+
|
|
109
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
110
|
+
|------|-------------|-----------|----------------|--------------|
|
|
111
|
+
| `title` | Title/headline | - | `"Breaking News"` | `""` |
|
|
112
|
+
| `company_name` | Company name | - | `"Acme Corp"` | `""` |
|
|
113
|
+
| `job_title` | Job title | - | `"Software Engineer"` | `""` |
|
|
114
|
+
| `buzzword` | Business buzzword | - | `"synergize"` | `""` |
|
|
115
|
+
| `color` | Color name | - | `"blue"` | `""` |
|
|
116
|
+
| `color_hex` | Hex color | - | `"#FF5733"` | `"#000000"` |
|
|
117
|
+
|
|
118
|
+
## Health Types
|
|
119
|
+
|
|
120
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
121
|
+
|------|-------------|-----------|----------------|--------------|
|
|
122
|
+
| `blood_type` | Blood type | - | `"A+"` | All types |
|
|
123
|
+
|
|
124
|
+
## Travel Types
|
|
125
|
+
|
|
126
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
127
|
+
|------|-------------|-----------|----------------|--------------|
|
|
128
|
+
| `airport_code` | IATA code | - | `"JFK"` | `"XXX"` |
|
|
129
|
+
| `airline` | Airline name | - | `"Delta"` | `""` |
|
|
130
|
+
| `flight_number` | Flight number | - | `"AA1234"` | `"XX0000"` |
|
|
131
|
+
|
|
132
|
+
## Complex Types
|
|
133
|
+
|
|
134
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
135
|
+
|------|-------------|-----------|----------------|--------------|
|
|
136
|
+
| `array` | Array of items | `element, size` | `["a", "b", "c"]` | `[]`, large array |
|
|
137
|
+
| `object` | Generic object | - | `{"key": "value"}` | `{}` |
|
|
138
|
+
| `Ref(Schema.field)` | Reference | - | Referenced value | - |
|
|
139
|
+
| `custom` | Custom function | `:function_name` | Function result | - |
|
|
140
|
+
|
|
141
|
+
## Special Types
|
|
142
|
+
|
|
143
|
+
| Type | Description | Arguments | Random Example | Edge Example |
|
|
144
|
+
|------|-------------|-----------|----------------|--------------|
|
|
145
|
+
| `formula` | Math expression | `"field1 + field2"` | Computed value | - |
|
|
146
|
+
| `template` | String template | `"${field} text"` | Interpolated string | - |
|
|
147
|
+
| `sequence` | Custom sequence | Various | Sequential value | - |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Type Arguments Reference
|
|
152
|
+
|
|
153
|
+
### Range Arguments
|
|
154
|
+
|
|
155
|
+
```dsl
|
|
156
|
+
number(0..100) # Integer range
|
|
157
|
+
number(0.0..100.0) # Float range
|
|
158
|
+
text(10..50) # Character count range
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Named Arguments
|
|
162
|
+
|
|
163
|
+
```dsl
|
|
164
|
+
uuid(unique: true, version: 7)
|
|
165
|
+
number(min: 0, max: 100, precision: 2)
|
|
166
|
+
past_date(days: 30)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Duration Arguments
|
|
170
|
+
|
|
171
|
+
```dsl
|
|
172
|
+
past_date(30d) # 30 days
|
|
173
|
+
past_date(6m) # 6 months
|
|
174
|
+
past_date(2y) # 2 years
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Probability Arguments
|
|
178
|
+
|
|
179
|
+
```dsl
|
|
180
|
+
boolean(true:80%) # 80% true
|
|
181
|
+
enum(a:60%, b:30%, c:10%) # Weighted enum
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Mode Output Summary
|
|
187
|
+
|
|
188
|
+
| Mode | String | Number | Boolean | Date |
|
|
189
|
+
|------|--------|--------|---------|------|
|
|
190
|
+
| `:random` | Realistic | In range | 50/50 | Realistic |
|
|
191
|
+
| `:edge` | Empty, long | Min, max | true, false | Boundaries |
|
|
192
|
+
| `:invalid` | nil, wrong type | String | nil, "yes" | Invalid format |
|
|
193
|
+
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
# Basic Concepts
|
|
2
|
+
|
|
3
|
+
Understanding the core concepts and terminology of FakeDataDSL.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [What is FakeDataDSL?](#what-is-fakedatadsl)
|
|
8
|
+
- [Core Concepts](#core-concepts)
|
|
9
|
+
- [The DSL](#the-dsl)
|
|
10
|
+
- [Types](#types)
|
|
11
|
+
- [Generation](#generation)
|
|
12
|
+
- [Modes](#modes)
|
|
13
|
+
- [Behaviors](#behaviors)
|
|
14
|
+
- [Registry](#registry)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## What is FakeDataDSL?
|
|
19
|
+
|
|
20
|
+
FakeDataDSL is a Ruby gem that lets you:
|
|
21
|
+
|
|
22
|
+
1. **Define data schemas** using a simple, human-readable DSL
|
|
23
|
+
2. **Generate fake data** that matches those schemas
|
|
24
|
+
3. **Simulate real-world conditions** like network latency and failures
|
|
25
|
+
4. **Test edge cases** with different generation modes
|
|
26
|
+
|
|
27
|
+
### Key Benefits
|
|
28
|
+
|
|
29
|
+
| Benefit | Description |
|
|
30
|
+
|---------|-------------|
|
|
31
|
+
| **Declarative** | Define WHAT data looks like, not HOW to generate it |
|
|
32
|
+
| **Deterministic** | Same seed always produces same output |
|
|
33
|
+
| **Flexible** | Multiple generation modes for different testing needs |
|
|
34
|
+
| **Scalable** | Stream millions of records without memory issues |
|
|
35
|
+
| **Extensible** | Add custom types, functions, and behaviors |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Core Concepts
|
|
40
|
+
|
|
41
|
+
### Schema
|
|
42
|
+
|
|
43
|
+
A **schema** defines the structure of your data. It specifies:
|
|
44
|
+
- Field names
|
|
45
|
+
- Field types
|
|
46
|
+
- Optional constraints and arguments
|
|
47
|
+
|
|
48
|
+
```dsl
|
|
49
|
+
User: # Schema name
|
|
50
|
+
id: uuid # Field: name: type
|
|
51
|
+
name: name # Field: name: type
|
|
52
|
+
age: number(18..65) # Field with arguments
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Field
|
|
56
|
+
|
|
57
|
+
A **field** is a single data point within a schema:
|
|
58
|
+
|
|
59
|
+
```dsl
|
|
60
|
+
SchemaName:
|
|
61
|
+
field_name: type # Basic field
|
|
62
|
+
field_name: type(args) # Field with arguments
|
|
63
|
+
optional_field?: type # Optional field
|
|
64
|
+
nullable_field: type? # Nullable field
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Type
|
|
68
|
+
|
|
69
|
+
A **type** is a generator that produces specific kinds of data:
|
|
70
|
+
|
|
71
|
+
| Type | Generates |
|
|
72
|
+
|------|-----------|
|
|
73
|
+
| `uuid` | `"550e8400-e29b-41d4-a716-446655440000"` |
|
|
74
|
+
| `name` | `"John Smith"` |
|
|
75
|
+
| `email` | `"john@example.com"` |
|
|
76
|
+
| `number(1..100)` | `42` |
|
|
77
|
+
| `boolean` | `true` or `false` |
|
|
78
|
+
|
|
79
|
+
### Mode
|
|
80
|
+
|
|
81
|
+
A **mode** determines what kind of data to generate:
|
|
82
|
+
|
|
83
|
+
| Mode | Purpose |
|
|
84
|
+
|------|---------|
|
|
85
|
+
| `:random` | Typical, realistic values (default) |
|
|
86
|
+
| `:edge` | Boundary values, edge cases |
|
|
87
|
+
| `:invalid` | Invalid data for validation testing |
|
|
88
|
+
| `:mixed` | Combination of all modes |
|
|
89
|
+
|
|
90
|
+
### Behavior
|
|
91
|
+
|
|
92
|
+
A **behavior** simulates real-world conditions:
|
|
93
|
+
|
|
94
|
+
```dsl
|
|
95
|
+
APIResponse:
|
|
96
|
+
@latency 100..500ms # Add delay
|
|
97
|
+
@failure 5% # 5% chance of error
|
|
98
|
+
|
|
99
|
+
data: text
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## The DSL
|
|
105
|
+
|
|
106
|
+
### Syntax Overview
|
|
107
|
+
|
|
108
|
+
FakeDataDSL uses an indentation-based syntax:
|
|
109
|
+
|
|
110
|
+
```dsl
|
|
111
|
+
# Comments start with #
|
|
112
|
+
|
|
113
|
+
SchemaName: # Schema declaration (ends with colon)
|
|
114
|
+
field_name: type # Field definition (indented)
|
|
115
|
+
field_name: type(arguments) # Field with arguments
|
|
116
|
+
|
|
117
|
+
@behavior value # Schema-level behavior
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Indentation Rules
|
|
121
|
+
|
|
122
|
+
- Use **2 spaces** for indentation (recommended)
|
|
123
|
+
- Tabs are supported but don't mix tabs and spaces
|
|
124
|
+
- Each schema starts at column 0
|
|
125
|
+
- Fields are indented under their schema
|
|
126
|
+
|
|
127
|
+
### Multiple Schemas
|
|
128
|
+
|
|
129
|
+
```dsl
|
|
130
|
+
User:
|
|
131
|
+
id: uuid
|
|
132
|
+
name: name
|
|
133
|
+
|
|
134
|
+
Order:
|
|
135
|
+
id: uuid
|
|
136
|
+
user_id: Ref(User.id)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Types
|
|
142
|
+
|
|
143
|
+
### Built-in Types
|
|
144
|
+
|
|
145
|
+
FakeDataDSL includes 50+ built-in types:
|
|
146
|
+
|
|
147
|
+
#### Identifiers
|
|
148
|
+
- `uuid`, `uuid(version: 7)`, `ulid`, `id_sequence`
|
|
149
|
+
|
|
150
|
+
#### Personal Data
|
|
151
|
+
- `name`, `first_name`, `last_name`, `email`, `phone`
|
|
152
|
+
|
|
153
|
+
#### Location
|
|
154
|
+
- `address`, `city`, `country`, `postal_code`, `latitude`, `longitude`
|
|
155
|
+
|
|
156
|
+
#### Date/Time
|
|
157
|
+
- `date`, `past_date`, `future_date`, `timestamp`, `now`
|
|
158
|
+
|
|
159
|
+
#### Finance
|
|
160
|
+
- `money`, `currency`, `iban`, `credit_card`
|
|
161
|
+
|
|
162
|
+
#### Technology
|
|
163
|
+
- `url`, `ip`, `ipv6`, `domain`, `mac_address`
|
|
164
|
+
|
|
165
|
+
#### Text
|
|
166
|
+
- `text(min..max)`, `paragraph`, `sentence`, `word`
|
|
167
|
+
|
|
168
|
+
#### Primitives
|
|
169
|
+
- `number(min..max)`, `boolean`, `enum(val1, val2)`
|
|
170
|
+
|
|
171
|
+
### Type Arguments
|
|
172
|
+
|
|
173
|
+
Types can accept arguments:
|
|
174
|
+
|
|
175
|
+
```dsl
|
|
176
|
+
User:
|
|
177
|
+
# Range arguments
|
|
178
|
+
age: number(18..65)
|
|
179
|
+
bio: text(50..500)
|
|
180
|
+
|
|
181
|
+
# Named arguments
|
|
182
|
+
id: uuid(unique: true, version: 7)
|
|
183
|
+
role: enum(user, admin:10%)
|
|
184
|
+
|
|
185
|
+
# Duration arguments
|
|
186
|
+
created_at: past_date(1y)
|
|
187
|
+
expires_at: future_date(30d)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Custom Types
|
|
191
|
+
|
|
192
|
+
Create your own types:
|
|
193
|
+
|
|
194
|
+
```ruby
|
|
195
|
+
FakeDataDSL.register_type(:ssn) do |rng, context, args, mode|
|
|
196
|
+
"#{rng.int(100, 999)}-#{rng.int(10, 99)}-#{rng.int(1000, 9999)}"
|
|
197
|
+
end
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Generation
|
|
203
|
+
|
|
204
|
+
### Single Record
|
|
205
|
+
|
|
206
|
+
```ruby
|
|
207
|
+
schema = FakeDataDSL.load('schema.dsl')
|
|
208
|
+
record = schema.generate
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Multiple Records
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
records = schema.generate_many(100)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Streaming (Large Batches)
|
|
218
|
+
|
|
219
|
+
```ruby
|
|
220
|
+
schema.generate_stream(count: 1_000_000).each do |record|
|
|
221
|
+
process(record)
|
|
222
|
+
end
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### With Options
|
|
226
|
+
|
|
227
|
+
```ruby
|
|
228
|
+
record = schema.generate(
|
|
229
|
+
seed: 12345, # For reproducibility
|
|
230
|
+
mode: :edge, # Generation mode
|
|
231
|
+
registry: registry, # For cross-references
|
|
232
|
+
overrides: { # Override specific fields
|
|
233
|
+
'status' => 'active'
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Modes
|
|
241
|
+
|
|
242
|
+
### Random Mode (Default)
|
|
243
|
+
|
|
244
|
+
Generates typical, realistic data:
|
|
245
|
+
|
|
246
|
+
```ruby
|
|
247
|
+
schema.generate(mode: :random)
|
|
248
|
+
# => {"age" => 34, "name" => "John Smith"}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Edge Mode
|
|
252
|
+
|
|
253
|
+
Generates boundary values and edge cases:
|
|
254
|
+
|
|
255
|
+
```ruby
|
|
256
|
+
schema.generate(mode: :edge)
|
|
257
|
+
# => {"age" => 0, "name" => ""}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Edge cases include:
|
|
261
|
+
- Empty strings
|
|
262
|
+
- Minimum/maximum values
|
|
263
|
+
- Boundary dates
|
|
264
|
+
- Special characters
|
|
265
|
+
|
|
266
|
+
### Invalid Mode
|
|
267
|
+
|
|
268
|
+
Generates invalid data for validation testing:
|
|
269
|
+
|
|
270
|
+
```ruby
|
|
271
|
+
schema.generate(mode: :invalid)
|
|
272
|
+
# => {"age" => "not_a_number", "name" => nil}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Invalid data includes:
|
|
276
|
+
- Wrong types
|
|
277
|
+
- Null values
|
|
278
|
+
- Malformed formats
|
|
279
|
+
- Out-of-range values
|
|
280
|
+
|
|
281
|
+
### Mixed Mode
|
|
282
|
+
|
|
283
|
+
Combines all modes randomly:
|
|
284
|
+
|
|
285
|
+
```ruby
|
|
286
|
+
schema.generate(mode: :mixed)
|
|
287
|
+
# 80% random, 15% edge, 5% invalid
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Behaviors
|
|
293
|
+
|
|
294
|
+
### What Are Behaviors?
|
|
295
|
+
|
|
296
|
+
Behaviors simulate real-world conditions:
|
|
297
|
+
|
|
298
|
+
| Behavior | Description |
|
|
299
|
+
|----------|-------------|
|
|
300
|
+
| `@latency` | Adds artificial delay |
|
|
301
|
+
| `@failure` | Throws errors randomly |
|
|
302
|
+
| `@partial_data` | Omits random fields |
|
|
303
|
+
| `@close_connection` | Simulates connection drops |
|
|
304
|
+
| `@simulate_error` | Returns HTTP error codes |
|
|
305
|
+
|
|
306
|
+
### Schema-Level Behaviors
|
|
307
|
+
|
|
308
|
+
Apply to all generation:
|
|
309
|
+
|
|
310
|
+
```dsl
|
|
311
|
+
APIResponse:
|
|
312
|
+
@latency 100..500ms
|
|
313
|
+
@failure 5%
|
|
314
|
+
|
|
315
|
+
id: uuid
|
|
316
|
+
data: text
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Field-Level Behaviors
|
|
320
|
+
|
|
321
|
+
Apply to specific fields:
|
|
322
|
+
|
|
323
|
+
```dsl
|
|
324
|
+
User:
|
|
325
|
+
id: uuid
|
|
326
|
+
avatar: url @partial_data 30%
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Registry
|
|
332
|
+
|
|
333
|
+
### What is a Registry?
|
|
334
|
+
|
|
335
|
+
A **registry** manages multiple schemas and resolves cross-schema references.
|
|
336
|
+
|
|
337
|
+
### Creating a Registry
|
|
338
|
+
|
|
339
|
+
```ruby
|
|
340
|
+
registry = FakeDataDSL::Registry.new
|
|
341
|
+
|
|
342
|
+
# Load individual files
|
|
343
|
+
registry.load_file('schemas/user.dsl')
|
|
344
|
+
registry.load_file('schemas/order.dsl')
|
|
345
|
+
|
|
346
|
+
# Or load entire directory
|
|
347
|
+
registry.load_dir('schemas/')
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Cross-Schema References
|
|
351
|
+
|
|
352
|
+
```dsl
|
|
353
|
+
# user.dsl
|
|
354
|
+
User:
|
|
355
|
+
id: uuid
|
|
356
|
+
name: name
|
|
357
|
+
|
|
358
|
+
# order.dsl
|
|
359
|
+
Order:
|
|
360
|
+
id: uuid
|
|
361
|
+
user_id: Ref(User.id) # References User schema
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
```ruby
|
|
365
|
+
registry = FakeDataDSL::Registry.new
|
|
366
|
+
registry.load_dir('schemas/')
|
|
367
|
+
|
|
368
|
+
# Generate with resolved references
|
|
369
|
+
order = registry.schema('Order').generate(registry: registry)
|
|
370
|
+
# order["user_id"] is a valid UUID
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Next Steps
|
|
376
|
+
|
|
377
|
+
Now that you understand the basics:
|
|
378
|
+
|
|
379
|
+
1. [DSL Reference](dsl/schema_definition.md) - Complete syntax guide
|
|
380
|
+
2. [Type Reference](dsl/core_types.md) - All available types
|
|
381
|
+
3. [API Reference](api/overview.md) - Ruby API documentation
|
|
382
|
+
4. [Examples](../tech_example/README.md) - Real-world examples
|
|
383
|
+
|