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,399 @@
|
|
|
1
|
+
# Schema Definition
|
|
2
|
+
|
|
3
|
+
Complete guide to defining schemas in FakeDataDSL.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Basic Syntax](#basic-syntax)
|
|
8
|
+
- [Schema Names](#schema-names)
|
|
9
|
+
- [Field Definitions](#field-definitions)
|
|
10
|
+
- [Multiple Schemas](#multiple-schemas)
|
|
11
|
+
- [Comments](#comments)
|
|
12
|
+
- [Indentation](#indentation)
|
|
13
|
+
- [Best Practices](#best-practices)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Basic Syntax
|
|
18
|
+
|
|
19
|
+
### Minimal Schema
|
|
20
|
+
|
|
21
|
+
```dsl
|
|
22
|
+
User:
|
|
23
|
+
id: uuid
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Complete Example
|
|
27
|
+
|
|
28
|
+
```dsl
|
|
29
|
+
# User schema with all common features
|
|
30
|
+
User:
|
|
31
|
+
# Required fields
|
|
32
|
+
id: uuid(unique: true)
|
|
33
|
+
email: email(unique: true)
|
|
34
|
+
name: name
|
|
35
|
+
|
|
36
|
+
# Field with range
|
|
37
|
+
age: number(18..100)
|
|
38
|
+
|
|
39
|
+
# Boolean with probability
|
|
40
|
+
active: boolean(true:90%)
|
|
41
|
+
|
|
42
|
+
# Enum with weights
|
|
43
|
+
role: enum(user:80%, admin:5%, moderator:15%)
|
|
44
|
+
|
|
45
|
+
# Optional field (may not appear)
|
|
46
|
+
phone?: phone
|
|
47
|
+
|
|
48
|
+
# Nullable field (may be null)
|
|
49
|
+
bio: text?
|
|
50
|
+
|
|
51
|
+
# Optional and nullable
|
|
52
|
+
avatar?: url?
|
|
53
|
+
|
|
54
|
+
# Nested object
|
|
55
|
+
address: Address
|
|
56
|
+
|
|
57
|
+
# Date field
|
|
58
|
+
created_at: past_date(2y)
|
|
59
|
+
|
|
60
|
+
# Schema-level behavior
|
|
61
|
+
@latency 10..50ms
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Schema Names
|
|
67
|
+
|
|
68
|
+
### Naming Rules
|
|
69
|
+
|
|
70
|
+
- Must start with uppercase letter
|
|
71
|
+
- Can contain letters, numbers, underscores
|
|
72
|
+
- Must end with colon (`:`)
|
|
73
|
+
- Must be unique within a file
|
|
74
|
+
|
|
75
|
+
### Valid Names
|
|
76
|
+
|
|
77
|
+
```dsl
|
|
78
|
+
User:
|
|
79
|
+
UserProfile:
|
|
80
|
+
User_V2:
|
|
81
|
+
OrderLineItem:
|
|
82
|
+
API_Response:
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Invalid Names
|
|
86
|
+
|
|
87
|
+
```dsl
|
|
88
|
+
user: # Must start with uppercase
|
|
89
|
+
123User: # Cannot start with number
|
|
90
|
+
user-profile: # Hyphens not allowed
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Field Definitions
|
|
96
|
+
|
|
97
|
+
### Basic Field
|
|
98
|
+
|
|
99
|
+
```dsl
|
|
100
|
+
SchemaName:
|
|
101
|
+
field_name: type
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Field with Arguments
|
|
105
|
+
|
|
106
|
+
```dsl
|
|
107
|
+
SchemaName:
|
|
108
|
+
# Positional arguments
|
|
109
|
+
age: number(18..65)
|
|
110
|
+
|
|
111
|
+
# Named arguments
|
|
112
|
+
id: uuid(unique: true, version: 7)
|
|
113
|
+
|
|
114
|
+
# Mixed arguments
|
|
115
|
+
price: number(0..1000, precision: 2)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Optional Fields
|
|
119
|
+
|
|
120
|
+
Optional fields may not appear in the output:
|
|
121
|
+
|
|
122
|
+
```dsl
|
|
123
|
+
User:
|
|
124
|
+
name: name # Always present
|
|
125
|
+
phone?: phone # May not appear (50% probability)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Nullable Fields
|
|
129
|
+
|
|
130
|
+
Nullable fields may have a `null` value:
|
|
131
|
+
|
|
132
|
+
```dsl
|
|
133
|
+
User:
|
|
134
|
+
name: name # Never null
|
|
135
|
+
nickname: text? # May be null (50% probability)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Optional AND Nullable
|
|
139
|
+
|
|
140
|
+
```dsl
|
|
141
|
+
User:
|
|
142
|
+
# May not appear, AND if present may be null
|
|
143
|
+
emergency_contact?: phone?
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Conditional Fields
|
|
147
|
+
|
|
148
|
+
Fields that appear based on conditions:
|
|
149
|
+
|
|
150
|
+
```dsl
|
|
151
|
+
Order:
|
|
152
|
+
status: enum(pending, shipped, delivered)
|
|
153
|
+
|
|
154
|
+
# Only present when status is truthy
|
|
155
|
+
tracking_number: text(20) if status
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Note:** Currently only truthiness checks are supported, not comparisons.
|
|
159
|
+
|
|
160
|
+
### Field with Behaviors
|
|
161
|
+
|
|
162
|
+
```dsl
|
|
163
|
+
User:
|
|
164
|
+
profile_image: url @partial_data 30%
|
|
165
|
+
settings: object @latency 50..100ms
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Multiple Schemas
|
|
171
|
+
|
|
172
|
+
### In Same File
|
|
173
|
+
|
|
174
|
+
```dsl
|
|
175
|
+
User:
|
|
176
|
+
id: uuid
|
|
177
|
+
name: name
|
|
178
|
+
email: email
|
|
179
|
+
|
|
180
|
+
Address:
|
|
181
|
+
street: text(10..100)
|
|
182
|
+
city: name
|
|
183
|
+
country: country_code
|
|
184
|
+
postal_code: postal_code
|
|
185
|
+
|
|
186
|
+
Order:
|
|
187
|
+
id: uuid
|
|
188
|
+
user: User # Embed User
|
|
189
|
+
shipping: Address # Embed Address
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Schema References
|
|
193
|
+
|
|
194
|
+
```dsl
|
|
195
|
+
# Reference another schema as a type
|
|
196
|
+
User:
|
|
197
|
+
id: uuid
|
|
198
|
+
address: Address # Embeds full Address schema
|
|
199
|
+
|
|
200
|
+
# Reference specific field from another schema
|
|
201
|
+
Order:
|
|
202
|
+
user_id: Ref(User.id) # Just the ID, not full User
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Comments
|
|
208
|
+
|
|
209
|
+
### Single-Line Comments
|
|
210
|
+
|
|
211
|
+
```dsl
|
|
212
|
+
# This is a comment
|
|
213
|
+
User:
|
|
214
|
+
id: uuid # Inline comment
|
|
215
|
+
name: name # Another comment
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Documentation Comments
|
|
219
|
+
|
|
220
|
+
```dsl
|
|
221
|
+
# =================================
|
|
222
|
+
# User Schema
|
|
223
|
+
# =================================
|
|
224
|
+
# Represents a user in the system.
|
|
225
|
+
# Generated for testing purposes.
|
|
226
|
+
#
|
|
227
|
+
# Fields:
|
|
228
|
+
# - id: Unique identifier
|
|
229
|
+
# - name: Full name
|
|
230
|
+
# - email: Contact email
|
|
231
|
+
# =================================
|
|
232
|
+
|
|
233
|
+
User:
|
|
234
|
+
id: uuid
|
|
235
|
+
name: name
|
|
236
|
+
email: email
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Indentation
|
|
242
|
+
|
|
243
|
+
### Spaces (Recommended)
|
|
244
|
+
|
|
245
|
+
Use 2 spaces for indentation:
|
|
246
|
+
|
|
247
|
+
```dsl
|
|
248
|
+
User:
|
|
249
|
+
id: uuid
|
|
250
|
+
name: name
|
|
251
|
+
address:
|
|
252
|
+
street: text
|
|
253
|
+
city: name
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Tabs
|
|
257
|
+
|
|
258
|
+
Tabs are supported:
|
|
259
|
+
|
|
260
|
+
```dsl
|
|
261
|
+
User:
|
|
262
|
+
id: uuid
|
|
263
|
+
name: name
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Rules
|
|
267
|
+
|
|
268
|
+
1. **Don't mix tabs and spaces** - Causes parsing error
|
|
269
|
+
2. **Be consistent** - Use same indentation throughout
|
|
270
|
+
3. **Schema at column 0** - Schema names must start at beginning
|
|
271
|
+
4. **Fields indented** - Fields must be indented under schema
|
|
272
|
+
|
|
273
|
+
### Error Examples
|
|
274
|
+
|
|
275
|
+
```dsl
|
|
276
|
+
# ERROR: Mixed tabs and spaces
|
|
277
|
+
User:
|
|
278
|
+
id: uuid # 2 spaces
|
|
279
|
+
name: name # tab
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
```dsl
|
|
283
|
+
# ERROR: Inconsistent indentation
|
|
284
|
+
User:
|
|
285
|
+
id: uuid # 2 spaces
|
|
286
|
+
name: name # 4 spaces
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Best Practices
|
|
292
|
+
|
|
293
|
+
### 1. Use Descriptive Names
|
|
294
|
+
|
|
295
|
+
```dsl
|
|
296
|
+
# Good
|
|
297
|
+
UserProfile:
|
|
298
|
+
full_name: name
|
|
299
|
+
email_address: email
|
|
300
|
+
date_of_birth: past_date(100y)
|
|
301
|
+
|
|
302
|
+
# Avoid
|
|
303
|
+
UP:
|
|
304
|
+
n: name
|
|
305
|
+
e: email
|
|
306
|
+
d: date
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### 2. Group Related Fields
|
|
310
|
+
|
|
311
|
+
```dsl
|
|
312
|
+
User:
|
|
313
|
+
# Identity
|
|
314
|
+
id: uuid
|
|
315
|
+
username: text(3..20)
|
|
316
|
+
|
|
317
|
+
# Personal info
|
|
318
|
+
first_name: name
|
|
319
|
+
last_name: name
|
|
320
|
+
|
|
321
|
+
# Contact
|
|
322
|
+
email: email
|
|
323
|
+
phone?: phone
|
|
324
|
+
|
|
325
|
+
# Metadata
|
|
326
|
+
created_at: past_date(2y)
|
|
327
|
+
updated_at: past_date(30d)
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### 3. Use Comments
|
|
331
|
+
|
|
332
|
+
```dsl
|
|
333
|
+
# E-commerce Order
|
|
334
|
+
#
|
|
335
|
+
# Represents a customer order with line items.
|
|
336
|
+
# Used for testing order processing workflow.
|
|
337
|
+
Order:
|
|
338
|
+
id: uuid(unique: true)
|
|
339
|
+
|
|
340
|
+
# Customer reference
|
|
341
|
+
customer_id: Ref(Customer.id)
|
|
342
|
+
|
|
343
|
+
# Order details
|
|
344
|
+
items: array(LineItem, 1..10)
|
|
345
|
+
total: custom(:calculate_total)
|
|
346
|
+
|
|
347
|
+
# Status tracking
|
|
348
|
+
status: enum(pending, processing, shipped, delivered)
|
|
349
|
+
tracking_number: text(20) if status # Only when shipped
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 4. Separate Schemas by Domain
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
schemas/
|
|
356
|
+
├── users/
|
|
357
|
+
│ ├── user.dsl
|
|
358
|
+
│ ├── profile.dsl
|
|
359
|
+
│ └── preferences.dsl
|
|
360
|
+
├── orders/
|
|
361
|
+
│ ├── order.dsl
|
|
362
|
+
│ ├── line_item.dsl
|
|
363
|
+
│ └── shipping.dsl
|
|
364
|
+
└── products/
|
|
365
|
+
├── product.dsl
|
|
366
|
+
└── category.dsl
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### 5. Use Unique Constraints
|
|
370
|
+
|
|
371
|
+
```dsl
|
|
372
|
+
User:
|
|
373
|
+
id: uuid(unique: true)
|
|
374
|
+
email: email(unique: true)
|
|
375
|
+
username: text(3..20, unique: true)
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### 6. Set Realistic Ranges
|
|
379
|
+
|
|
380
|
+
```dsl
|
|
381
|
+
# Good - realistic ranges
|
|
382
|
+
User:
|
|
383
|
+
age: number(18..100)
|
|
384
|
+
salary: number(30000..500000)
|
|
385
|
+
|
|
386
|
+
# Avoid - unrealistic ranges
|
|
387
|
+
User:
|
|
388
|
+
age: number(0..1000)
|
|
389
|
+
salary: number(0..999999999)
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## Next Steps
|
|
395
|
+
|
|
396
|
+
- [Core Types](core_types.md) - All built-in types
|
|
397
|
+
- [Field Modifiers](field_modifiers.md) - Optional, nullable, conditional
|
|
398
|
+
- [Complex Types](complex_types.md) - Arrays, objects, references
|
|
399
|
+
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# FakeDataDSL Export Guide
|
|
2
|
+
|
|
3
|
+
FakeDataDSL provides comprehensive export capabilities for both schema structure and generated data.
|
|
4
|
+
|
|
5
|
+
## Export Categories
|
|
6
|
+
|
|
7
|
+
### Schema Exports (Types/Structure)
|
|
8
|
+
Export your schema definitions to different type systems:
|
|
9
|
+
|
|
10
|
+
| Format | Extension | Description |
|
|
11
|
+
|--------|-----------|-------------|
|
|
12
|
+
| `json-schema` | `.schema.json` | JSON Schema (draft 2020-12) |
|
|
13
|
+
| `typescript` / `ts` | `.ts` | TypeScript interfaces |
|
|
14
|
+
| `javascript` / `js` | `.js` | JavaScript with JSDoc types |
|
|
15
|
+
| `python` / `py` / `pydantic` | `.py` | Python Pydantic models |
|
|
16
|
+
| `dataclass` | `.py` | Python dataclasses |
|
|
17
|
+
| `sql` / `sql-ddl` | `.sql` | SQL CREATE TABLE statements |
|
|
18
|
+
| `graphviz` / `dot` | `.dot` | GraphViz diagram |
|
|
19
|
+
|
|
20
|
+
### Data Exports (Generated Records)
|
|
21
|
+
Export generated fake data in various formats:
|
|
22
|
+
|
|
23
|
+
| Format | Extension | Description |
|
|
24
|
+
|--------|-----------|-------------|
|
|
25
|
+
| `json` / `json-data` | `.json` | JSON array of records |
|
|
26
|
+
| `csv` | `.csv` | CSV with headers |
|
|
27
|
+
| `sql-insert` / `insert` | `.sql` | SQL INSERT statements |
|
|
28
|
+
| `yaml` / `yml` | `.yaml` | YAML format |
|
|
29
|
+
| `xml` | `.xml` | XML format |
|
|
30
|
+
|
|
31
|
+
## Ruby API
|
|
32
|
+
|
|
33
|
+
### Schema Exports
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
require "fake_data_dsl"
|
|
37
|
+
|
|
38
|
+
# Load schemas
|
|
39
|
+
registry = FakeDataDSL::Registry.new
|
|
40
|
+
registry.load_dir("schemas/")
|
|
41
|
+
schema = registry.schema("User")
|
|
42
|
+
|
|
43
|
+
# JSON Schema
|
|
44
|
+
json_schema = FakeDataDSL.to_json_schema(schema, registry: registry)
|
|
45
|
+
|
|
46
|
+
# TypeScript
|
|
47
|
+
typescript = FakeDataDSL.to_typescript(schema, registry: registry)
|
|
48
|
+
typescript_all = FakeDataDSL.to_typescript_all(registry) # All schemas
|
|
49
|
+
|
|
50
|
+
# JavaScript with JSDoc
|
|
51
|
+
javascript = FakeDataDSL.to_javascript(schema, registry: registry)
|
|
52
|
+
javascript_all = FakeDataDSL.to_javascript_all(registry)
|
|
53
|
+
|
|
54
|
+
# Python (Pydantic, dataclass, TypedDict)
|
|
55
|
+
pydantic = FakeDataDSL.to_python(schema, style: :pydantic)
|
|
56
|
+
dataclass = FakeDataDSL.to_python(schema, style: :dataclass)
|
|
57
|
+
typed_dict = FakeDataDSL.to_python(schema, style: :typed_dict)
|
|
58
|
+
python_all = FakeDataDSL.to_python_all(registry, style: :pydantic)
|
|
59
|
+
|
|
60
|
+
# SQL CREATE TABLE
|
|
61
|
+
sql_pg = FakeDataDSL.to_sql(schema, dialect: :postgresql)
|
|
62
|
+
sql_mysql = FakeDataDSL.to_sql(schema, dialect: :mysql)
|
|
63
|
+
sql_sqlite = FakeDataDSL.to_sql(schema, dialect: :sqlite)
|
|
64
|
+
sql_all = FakeDataDSL.to_sql_all(registry, dialect: :postgresql)
|
|
65
|
+
|
|
66
|
+
# GraphViz DOT
|
|
67
|
+
dot = FakeDataDSL.to_graphviz(registry: registry)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Data Exports
|
|
71
|
+
|
|
72
|
+
```ruby
|
|
73
|
+
# CSV (headers + data)
|
|
74
|
+
csv = FakeDataDSL.to_csv(schema, count: 100, seed: 12345)
|
|
75
|
+
|
|
76
|
+
# JSON data
|
|
77
|
+
json = FakeDataDSL.to_json(schema, count: 100, pretty: true)
|
|
78
|
+
json_envelope = FakeDataDSL.to_json(schema, count: 50, envelope: "users")
|
|
79
|
+
|
|
80
|
+
# SQL INSERT statements
|
|
81
|
+
sql_insert = FakeDataDSL.to_sql_insert(schema, count: 100, dialect: :postgresql)
|
|
82
|
+
sql_batch = FakeDataDSL.to_sql_insert(schema, count: 1000, dialect: :mysql, batch_insert: true)
|
|
83
|
+
|
|
84
|
+
# YAML
|
|
85
|
+
yaml = FakeDataDSL.to_yaml(schema, count: 20, root_key: "users")
|
|
86
|
+
|
|
87
|
+
# XML
|
|
88
|
+
xml = FakeDataDSL.to_xml(schema, count: 10, root: "users", item: "user")
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Generic Export
|
|
92
|
+
|
|
93
|
+
```ruby
|
|
94
|
+
# Use format name string
|
|
95
|
+
output = FakeDataDSL.export(:typescript, schema)
|
|
96
|
+
output = FakeDataDSL.export("json-schema", schema, registry: registry)
|
|
97
|
+
output = FakeDataDSL.export("sql-insert", schema, count: 100, dialect: :mysql)
|
|
98
|
+
|
|
99
|
+
# List available formats
|
|
100
|
+
FakeDataDSL.export_formats # All formats
|
|
101
|
+
FakeDataDSL.schema_export_formats # Schema formats only
|
|
102
|
+
FakeDataDSL.data_export_formats # Data formats only
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Auto-File Export
|
|
106
|
+
|
|
107
|
+
```ruby
|
|
108
|
+
# Export to auto-generated filename
|
|
109
|
+
path = FakeDataDSL.export_to_file(:typescript, schema, output_dir: "./types")
|
|
110
|
+
# => "./types/user.ts"
|
|
111
|
+
|
|
112
|
+
path = FakeDataDSL.export_to_file(:python, schema, output_dir: "./models")
|
|
113
|
+
# => "./models/user.py"
|
|
114
|
+
|
|
115
|
+
path = FakeDataDSL.export_to_file(:csv, schema, output_dir: "./data", count: 100)
|
|
116
|
+
# => "./data/user.csv"
|
|
117
|
+
|
|
118
|
+
# Get filename for format
|
|
119
|
+
FakeDataDSL.export_filename("User", :typescript) # => "user.ts"
|
|
120
|
+
FakeDataDSL.export_filename("User", :python) # => "user.py"
|
|
121
|
+
FakeDataDSL.export_filename("User", :csv) # => "user.csv"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## CLI Commands
|
|
125
|
+
|
|
126
|
+
### Schema Exports
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# JSON Schema
|
|
130
|
+
fake_data_dsl export User -d schemas -f json-schema -o user.schema.json
|
|
131
|
+
|
|
132
|
+
# TypeScript
|
|
133
|
+
fake_data_dsl export User -d schemas -f typescript -o user.ts
|
|
134
|
+
fake_data_dsl export --all -d schemas -f typescript -o types.ts
|
|
135
|
+
|
|
136
|
+
# JavaScript with JSDoc
|
|
137
|
+
fake_data_dsl export User -d schemas -f javascript -o user.js
|
|
138
|
+
fake_data_dsl export --all -d schemas -f javascript -o types.js
|
|
139
|
+
|
|
140
|
+
# Python (Pydantic, dataclass, TypedDict)
|
|
141
|
+
fake_data_dsl export User -d schemas -f python --style pydantic
|
|
142
|
+
fake_data_dsl export User -d schemas -f python --style dataclass -o models.py
|
|
143
|
+
fake_data_dsl export User -d schemas -f python --style typed_dict
|
|
144
|
+
fake_data_dsl export --all -d schemas -f python -o models.py
|
|
145
|
+
|
|
146
|
+
# SQL CREATE TABLE
|
|
147
|
+
fake_data_dsl export User -d schemas -f sql --dialect postgresql
|
|
148
|
+
fake_data_dsl export User -d schemas -f sql --dialect mysql -o user.sql
|
|
149
|
+
fake_data_dsl export --all -d schemas -f sql --dialect sqlite -o schema.sql
|
|
150
|
+
|
|
151
|
+
# GraphViz
|
|
152
|
+
fake_data_dsl graph schemas/ -o schema.dot --render --format svg
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Auto-File Generation
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Auto-generate filename based on schema name and format
|
|
159
|
+
fake_data_dsl export User -d schemas -f typescript --auto-file
|
|
160
|
+
# Creates: user.ts
|
|
161
|
+
|
|
162
|
+
# Specify output directory (auto-generates filename)
|
|
163
|
+
fake_data_dsl export User -d schemas -f python --out-dir ./generated
|
|
164
|
+
# Creates: ./generated/user.py
|
|
165
|
+
|
|
166
|
+
fake_data_dsl export User -d schemas -f csv -c 100 --out-dir ./data
|
|
167
|
+
# Creates: ./data/user.csv
|
|
168
|
+
|
|
169
|
+
# Multiple exports to same directory
|
|
170
|
+
fake_data_dsl export User -d schemas -f typescript --out-dir ./types
|
|
171
|
+
fake_data_dsl export Order -d schemas -f typescript --out-dir ./types
|
|
172
|
+
# Creates: ./types/user.ts, ./types/order.ts
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Data Exports
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# JSON data
|
|
179
|
+
fake_data_dsl export User -d schemas -f json -c 100 -o users.json
|
|
180
|
+
fake_data_dsl export User -d schemas -f json -c 50 --envelope users
|
|
181
|
+
fake_data_dsl export User -d schemas -f json -c 1000 --compact
|
|
182
|
+
|
|
183
|
+
# CSV
|
|
184
|
+
fake_data_dsl export User -d schemas -f csv -c 1000 -o users.csv
|
|
185
|
+
fake_data_dsl export User -d schemas -f csv -c 100 -s 12345 # With seed
|
|
186
|
+
|
|
187
|
+
# SQL INSERT
|
|
188
|
+
fake_data_dsl export User -d schemas -f sql-insert -c 100 --dialect postgresql
|
|
189
|
+
fake_data_dsl export User -d schemas -f sql-insert -c 1000 --dialect mysql --batch
|
|
190
|
+
fake_data_dsl export User -d schemas -f insert -c 500 -o seed_data.sql
|
|
191
|
+
|
|
192
|
+
# YAML
|
|
193
|
+
fake_data_dsl export User -d schemas -f yaml -c 50 -o users.yaml
|
|
194
|
+
|
|
195
|
+
# XML
|
|
196
|
+
fake_data_dsl export User -d schemas -f xml -c 20 -o users.xml
|
|
197
|
+
fake_data_dsl export User -d schemas -f xml -c 10 --root users --item user
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Export Options Reference
|
|
201
|
+
|
|
202
|
+
### Common Options
|
|
203
|
+
|
|
204
|
+
| Option | Short | Description |
|
|
205
|
+
|--------|-------|-------------|
|
|
206
|
+
| `--dir DIR` | `-d` | Directory containing .dsl files |
|
|
207
|
+
| `--output FILE` | `-o` | Output file (default: stdout) |
|
|
208
|
+
| `--count COUNT` | `-c` | Number of records for data exports |
|
|
209
|
+
| `--seed SEED` | `-s` | Seed for deterministic generation |
|
|
210
|
+
| `--all` | `-a` | Export all schemas (bulk export) |
|
|
211
|
+
|
|
212
|
+
### SQL Options
|
|
213
|
+
|
|
214
|
+
| Option | Description |
|
|
215
|
+
|--------|-------------|
|
|
216
|
+
| `--dialect DIALECT` | `postgresql`, `mysql`, or `sqlite` |
|
|
217
|
+
| `--batch` | Use single INSERT with multiple VALUES |
|
|
218
|
+
|
|
219
|
+
### JSON Options
|
|
220
|
+
|
|
221
|
+
| Option | Description |
|
|
222
|
+
|--------|-------------|
|
|
223
|
+
| `--compact` | Disable pretty-printing |
|
|
224
|
+
| `--envelope KEY` | Wrap output in envelope with metadata |
|
|
225
|
+
|
|
226
|
+
### XML Options
|
|
227
|
+
|
|
228
|
+
| Option | Description |
|
|
229
|
+
|--------|-------------|
|
|
230
|
+
| `--root NAME` | Custom root element name |
|
|
231
|
+
| `--item NAME` | Custom item element name |
|
|
232
|
+
|
|
233
|
+
## Examples
|
|
234
|
+
|
|
235
|
+
### Generate Test Data for API
|
|
236
|
+
|
|
237
|
+
```ruby
|
|
238
|
+
# Generate 1000 users as JSON for API testing
|
|
239
|
+
json = FakeDataDSL.to_json(schema, count: 1000, seed: 42, envelope: "data")
|
|
240
|
+
File.write("test_users.json", json)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Seed Database
|
|
244
|
+
|
|
245
|
+
```ruby
|
|
246
|
+
# Generate SQL INSERTs for seeding PostgreSQL
|
|
247
|
+
sql = FakeDataDSL.to_sql_insert(schema, count: 500, dialect: :postgresql)
|
|
248
|
+
File.write("seed_users.sql", sql)
|
|
249
|
+
|
|
250
|
+
# Or use batch insert for MySQL (faster)
|
|
251
|
+
sql = FakeDataDSL.to_sql_insert(schema, count: 10000, dialect: :mysql, batch_insert: true)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Generate TypeScript Types
|
|
255
|
+
|
|
256
|
+
```ruby
|
|
257
|
+
# Generate TypeScript interfaces for all schemas
|
|
258
|
+
registry = FakeDataDSL::Registry.new
|
|
259
|
+
registry.load_dir("schemas/")
|
|
260
|
+
typescript = FakeDataDSL.to_typescript_all(registry)
|
|
261
|
+
File.write("src/types/api.ts", typescript)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Export for Different Environments
|
|
265
|
+
|
|
266
|
+
```ruby
|
|
267
|
+
# Development: JSON with pretty printing
|
|
268
|
+
dev_data = FakeDataDSL.to_json(schema, count: 10, pretty: true)
|
|
269
|
+
|
|
270
|
+
# Testing: Deterministic CSV
|
|
271
|
+
test_data = FakeDataDSL.to_csv(schema, count: 100, seed: 12345)
|
|
272
|
+
|
|
273
|
+
# Production seeding: SQL batch insert
|
|
274
|
+
prod_sql = FakeDataDSL.to_sql_insert(schema, count: 10000, batch_insert: true)
|
|
275
|
+
```
|
|
276
|
+
|