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,707 @@
|
|
|
1
|
+
# CI/CD Integration
|
|
2
|
+
|
|
3
|
+
Setting up FakeDataDSL in continuous integration pipelines.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [GitHub Actions](#github-actions)
|
|
9
|
+
- [GitLab CI](#gitlab-ci)
|
|
10
|
+
- [CircleCI](#circleci)
|
|
11
|
+
- [Jenkins](#jenkins)
|
|
12
|
+
- [Schema Validation](#schema-validation)
|
|
13
|
+
- [Test Data Generation](#test-data-generation)
|
|
14
|
+
- [Best Practices](#best-practices)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
FakeDataDSL can be integrated into CI/CD pipelines for:
|
|
21
|
+
|
|
22
|
+
1. **Schema Validation** - Validate DSL files before deployment
|
|
23
|
+
2. **Test Data Generation** - Generate consistent test data
|
|
24
|
+
3. **Database Seeding** - Populate staging environments
|
|
25
|
+
4. **Load Testing** - Generate data for performance tests
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## GitHub Actions
|
|
30
|
+
|
|
31
|
+
### Basic Workflow
|
|
32
|
+
|
|
33
|
+
Create `.github/workflows/test.yml`:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
name: Test
|
|
37
|
+
|
|
38
|
+
on:
|
|
39
|
+
push:
|
|
40
|
+
branches: [main, develop]
|
|
41
|
+
pull_request:
|
|
42
|
+
branches: [main]
|
|
43
|
+
|
|
44
|
+
jobs:
|
|
45
|
+
test:
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/checkout@v4
|
|
50
|
+
|
|
51
|
+
- name: Set up Ruby
|
|
52
|
+
uses: ruby/setup-ruby@v1
|
|
53
|
+
with:
|
|
54
|
+
ruby-version: '3.3'
|
|
55
|
+
bundler-cache: true
|
|
56
|
+
|
|
57
|
+
- name: Validate schemas
|
|
58
|
+
run: |
|
|
59
|
+
bundle exec fake_data_dsl validate schemas/*.dsl
|
|
60
|
+
|
|
61
|
+
- name: Run tests
|
|
62
|
+
run: bundle exec rspec
|
|
63
|
+
env:
|
|
64
|
+
FAKE_DATA_SEED: ${{ github.run_id }}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Schema Validation Workflow
|
|
68
|
+
|
|
69
|
+
Create `.github/workflows/validate-schemas.yml`:
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
name: Validate Schemas
|
|
73
|
+
|
|
74
|
+
on:
|
|
75
|
+
push:
|
|
76
|
+
paths:
|
|
77
|
+
- 'schemas/**'
|
|
78
|
+
- 'db/schemas/**'
|
|
79
|
+
- 'spec/schemas/**'
|
|
80
|
+
pull_request:
|
|
81
|
+
paths:
|
|
82
|
+
- 'schemas/**'
|
|
83
|
+
|
|
84
|
+
jobs:
|
|
85
|
+
validate:
|
|
86
|
+
runs-on: ubuntu-latest
|
|
87
|
+
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v4
|
|
90
|
+
|
|
91
|
+
- name: Set up Ruby
|
|
92
|
+
uses: ruby/setup-ruby@v1
|
|
93
|
+
with:
|
|
94
|
+
ruby-version: '3.3'
|
|
95
|
+
bundler-cache: true
|
|
96
|
+
|
|
97
|
+
- name: Validate all schemas
|
|
98
|
+
run: |
|
|
99
|
+
echo "Validating schemas..."
|
|
100
|
+
for file in schemas/*.dsl db/schemas/*.dsl spec/schemas/*.dsl; do
|
|
101
|
+
if [ -f "$file" ]; then
|
|
102
|
+
echo "Checking $file..."
|
|
103
|
+
bundle exec fake_data_dsl validate "$file"
|
|
104
|
+
fi
|
|
105
|
+
done
|
|
106
|
+
|
|
107
|
+
- name: Test schema generation
|
|
108
|
+
run: |
|
|
109
|
+
echo "Testing generation..."
|
|
110
|
+
for file in schemas/*.dsl; do
|
|
111
|
+
if [ -f "$file" ]; then
|
|
112
|
+
schema_name=$(basename "$file" .dsl | sed 's/.*/\u&/')
|
|
113
|
+
echo "Generating $schema_name..."
|
|
114
|
+
bundle exec fake_data_dsl generate "$schema_name" -d schemas -c 5
|
|
115
|
+
fi
|
|
116
|
+
done
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Generate Test Fixtures
|
|
120
|
+
|
|
121
|
+
Create `.github/workflows/generate-fixtures.yml`:
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
name: Generate Test Fixtures
|
|
125
|
+
|
|
126
|
+
on:
|
|
127
|
+
workflow_dispatch:
|
|
128
|
+
inputs:
|
|
129
|
+
count:
|
|
130
|
+
description: 'Number of records per schema'
|
|
131
|
+
required: false
|
|
132
|
+
default: '100'
|
|
133
|
+
seed:
|
|
134
|
+
description: 'Random seed for reproducibility'
|
|
135
|
+
required: false
|
|
136
|
+
default: '12345'
|
|
137
|
+
|
|
138
|
+
jobs:
|
|
139
|
+
generate:
|
|
140
|
+
runs-on: ubuntu-latest
|
|
141
|
+
|
|
142
|
+
steps:
|
|
143
|
+
- uses: actions/checkout@v4
|
|
144
|
+
|
|
145
|
+
- name: Set up Ruby
|
|
146
|
+
uses: ruby/setup-ruby@v1
|
|
147
|
+
with:
|
|
148
|
+
ruby-version: '3.3'
|
|
149
|
+
bundler-cache: true
|
|
150
|
+
|
|
151
|
+
- name: Generate fixtures
|
|
152
|
+
run: |
|
|
153
|
+
mkdir -p fixtures
|
|
154
|
+
|
|
155
|
+
bundle exec fake_data_dsl generate User \
|
|
156
|
+
-d schemas \
|
|
157
|
+
-c ${{ inputs.count }} \
|
|
158
|
+
-s ${{ inputs.seed }} \
|
|
159
|
+
--pretty > fixtures/users.json
|
|
160
|
+
|
|
161
|
+
bundle exec fake_data_dsl generate Order \
|
|
162
|
+
-d schemas \
|
|
163
|
+
-c ${{ inputs.count }} \
|
|
164
|
+
-s ${{ inputs.seed }} \
|
|
165
|
+
--pretty > fixtures/orders.json
|
|
166
|
+
|
|
167
|
+
- name: Upload fixtures
|
|
168
|
+
uses: actions/upload-artifact@v4
|
|
169
|
+
with:
|
|
170
|
+
name: test-fixtures
|
|
171
|
+
path: fixtures/
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## GitLab CI
|
|
177
|
+
|
|
178
|
+
### Basic Pipeline
|
|
179
|
+
|
|
180
|
+
Create `.gitlab-ci.yml`:
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
stages:
|
|
184
|
+
- validate
|
|
185
|
+
- test
|
|
186
|
+
- generate
|
|
187
|
+
|
|
188
|
+
variables:
|
|
189
|
+
FAKE_DATA_SEED: $CI_PIPELINE_ID
|
|
190
|
+
|
|
191
|
+
validate-schemas:
|
|
192
|
+
stage: validate
|
|
193
|
+
image: ruby:3.3
|
|
194
|
+
before_script:
|
|
195
|
+
- bundle install
|
|
196
|
+
script:
|
|
197
|
+
- bundle exec fake_data_dsl validate schemas/*.dsl
|
|
198
|
+
only:
|
|
199
|
+
changes:
|
|
200
|
+
- schemas/**/*
|
|
201
|
+
|
|
202
|
+
test:
|
|
203
|
+
stage: test
|
|
204
|
+
image: ruby:3.3
|
|
205
|
+
before_script:
|
|
206
|
+
- bundle install
|
|
207
|
+
script:
|
|
208
|
+
- bundle exec rspec
|
|
209
|
+
artifacts:
|
|
210
|
+
reports:
|
|
211
|
+
junit: rspec.xml
|
|
212
|
+
|
|
213
|
+
generate-fixtures:
|
|
214
|
+
stage: generate
|
|
215
|
+
image: ruby:3.3
|
|
216
|
+
before_script:
|
|
217
|
+
- bundle install
|
|
218
|
+
script:
|
|
219
|
+
- mkdir -p fixtures
|
|
220
|
+
- |
|
|
221
|
+
for schema in User Order Product; do
|
|
222
|
+
bundle exec fake_data_dsl generate $schema \
|
|
223
|
+
-d schemas -c 100 -s $FAKE_DATA_SEED \
|
|
224
|
+
--ndjson > fixtures/${schema,,}.ndjson
|
|
225
|
+
done
|
|
226
|
+
artifacts:
|
|
227
|
+
paths:
|
|
228
|
+
- fixtures/
|
|
229
|
+
expire_in: 1 week
|
|
230
|
+
only:
|
|
231
|
+
- tags
|
|
232
|
+
- schedules
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Staging Environment Seeding
|
|
236
|
+
|
|
237
|
+
```yaml
|
|
238
|
+
seed-staging:
|
|
239
|
+
stage: deploy
|
|
240
|
+
image: ruby:3.3
|
|
241
|
+
environment:
|
|
242
|
+
name: staging
|
|
243
|
+
before_script:
|
|
244
|
+
- bundle install
|
|
245
|
+
script:
|
|
246
|
+
- |
|
|
247
|
+
# Generate seed data
|
|
248
|
+
bundle exec fake_data_dsl generate User \
|
|
249
|
+
-d schemas -c 1000 -s 12345 \
|
|
250
|
+
--ndjson > /tmp/users.ndjson
|
|
251
|
+
|
|
252
|
+
# Import to staging database
|
|
253
|
+
psql $STAGING_DATABASE_URL -c "
|
|
254
|
+
COPY users (id, name, email, created_at)
|
|
255
|
+
FROM '/tmp/users.ndjson'
|
|
256
|
+
WITH (FORMAT csv)
|
|
257
|
+
"
|
|
258
|
+
only:
|
|
259
|
+
- develop
|
|
260
|
+
when: manual
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## CircleCI
|
|
266
|
+
|
|
267
|
+
### Configuration
|
|
268
|
+
|
|
269
|
+
Create `.circleci/config.yml`:
|
|
270
|
+
|
|
271
|
+
```yaml
|
|
272
|
+
version: 2.1
|
|
273
|
+
|
|
274
|
+
orbs:
|
|
275
|
+
ruby: circleci/ruby@2.1
|
|
276
|
+
|
|
277
|
+
jobs:
|
|
278
|
+
validate-schemas:
|
|
279
|
+
docker:
|
|
280
|
+
- image: cimg/ruby:3.3
|
|
281
|
+
steps:
|
|
282
|
+
- checkout
|
|
283
|
+
- ruby/install-deps
|
|
284
|
+
- run:
|
|
285
|
+
name: Validate schemas
|
|
286
|
+
command: |
|
|
287
|
+
bundle exec fake_data_dsl validate schemas/*.dsl
|
|
288
|
+
bundle exec fake_data_dsl validate spec/schemas/*.dsl
|
|
289
|
+
|
|
290
|
+
test:
|
|
291
|
+
docker:
|
|
292
|
+
- image: cimg/ruby:3.3
|
|
293
|
+
- image: cimg/postgres:15.0
|
|
294
|
+
environment:
|
|
295
|
+
POSTGRES_USER: test
|
|
296
|
+
POSTGRES_DB: test_db
|
|
297
|
+
environment:
|
|
298
|
+
FAKE_DATA_SEED: << pipeline.number >>
|
|
299
|
+
steps:
|
|
300
|
+
- checkout
|
|
301
|
+
- ruby/install-deps
|
|
302
|
+
- run:
|
|
303
|
+
name: Setup database
|
|
304
|
+
command: bundle exec rails db:setup
|
|
305
|
+
- run:
|
|
306
|
+
name: Run tests
|
|
307
|
+
command: bundle exec rspec
|
|
308
|
+
|
|
309
|
+
generate-fixtures:
|
|
310
|
+
docker:
|
|
311
|
+
- image: cimg/ruby:3.3
|
|
312
|
+
steps:
|
|
313
|
+
- checkout
|
|
314
|
+
- ruby/install-deps
|
|
315
|
+
- run:
|
|
316
|
+
name: Generate fixtures
|
|
317
|
+
command: |
|
|
318
|
+
mkdir -p fixtures
|
|
319
|
+
bundle exec fake_data_dsl generate User -d schemas -c 100 --pretty > fixtures/users.json
|
|
320
|
+
- store_artifacts:
|
|
321
|
+
path: fixtures
|
|
322
|
+
destination: test-fixtures
|
|
323
|
+
|
|
324
|
+
workflows:
|
|
325
|
+
test-and-validate:
|
|
326
|
+
jobs:
|
|
327
|
+
- validate-schemas
|
|
328
|
+
- test:
|
|
329
|
+
requires:
|
|
330
|
+
- validate-schemas
|
|
331
|
+
- generate-fixtures:
|
|
332
|
+
requires:
|
|
333
|
+
- test
|
|
334
|
+
filters:
|
|
335
|
+
branches:
|
|
336
|
+
only: main
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Jenkins
|
|
342
|
+
|
|
343
|
+
### Jenkinsfile
|
|
344
|
+
|
|
345
|
+
```groovy
|
|
346
|
+
pipeline {
|
|
347
|
+
agent any
|
|
348
|
+
|
|
349
|
+
environment {
|
|
350
|
+
FAKE_DATA_SEED = "${BUILD_NUMBER}"
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
stages {
|
|
354
|
+
stage('Setup') {
|
|
355
|
+
steps {
|
|
356
|
+
sh 'bundle install'
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
stage('Validate Schemas') {
|
|
361
|
+
steps {
|
|
362
|
+
sh '''
|
|
363
|
+
for file in schemas/*.dsl; do
|
|
364
|
+
echo "Validating $file..."
|
|
365
|
+
bundle exec fake_data_dsl validate "$file"
|
|
366
|
+
done
|
|
367
|
+
'''
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
stage('Test') {
|
|
372
|
+
steps {
|
|
373
|
+
sh 'bundle exec rspec --format RspecJunitFormatter --out rspec.xml'
|
|
374
|
+
}
|
|
375
|
+
post {
|
|
376
|
+
always {
|
|
377
|
+
junit 'rspec.xml'
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
stage('Generate Fixtures') {
|
|
383
|
+
when {
|
|
384
|
+
branch 'main'
|
|
385
|
+
}
|
|
386
|
+
steps {
|
|
387
|
+
sh '''
|
|
388
|
+
mkdir -p fixtures
|
|
389
|
+
bundle exec fake_data_dsl generate User \
|
|
390
|
+
-d schemas -c 100 -s ${FAKE_DATA_SEED} \
|
|
391
|
+
--pretty > fixtures/users.json
|
|
392
|
+
'''
|
|
393
|
+
}
|
|
394
|
+
post {
|
|
395
|
+
success {
|
|
396
|
+
archiveArtifacts artifacts: 'fixtures/*.json'
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
stage('Seed Staging') {
|
|
402
|
+
when {
|
|
403
|
+
branch 'develop'
|
|
404
|
+
}
|
|
405
|
+
steps {
|
|
406
|
+
withCredentials([string(credentialsId: 'staging-db-url', variable: 'DATABASE_URL')]) {
|
|
407
|
+
sh '''
|
|
408
|
+
bundle exec fake_data_dsl generate User \
|
|
409
|
+
-d schemas -c 1000 -s 12345 \
|
|
410
|
+
--ndjson | \
|
|
411
|
+
psql ${DATABASE_URL} -c "COPY users FROM STDIN"
|
|
412
|
+
'''
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## Schema Validation
|
|
423
|
+
|
|
424
|
+
### Pre-commit Hook
|
|
425
|
+
|
|
426
|
+
Create `.git/hooks/pre-commit`:
|
|
427
|
+
|
|
428
|
+
```bash
|
|
429
|
+
#!/bin/bash
|
|
430
|
+
|
|
431
|
+
# Validate changed schema files
|
|
432
|
+
changed_schemas=$(git diff --cached --name-only --diff-filter=ACM | grep '\.dsl$')
|
|
433
|
+
|
|
434
|
+
if [ -n "$changed_schemas" ]; then
|
|
435
|
+
echo "Validating schema files..."
|
|
436
|
+
|
|
437
|
+
for file in $changed_schemas; do
|
|
438
|
+
echo " Checking $file..."
|
|
439
|
+
if ! bundle exec fake_data_dsl validate "$file" 2>&1; then
|
|
440
|
+
echo "❌ Schema validation failed for $file"
|
|
441
|
+
exit 1
|
|
442
|
+
fi
|
|
443
|
+
done
|
|
444
|
+
|
|
445
|
+
echo "✅ All schemas valid"
|
|
446
|
+
fi
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Make it executable:
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
chmod +x .git/hooks/pre-commit
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Validation Script
|
|
456
|
+
|
|
457
|
+
Create `scripts/validate_schemas.sh`:
|
|
458
|
+
|
|
459
|
+
```bash
|
|
460
|
+
#!/bin/bash
|
|
461
|
+
set -e
|
|
462
|
+
|
|
463
|
+
echo "========================================"
|
|
464
|
+
echo "FakeDataDSL Schema Validation"
|
|
465
|
+
echo "========================================"
|
|
466
|
+
|
|
467
|
+
SCHEMA_DIRS=("schemas" "db/schemas" "spec/schemas")
|
|
468
|
+
ERRORS=0
|
|
469
|
+
|
|
470
|
+
for dir in "${SCHEMA_DIRS[@]}"; do
|
|
471
|
+
if [ -d "$dir" ]; then
|
|
472
|
+
echo ""
|
|
473
|
+
echo "Checking $dir/..."
|
|
474
|
+
|
|
475
|
+
for file in "$dir"/*.dsl; do
|
|
476
|
+
if [ -f "$file" ]; then
|
|
477
|
+
echo -n " $(basename "$file")... "
|
|
478
|
+
|
|
479
|
+
if bundle exec fake_data_dsl validate "$file" > /dev/null 2>&1; then
|
|
480
|
+
echo "✓"
|
|
481
|
+
else
|
|
482
|
+
echo "✗"
|
|
483
|
+
bundle exec fake_data_dsl validate "$file" 2>&1 | sed 's/^/ /'
|
|
484
|
+
ERRORS=$((ERRORS + 1))
|
|
485
|
+
fi
|
|
486
|
+
fi
|
|
487
|
+
done
|
|
488
|
+
fi
|
|
489
|
+
done
|
|
490
|
+
|
|
491
|
+
echo ""
|
|
492
|
+
echo "========================================"
|
|
493
|
+
|
|
494
|
+
if [ $ERRORS -gt 0 ]; then
|
|
495
|
+
echo "❌ $ERRORS schema(s) failed validation"
|
|
496
|
+
exit 1
|
|
497
|
+
else
|
|
498
|
+
echo "✅ All schemas valid"
|
|
499
|
+
exit 0
|
|
500
|
+
fi
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
## Test Data Generation
|
|
506
|
+
|
|
507
|
+
### Fixture Generation Script
|
|
508
|
+
|
|
509
|
+
Create `scripts/generate_fixtures.rb`:
|
|
510
|
+
|
|
511
|
+
```ruby
|
|
512
|
+
#!/usr/bin/env ruby
|
|
513
|
+
require 'fake_data_dsl'
|
|
514
|
+
require 'json'
|
|
515
|
+
require 'fileutils'
|
|
516
|
+
|
|
517
|
+
# Configuration
|
|
518
|
+
SEED = ENV.fetch('SEED', 12345).to_i
|
|
519
|
+
OUTPUT_DIR = ENV.fetch('OUTPUT_DIR', 'fixtures')
|
|
520
|
+
SCHEMAS_DIR = ENV.fetch('SCHEMAS_DIR', 'schemas')
|
|
521
|
+
|
|
522
|
+
# Records per schema
|
|
523
|
+
COUNTS = {
|
|
524
|
+
'User' => 100,
|
|
525
|
+
'Order' => 500,
|
|
526
|
+
'Product' => 200
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
# Setup
|
|
530
|
+
FileUtils.mkdir_p(OUTPUT_DIR)
|
|
531
|
+
registry = FakeDataDSL::Registry.new
|
|
532
|
+
registry.load_dir(SCHEMAS_DIR)
|
|
533
|
+
|
|
534
|
+
puts "Generating fixtures (seed: #{SEED})..."
|
|
535
|
+
|
|
536
|
+
COUNTS.each do |schema_name, count|
|
|
537
|
+
output_file = File.join(OUTPUT_DIR, "#{schema_name.downcase}.json")
|
|
538
|
+
|
|
539
|
+
print " #{schema_name} (#{count} records)... "
|
|
540
|
+
|
|
541
|
+
schema = registry.schema(schema_name)
|
|
542
|
+
data = schema.generate_many(count, seed: SEED)
|
|
543
|
+
|
|
544
|
+
File.write(output_file, JSON.pretty_generate(data))
|
|
545
|
+
|
|
546
|
+
puts "✓ #{output_file}"
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
puts "Done!"
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### Load Testing Data Generation
|
|
553
|
+
|
|
554
|
+
Create `scripts/generate_load_test_data.sh`:
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
#!/bin/bash
|
|
558
|
+
set -e
|
|
559
|
+
|
|
560
|
+
COUNT=${1:-100000}
|
|
561
|
+
SEED=${2:-12345}
|
|
562
|
+
OUTPUT_DIR="load_test_data"
|
|
563
|
+
|
|
564
|
+
echo "Generating load test data..."
|
|
565
|
+
echo " Count: $COUNT"
|
|
566
|
+
echo " Seed: $SEED"
|
|
567
|
+
echo ""
|
|
568
|
+
|
|
569
|
+
mkdir -p "$OUTPUT_DIR"
|
|
570
|
+
|
|
571
|
+
# Generate large datasets using streaming
|
|
572
|
+
for schema in User Order Product; do
|
|
573
|
+
echo "Generating $schema..."
|
|
574
|
+
bundle exec fake_data_dsl generate "$schema" \
|
|
575
|
+
-d schemas \
|
|
576
|
+
-c "$COUNT" \
|
|
577
|
+
-s "$SEED" \
|
|
578
|
+
--ndjson > "$OUTPUT_DIR/${schema,,}.ndjson"
|
|
579
|
+
|
|
580
|
+
lines=$(wc -l < "$OUTPUT_DIR/${schema,,}.ndjson")
|
|
581
|
+
size=$(du -h "$OUTPUT_DIR/${schema,,}.ndjson" | cut -f1)
|
|
582
|
+
echo " → $lines records, $size"
|
|
583
|
+
done
|
|
584
|
+
|
|
585
|
+
echo ""
|
|
586
|
+
echo "Load test data ready in $OUTPUT_DIR/"
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## Best Practices
|
|
592
|
+
|
|
593
|
+
### 1. Use Deterministic Seeds
|
|
594
|
+
|
|
595
|
+
```yaml
|
|
596
|
+
# Use CI variables for reproducible builds
|
|
597
|
+
env:
|
|
598
|
+
FAKE_DATA_SEED: ${{ github.run_id }} # GitHub Actions
|
|
599
|
+
FAKE_DATA_SEED: $CI_PIPELINE_ID # GitLab
|
|
600
|
+
FAKE_DATA_SEED: ${BUILD_NUMBER} # Jenkins
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### 2. Cache Dependencies
|
|
604
|
+
|
|
605
|
+
```yaml
|
|
606
|
+
# GitHub Actions
|
|
607
|
+
- uses: ruby/setup-ruby@v1
|
|
608
|
+
with:
|
|
609
|
+
bundler-cache: true
|
|
610
|
+
|
|
611
|
+
# GitLab CI
|
|
612
|
+
cache:
|
|
613
|
+
paths:
|
|
614
|
+
- vendor/bundle
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
### 3. Fail Fast on Schema Errors
|
|
618
|
+
|
|
619
|
+
```yaml
|
|
620
|
+
- name: Validate schemas
|
|
621
|
+
run: |
|
|
622
|
+
set -e # Exit on first error
|
|
623
|
+
bundle exec fake_data_dsl validate schemas/*.dsl
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
### 4. Generate Artifacts
|
|
627
|
+
|
|
628
|
+
```yaml
|
|
629
|
+
# Store generated data as artifacts
|
|
630
|
+
- uses: actions/upload-artifact@v4
|
|
631
|
+
with:
|
|
632
|
+
name: test-data
|
|
633
|
+
path: fixtures/
|
|
634
|
+
retention-days: 7
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
### 5. Separate Validation and Generation
|
|
638
|
+
|
|
639
|
+
```yaml
|
|
640
|
+
jobs:
|
|
641
|
+
validate:
|
|
642
|
+
# Run on all PRs
|
|
643
|
+
|
|
644
|
+
generate:
|
|
645
|
+
needs: validate
|
|
646
|
+
# Only run on main/tags
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
### 6. Environment-Specific Seeds
|
|
650
|
+
|
|
651
|
+
```ruby
|
|
652
|
+
# config/initializers/fake_data_dsl.rb
|
|
653
|
+
SEED = case Rails.env
|
|
654
|
+
when 'test' then ENV.fetch('FAKE_DATA_SEED', 12345).to_i
|
|
655
|
+
when 'staging' then Date.today.to_time.to_i # Daily variation
|
|
656
|
+
when 'development' then rand(1..10000)
|
|
657
|
+
end
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
### 7. Monitor Generation Time
|
|
661
|
+
|
|
662
|
+
```yaml
|
|
663
|
+
- name: Generate with timing
|
|
664
|
+
run: |
|
|
665
|
+
time bundle exec fake_data_dsl generate User \
|
|
666
|
+
-d schemas -c 10000 --ndjson > /dev/null
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
---
|
|
670
|
+
|
|
671
|
+
## Troubleshooting
|
|
672
|
+
|
|
673
|
+
### Common Issues
|
|
674
|
+
|
|
675
|
+
**1. Schema not found**
|
|
676
|
+
```yaml
|
|
677
|
+
# Ensure schemas directory is correct
|
|
678
|
+
- run: ls -la schemas/
|
|
679
|
+
- run: bundle exec fake_data_dsl validate schemas/user.dsl
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
**2. Memory issues with large datasets**
|
|
683
|
+
```yaml
|
|
684
|
+
# Use streaming for large counts
|
|
685
|
+
- run: |
|
|
686
|
+
bundle exec fake_data_dsl generate User \
|
|
687
|
+
-d schemas -c 1000000 \
|
|
688
|
+
--ndjson > data.ndjson # Streams to file
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
**3. Reproducibility issues**
|
|
692
|
+
```yaml
|
|
693
|
+
# Always use explicit seeds
|
|
694
|
+
- run: |
|
|
695
|
+
bundle exec fake_data_dsl generate User \
|
|
696
|
+
-d schemas -c 100 \
|
|
697
|
+
-s 12345 # Explicit seed
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
---
|
|
701
|
+
|
|
702
|
+
## Next Steps
|
|
703
|
+
|
|
704
|
+
- [RSpec Integration](rspec.md) - Testing patterns
|
|
705
|
+
- [Rails Integration](rails.md) - Rails setup
|
|
706
|
+
- [Streaming Generation](../advanced/streaming.md) - Large datasets
|
|
707
|
+
|