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,172 @@
|
|
|
1
|
+
# DSL Reference
|
|
2
|
+
|
|
3
|
+
Complete reference for the FakeDataDSL syntax.
|
|
4
|
+
|
|
5
|
+
## Schema Definition
|
|
6
|
+
|
|
7
|
+
A schema starts with a name followed by a colon:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
SchemaName:
|
|
11
|
+
field1: type1
|
|
12
|
+
field2: type2
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Field Types
|
|
16
|
+
|
|
17
|
+
### Basic Types
|
|
18
|
+
|
|
19
|
+
```ruby
|
|
20
|
+
User:
|
|
21
|
+
id: uuid # UUID v4
|
|
22
|
+
name: name # Full name
|
|
23
|
+
email: email # Email address
|
|
24
|
+
age: number(18..65) # Number in range
|
|
25
|
+
active: boolean # True/false
|
|
26
|
+
bio: text(100..500) # Text with length range
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Type Arguments
|
|
30
|
+
|
|
31
|
+
Many types accept arguments:
|
|
32
|
+
|
|
33
|
+
```ruby
|
|
34
|
+
User:
|
|
35
|
+
age: number(18..65) # Range
|
|
36
|
+
price: number(min: 10, max: 100) # Min/max
|
|
37
|
+
status: enum(active, inactive, pending) # Enum values
|
|
38
|
+
tags: array(text, 3..10) # Array with element type and size
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Nullable Fields
|
|
42
|
+
|
|
43
|
+
Add `?` to make a field nullable:
|
|
44
|
+
|
|
45
|
+
```ruby
|
|
46
|
+
User:
|
|
47
|
+
middle_name: name? # May be null
|
|
48
|
+
nickname: text? # Optional field
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Optional Fields
|
|
52
|
+
|
|
53
|
+
Use `optional` modifier to omit fields sometimes:
|
|
54
|
+
|
|
55
|
+
```ruby
|
|
56
|
+
User:
|
|
57
|
+
phone: phone optional # May be omitted
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Comments
|
|
61
|
+
|
|
62
|
+
Use `#` for comments:
|
|
63
|
+
|
|
64
|
+
```ruby
|
|
65
|
+
User:
|
|
66
|
+
# Primary identifier
|
|
67
|
+
id: uuid
|
|
68
|
+
name: name # User's full name
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Behaviors
|
|
72
|
+
|
|
73
|
+
Behaviors modify how data is generated:
|
|
74
|
+
|
|
75
|
+
### Schema-Level Behaviors
|
|
76
|
+
|
|
77
|
+
```ruby
|
|
78
|
+
User:
|
|
79
|
+
@latency 100ms # Add 100ms delay
|
|
80
|
+
@failure 5% # 5% chance of failure
|
|
81
|
+
id: uuid
|
|
82
|
+
name: name
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Field-Level Behaviors
|
|
86
|
+
|
|
87
|
+
```ruby
|
|
88
|
+
User:
|
|
89
|
+
id: uuid @latency 50ms
|
|
90
|
+
name: name @failure 1%
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
See [Behaviors Guide](behaviors.md) for details.
|
|
94
|
+
|
|
95
|
+
## Arrays
|
|
96
|
+
|
|
97
|
+
Generate arrays of values:
|
|
98
|
+
|
|
99
|
+
```ruby
|
|
100
|
+
User:
|
|
101
|
+
tags: array(text, 3..10) # 3-10 text items
|
|
102
|
+
scores: array(number(0..100), 5) # Exactly 5 numbers
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Nested Objects
|
|
106
|
+
|
|
107
|
+
Use the `object` type for nested structures:
|
|
108
|
+
|
|
109
|
+
```ruby
|
|
110
|
+
User:
|
|
111
|
+
address: object(
|
|
112
|
+
street: text,
|
|
113
|
+
city: city,
|
|
114
|
+
zip: postal_code
|
|
115
|
+
)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## References
|
|
119
|
+
|
|
120
|
+
Reference other schemas:
|
|
121
|
+
|
|
122
|
+
```ruby
|
|
123
|
+
User:
|
|
124
|
+
id: uuid
|
|
125
|
+
name: name
|
|
126
|
+
|
|
127
|
+
Order:
|
|
128
|
+
id: uuid
|
|
129
|
+
user_id: reference(User, id) # Reference User's id field
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Custom Functions
|
|
133
|
+
|
|
134
|
+
Use custom functions for computed values:
|
|
135
|
+
|
|
136
|
+
```ruby
|
|
137
|
+
User:
|
|
138
|
+
id: uuid
|
|
139
|
+
name: name
|
|
140
|
+
slug: custom(:generate_slug) # Custom function
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Conditional Fields
|
|
144
|
+
|
|
145
|
+
Fields can be conditional:
|
|
146
|
+
|
|
147
|
+
```ruby
|
|
148
|
+
User:
|
|
149
|
+
is_admin: boolean
|
|
150
|
+
admin_key: text if is_admin # Only if is_admin is true
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Multiple Schemas
|
|
154
|
+
|
|
155
|
+
Define multiple schemas in one file:
|
|
156
|
+
|
|
157
|
+
```ruby
|
|
158
|
+
User:
|
|
159
|
+
id: uuid
|
|
160
|
+
name: name
|
|
161
|
+
|
|
162
|
+
Order:
|
|
163
|
+
id: uuid
|
|
164
|
+
user_id: reference(User, id)
|
|
165
|
+
total: number(10..1000)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## See Also
|
|
169
|
+
|
|
170
|
+
- [Type Reference](type_reference.md) - Complete list of types
|
|
171
|
+
- [Examples](examples.md) - Usage examples
|
|
172
|
+
|
data/docs/examples.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
Real-world examples of using FakeDataDSL.
|
|
4
|
+
|
|
5
|
+
## E-Commerce Application
|
|
6
|
+
|
|
7
|
+
```ruby
|
|
8
|
+
# schemas/ecommerce.dsl
|
|
9
|
+
User:
|
|
10
|
+
id: uuid
|
|
11
|
+
email: email unique
|
|
12
|
+
name: name
|
|
13
|
+
created_at: past_date(days: 365)
|
|
14
|
+
|
|
15
|
+
Product:
|
|
16
|
+
id: uuid
|
|
17
|
+
name: product_name
|
|
18
|
+
category: product_category
|
|
19
|
+
price: money(min: 10, max: 1000)
|
|
20
|
+
sku: sku
|
|
21
|
+
|
|
22
|
+
Order:
|
|
23
|
+
id: uuid
|
|
24
|
+
user_id: reference(User, id)
|
|
25
|
+
product_id: reference(Product, id)
|
|
26
|
+
quantity: number(1..10)
|
|
27
|
+
total: formula(quantity * price)
|
|
28
|
+
status: enum(placed: 60%, processing: 30%, shipped: 10%)
|
|
29
|
+
created_at: past_date(days: 30)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Social Media Platform
|
|
33
|
+
|
|
34
|
+
```ruby
|
|
35
|
+
# schemas/social.dsl
|
|
36
|
+
User:
|
|
37
|
+
id: uuid
|
|
38
|
+
username: username unique
|
|
39
|
+
email: email unique
|
|
40
|
+
full_name: full_name
|
|
41
|
+
bio: text(50..200) optional
|
|
42
|
+
avatar_url: url optional
|
|
43
|
+
created_at: past_date(days: 730)
|
|
44
|
+
|
|
45
|
+
Post:
|
|
46
|
+
id: uuid
|
|
47
|
+
author_id: reference(User, id)
|
|
48
|
+
content: text(100..1000)
|
|
49
|
+
likes: number(0..10000)
|
|
50
|
+
created_at: past_date(days: 30)
|
|
51
|
+
|
|
52
|
+
Comment:
|
|
53
|
+
id: uuid
|
|
54
|
+
post_id: reference(Post, id)
|
|
55
|
+
author_id: reference(User, id)
|
|
56
|
+
content: text(10..500)
|
|
57
|
+
created_at: past_date(days: 7)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Healthcare System
|
|
61
|
+
|
|
62
|
+
```ruby
|
|
63
|
+
# schemas/healthcare.dsl
|
|
64
|
+
Patient:
|
|
65
|
+
id: uuid
|
|
66
|
+
first_name: first_name
|
|
67
|
+
last_name: last_name
|
|
68
|
+
date_of_birth: past_date(days: 36500) # ~100 years
|
|
69
|
+
blood_type: blood_type
|
|
70
|
+
medical_record_number: medical_code(type: :icd10)
|
|
71
|
+
|
|
72
|
+
VitalSigns:
|
|
73
|
+
patient_id: reference(Patient, id)
|
|
74
|
+
heart_rate: heart_rate(min: 60, max: 100)
|
|
75
|
+
bmi: bmi(range: 18.5..30.0)
|
|
76
|
+
recorded_at: past_date(days: 7)
|
|
77
|
+
|
|
78
|
+
Diagnosis:
|
|
79
|
+
patient_id: reference(Patient, id)
|
|
80
|
+
code: medical_code(type: :icd10)
|
|
81
|
+
description: text(50..500)
|
|
82
|
+
diagnosed_at: past_date(days: 365)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Financial Application
|
|
86
|
+
|
|
87
|
+
```ruby
|
|
88
|
+
# schemas/finance.dsl
|
|
89
|
+
Account:
|
|
90
|
+
id: uuid
|
|
91
|
+
account_number: account_number
|
|
92
|
+
bank_name: bank_name
|
|
93
|
+
iban: iban(country: :us)
|
|
94
|
+
balance: transaction_amount(min: 0, max: 100000)
|
|
95
|
+
currency: currency
|
|
96
|
+
|
|
97
|
+
Transaction:
|
|
98
|
+
id: uuid
|
|
99
|
+
from_account_id: reference(Account, id)
|
|
100
|
+
to_account_id: reference(Account, id)
|
|
101
|
+
amount: transaction_amount(min: 1, max: 10000)
|
|
102
|
+
currency: currency
|
|
103
|
+
status: enum(pending: 20%, completed: 75%, failed: 5%)
|
|
104
|
+
created_at: past_date(days: 30)
|
|
105
|
+
|
|
106
|
+
Payment:
|
|
107
|
+
id: uuid
|
|
108
|
+
account_id: reference(Account, id)
|
|
109
|
+
credit_card: credit_card(type: :visa)
|
|
110
|
+
amount: transaction_amount(min: 10, max: 1000)
|
|
111
|
+
status: enum(approved: 90%, declined: 10%)
|
|
112
|
+
processed_at: past_date(days: 7)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Testing Scenarios
|
|
116
|
+
|
|
117
|
+
### Edge Case Testing
|
|
118
|
+
|
|
119
|
+
```ruby
|
|
120
|
+
# Generate edge cases
|
|
121
|
+
schema = registry.schema('User')
|
|
122
|
+
edge_records = schema.generate_many(100, mode: :edge)
|
|
123
|
+
|
|
124
|
+
# Test validation
|
|
125
|
+
edge_records.each do |record|
|
|
126
|
+
validate_user(record) # Should handle edge cases
|
|
127
|
+
end
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Invalid Data Testing
|
|
131
|
+
|
|
132
|
+
```ruby
|
|
133
|
+
# Generate invalid data
|
|
134
|
+
invalid_records = schema.generate_many(100, mode: :invalid)
|
|
135
|
+
|
|
136
|
+
# Test error handling
|
|
137
|
+
invalid_records.each do |record|
|
|
138
|
+
expect { create_user(record) }.to raise_error(ValidationError)
|
|
139
|
+
end
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Performance Testing
|
|
143
|
+
|
|
144
|
+
```ruby
|
|
145
|
+
# Generate with latency
|
|
146
|
+
User:
|
|
147
|
+
@latency 50ms..200ms
|
|
148
|
+
id: uuid
|
|
149
|
+
name: name
|
|
150
|
+
|
|
151
|
+
# Measure generation time
|
|
152
|
+
start = Time.now
|
|
153
|
+
records = schema.generate_many(1000)
|
|
154
|
+
duration = Time.now - start
|
|
155
|
+
puts "Generated 1000 records in #{duration}s"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## See Also
|
|
159
|
+
|
|
160
|
+
- [Getting Started](getting_started.md) - Basic usage
|
|
161
|
+
- [DSL Reference](dsl_reference.md) - Syntax details
|
|
162
|
+
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Generation Modes
|
|
2
|
+
|
|
3
|
+
FakeDataDSL supports different generation modes for various testing scenarios.
|
|
4
|
+
|
|
5
|
+
## Available Modes
|
|
6
|
+
|
|
7
|
+
### Random Mode (Default)
|
|
8
|
+
|
|
9
|
+
Generates realistic random data:
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
schema = registry.schema('User')
|
|
13
|
+
record = schema.generate(mode: :random)
|
|
14
|
+
# => Normal, realistic data
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Edge Mode
|
|
18
|
+
|
|
19
|
+
Generates edge case values (empty, boundary, null):
|
|
20
|
+
|
|
21
|
+
```ruby
|
|
22
|
+
record = schema.generate(mode: :edge)
|
|
23
|
+
# => Edge cases: empty strings, null values, boundary numbers
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Use cases:**
|
|
27
|
+
- Testing validation logic
|
|
28
|
+
- Finding boundary bugs
|
|
29
|
+
- Stress testing
|
|
30
|
+
|
|
31
|
+
### Invalid Mode
|
|
32
|
+
|
|
33
|
+
Generates intentionally invalid data:
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
record = schema.generate(mode: :invalid)
|
|
37
|
+
# => Invalid data: wrong types, malformed values
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Use cases:**
|
|
41
|
+
- Testing error handling
|
|
42
|
+
- Validating input sanitization
|
|
43
|
+
- Security testing
|
|
44
|
+
|
|
45
|
+
### Mixed Mode
|
|
46
|
+
|
|
47
|
+
Combines random, edge, and invalid values:
|
|
48
|
+
|
|
49
|
+
```ruby
|
|
50
|
+
record = schema.generate(mode: :mixed)
|
|
51
|
+
# => Mix of random, edge, and invalid values
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Custom ratios:**
|
|
55
|
+
|
|
56
|
+
```ruby
|
|
57
|
+
record = schema.generate(mode: :mixed, ratios: { random: 70, edge: 20, invalid: 10 })
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Mode Examples
|
|
61
|
+
|
|
62
|
+
### Random Mode
|
|
63
|
+
|
|
64
|
+
```ruby
|
|
65
|
+
User:
|
|
66
|
+
name: name
|
|
67
|
+
age: number(18..65)
|
|
68
|
+
email: email
|
|
69
|
+
|
|
70
|
+
# Generates:
|
|
71
|
+
# { "name" => "John Smith", "age" => 42, "email" => "john@example.com" }
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Edge Mode
|
|
75
|
+
|
|
76
|
+
```ruby
|
|
77
|
+
# Same schema, edge mode:
|
|
78
|
+
# { "name" => "", "age" => 18, "email" => "" }
|
|
79
|
+
# or
|
|
80
|
+
# { "name" => "A", "age" => 65, "email" => "a@b.c" }
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Invalid Mode
|
|
84
|
+
|
|
85
|
+
```ruby
|
|
86
|
+
# Same schema, invalid mode:
|
|
87
|
+
# { "name" => 123, "age" => "not a number", "email" => nil }
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Mode Configuration
|
|
91
|
+
|
|
92
|
+
Set default mode globally:
|
|
93
|
+
|
|
94
|
+
```ruby
|
|
95
|
+
FakeDataDSL.configure do |config|
|
|
96
|
+
config.default_mode = :edge
|
|
97
|
+
end
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Or per-schema:
|
|
101
|
+
|
|
102
|
+
```ruby
|
|
103
|
+
schema = registry.schema('User')
|
|
104
|
+
schema.default_mode = :invalid
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Combining with Behaviors
|
|
108
|
+
|
|
109
|
+
Modes work with behaviors:
|
|
110
|
+
|
|
111
|
+
```ruby
|
|
112
|
+
User:
|
|
113
|
+
@latency 100ms
|
|
114
|
+
@failure 5%
|
|
115
|
+
name: name
|
|
116
|
+
|
|
117
|
+
# Edge mode + behaviors:
|
|
118
|
+
# Generates edge cases with delays and occasional failures
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## See Also
|
|
122
|
+
|
|
123
|
+
- [Behaviors Guide](behaviors.md) - Behavior system
|
|
124
|
+
- [Examples](examples.md) - Mode usage examples
|
|
125
|
+
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Getting Started with FakeDataDSL
|
|
2
|
+
|
|
3
|
+
FakeDataDSL is a Ruby gem for generating realistic fake data using a simple, human-friendly DSL (Domain-Specific Language).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add FakeDataDSL to your Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem 'fake_data_dsl'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Then run:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
bundle install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or install it directly:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
gem install fake_data_dsl
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Basic Usage
|
|
26
|
+
|
|
27
|
+
### 1. Define a Schema
|
|
28
|
+
|
|
29
|
+
Create a schema file (e.g., `user.dsl`):
|
|
30
|
+
|
|
31
|
+
```ruby
|
|
32
|
+
User:
|
|
33
|
+
id: uuid
|
|
34
|
+
name: name
|
|
35
|
+
email: email
|
|
36
|
+
age: number(18..65)
|
|
37
|
+
active: boolean
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2. Load and Generate
|
|
41
|
+
|
|
42
|
+
```ruby
|
|
43
|
+
require 'fake_data_dsl'
|
|
44
|
+
|
|
45
|
+
# Load schema
|
|
46
|
+
registry = FakeDataDSL::Registry.new
|
|
47
|
+
registry.load_file('user.dsl')
|
|
48
|
+
|
|
49
|
+
# Generate a single record
|
|
50
|
+
schema = registry.schema('User')
|
|
51
|
+
record = schema.generate
|
|
52
|
+
# => { "id" => "550e8400-e29b-41d4-a716-446655440000",
|
|
53
|
+
# "name" => "John Smith",
|
|
54
|
+
# "email" => "john.smith@example.com",
|
|
55
|
+
# "age" => 42,
|
|
56
|
+
# "active" => true }
|
|
57
|
+
|
|
58
|
+
# Generate multiple records
|
|
59
|
+
records = schema.generate_many(10)
|
|
60
|
+
# => Array of 10 user records
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Key Concepts
|
|
64
|
+
|
|
65
|
+
### Schemas
|
|
66
|
+
|
|
67
|
+
A **schema** defines the structure of your data. Each schema has a name (like `User`) and contains fields with types.
|
|
68
|
+
|
|
69
|
+
### Types
|
|
70
|
+
|
|
71
|
+
Types define what kind of data to generate. Examples:
|
|
72
|
+
- `uuid` - Universally unique identifiers
|
|
73
|
+
- `name` - Person names
|
|
74
|
+
- `email` - Email addresses
|
|
75
|
+
- `number` - Numeric values
|
|
76
|
+
- `boolean` - True/false values
|
|
77
|
+
|
|
78
|
+
See [Type Reference](type_reference.md) for the complete list.
|
|
79
|
+
|
|
80
|
+
### Fields
|
|
81
|
+
|
|
82
|
+
Fields are the properties of your schema. Each field has:
|
|
83
|
+
- A name (e.g., `id`, `name`)
|
|
84
|
+
- A type (e.g., `uuid`, `name`)
|
|
85
|
+
- Optional arguments (e.g., `number(18..65)`)
|
|
86
|
+
|
|
87
|
+
## Next Steps
|
|
88
|
+
|
|
89
|
+
- Read the [DSL Reference](dsl_reference.md) to learn the full syntax
|
|
90
|
+
- Explore [Examples](examples.md) for real-world use cases
|
|
91
|
+
- Check out [Advanced Features](advanced_features.md) for complex scenarios
|
|
92
|
+
|