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,579 @@
|
|
|
1
|
+
# CI/CD Integration Guide
|
|
2
|
+
|
|
3
|
+
Complete guide for integrating FakeDataDSL validation into your CI/CD pipelines.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Quick Start](#quick-start)
|
|
9
|
+
- [GitHub Actions](#github-actions)
|
|
10
|
+
- [GitLab CI](#gitlab-ci)
|
|
11
|
+
- [CircleCI](#circleci)
|
|
12
|
+
- [Jenkins](#jenkins)
|
|
13
|
+
- [Pre-commit Hooks](#pre-commit-hooks)
|
|
14
|
+
- [Exit Codes](#exit-codes)
|
|
15
|
+
- [Best Practices](#best-practices)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Overview
|
|
20
|
+
|
|
21
|
+
FakeDataDSL provides a `lint` command with `--strict` mode specifically designed for CI pipelines. This ensures schema quality and catches errors before they reach production.
|
|
22
|
+
|
|
23
|
+
### Why Integrate in CI?
|
|
24
|
+
|
|
25
|
+
| Benefit | Description |
|
|
26
|
+
|---------|-------------|
|
|
27
|
+
| **Early Detection** | Catch schema errors before merge |
|
|
28
|
+
| **Consistency** | Enforce team-wide schema standards |
|
|
29
|
+
| **Documentation** | Schema info in PR reviews |
|
|
30
|
+
| **Safety** | Prevent broken schemas in production |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
### Basic Validation
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Validate all schemas in a directory
|
|
40
|
+
fake_data_dsl lint schemas/
|
|
41
|
+
|
|
42
|
+
# Strict mode - treat warnings as errors
|
|
43
|
+
fake_data_dsl lint schemas/ --strict
|
|
44
|
+
|
|
45
|
+
# Verbose output for debugging
|
|
46
|
+
fake_data_dsl lint schemas/ --strict --verbose
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Exit Codes
|
|
50
|
+
|
|
51
|
+
| Code | Meaning | CI Behavior |
|
|
52
|
+
|------|---------|-------------|
|
|
53
|
+
| `0` | Success, no issues | ✅ Pass |
|
|
54
|
+
| `1` | Warnings found (non-strict mode passes) | ⚠️ Pass (non-strict) |
|
|
55
|
+
| `2` | Errors found | ❌ Fail |
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## GitHub Actions
|
|
60
|
+
|
|
61
|
+
### Basic Workflow
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
# .github/workflows/schema-validation.yml
|
|
65
|
+
name: Schema Validation
|
|
66
|
+
|
|
67
|
+
on:
|
|
68
|
+
push:
|
|
69
|
+
paths:
|
|
70
|
+
- 'schemas/**/*.dsl'
|
|
71
|
+
pull_request:
|
|
72
|
+
paths:
|
|
73
|
+
- 'schemas/**/*.dsl'
|
|
74
|
+
|
|
75
|
+
jobs:
|
|
76
|
+
validate:
|
|
77
|
+
runs-on: ubuntu-latest
|
|
78
|
+
|
|
79
|
+
steps:
|
|
80
|
+
- uses: actions/checkout@v4
|
|
81
|
+
|
|
82
|
+
- name: Set up Ruby
|
|
83
|
+
uses: ruby/setup-ruby@v1
|
|
84
|
+
with:
|
|
85
|
+
ruby-version: '3.3'
|
|
86
|
+
bundler-cache: true
|
|
87
|
+
|
|
88
|
+
- name: Install FakeDataDSL
|
|
89
|
+
run: gem install fake_data_dsl
|
|
90
|
+
|
|
91
|
+
- name: Validate Schemas
|
|
92
|
+
run: fake_data_dsl lint schemas/ --strict --verbose
|
|
93
|
+
|
|
94
|
+
- name: Generate Schema Info
|
|
95
|
+
run: fake_data_dsl info schemas/ --verbose
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### With Schema Diff on PR
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
# .github/workflows/schema-review.yml
|
|
102
|
+
name: Schema Review
|
|
103
|
+
|
|
104
|
+
on:
|
|
105
|
+
pull_request:
|
|
106
|
+
paths:
|
|
107
|
+
- 'schemas/**/*.dsl'
|
|
108
|
+
|
|
109
|
+
jobs:
|
|
110
|
+
review:
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
|
|
113
|
+
steps:
|
|
114
|
+
- uses: actions/checkout@v4
|
|
115
|
+
with:
|
|
116
|
+
fetch-depth: 0 # Full history for diff
|
|
117
|
+
|
|
118
|
+
- name: Set up Ruby
|
|
119
|
+
uses: ruby/setup-ruby@v1
|
|
120
|
+
with:
|
|
121
|
+
ruby-version: '3.3'
|
|
122
|
+
bundler-cache: true
|
|
123
|
+
|
|
124
|
+
- name: Install FakeDataDSL
|
|
125
|
+
run: gem install fake_data_dsl
|
|
126
|
+
|
|
127
|
+
- name: Lint Schemas
|
|
128
|
+
run: fake_data_dsl lint schemas/ --strict
|
|
129
|
+
|
|
130
|
+
- name: Checkout Base Branch
|
|
131
|
+
run: git checkout ${{ github.base_ref }} -- schemas/ 2>/dev/null || true
|
|
132
|
+
continue-on-error: true
|
|
133
|
+
|
|
134
|
+
- name: Schema Diff
|
|
135
|
+
run: |
|
|
136
|
+
if [ -d "schemas_base" ]; then
|
|
137
|
+
fake_data_dsl diff schemas_base/ schemas/
|
|
138
|
+
else
|
|
139
|
+
echo "No base schemas to compare"
|
|
140
|
+
fi
|
|
141
|
+
continue-on-error: true
|
|
142
|
+
|
|
143
|
+
- name: Preview Sample Data
|
|
144
|
+
run: |
|
|
145
|
+
for schema in $(fake_data_dsl info schemas/ --format json | jq -r '.schemas[].name'); do
|
|
146
|
+
echo "=== $schema ==="
|
|
147
|
+
fake_data_dsl preview $schema --dir schemas/ --pretty
|
|
148
|
+
done
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Matrix Testing Multiple Ruby Versions
|
|
152
|
+
|
|
153
|
+
```yaml
|
|
154
|
+
# .github/workflows/compatibility.yml
|
|
155
|
+
name: Compatibility
|
|
156
|
+
|
|
157
|
+
on: [push, pull_request]
|
|
158
|
+
|
|
159
|
+
jobs:
|
|
160
|
+
test:
|
|
161
|
+
runs-on: ubuntu-latest
|
|
162
|
+
strategy:
|
|
163
|
+
matrix:
|
|
164
|
+
ruby: ['3.1', '3.2', '3.3']
|
|
165
|
+
|
|
166
|
+
steps:
|
|
167
|
+
- uses: actions/checkout@v4
|
|
168
|
+
|
|
169
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
|
170
|
+
uses: ruby/setup-ruby@v1
|
|
171
|
+
with:
|
|
172
|
+
ruby-version: ${{ matrix.ruby }}
|
|
173
|
+
bundler-cache: true
|
|
174
|
+
|
|
175
|
+
- name: Install FakeDataDSL
|
|
176
|
+
run: gem install fake_data_dsl
|
|
177
|
+
|
|
178
|
+
- name: Validate Schemas
|
|
179
|
+
run: fake_data_dsl lint schemas/ --strict
|
|
180
|
+
|
|
181
|
+
- name: Run Generation Tests
|
|
182
|
+
run: |
|
|
183
|
+
fake_data_dsl generate User --dir schemas/ --count 100 --seed 12345 > /dev/null
|
|
184
|
+
echo "Generation successful"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## GitLab CI
|
|
190
|
+
|
|
191
|
+
### Basic Pipeline
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
# .gitlab-ci.yml
|
|
195
|
+
stages:
|
|
196
|
+
- validate
|
|
197
|
+
- test
|
|
198
|
+
|
|
199
|
+
variables:
|
|
200
|
+
RUBY_VERSION: "3.3"
|
|
201
|
+
|
|
202
|
+
schema-lint:
|
|
203
|
+
stage: validate
|
|
204
|
+
image: ruby:${RUBY_VERSION}
|
|
205
|
+
before_script:
|
|
206
|
+
- gem install fake_data_dsl
|
|
207
|
+
script:
|
|
208
|
+
- fake_data_dsl lint schemas/ --strict --verbose
|
|
209
|
+
rules:
|
|
210
|
+
- changes:
|
|
211
|
+
- schemas/**/*.dsl
|
|
212
|
+
|
|
213
|
+
schema-preview:
|
|
214
|
+
stage: test
|
|
215
|
+
image: ruby:${RUBY_VERSION}
|
|
216
|
+
before_script:
|
|
217
|
+
- gem install fake_data_dsl
|
|
218
|
+
script:
|
|
219
|
+
- fake_data_dsl info schemas/ --verbose
|
|
220
|
+
- |
|
|
221
|
+
for schema in User Order Product; do
|
|
222
|
+
echo "=== Preview: $schema ==="
|
|
223
|
+
fake_data_dsl preview $schema --dir schemas/ --pretty || true
|
|
224
|
+
done
|
|
225
|
+
artifacts:
|
|
226
|
+
reports:
|
|
227
|
+
dotenv: schema-info.env
|
|
228
|
+
rules:
|
|
229
|
+
- changes:
|
|
230
|
+
- schemas/**/*.dsl
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### With MR Comments
|
|
234
|
+
|
|
235
|
+
```yaml
|
|
236
|
+
# .gitlab-ci.yml
|
|
237
|
+
schema-review:
|
|
238
|
+
stage: validate
|
|
239
|
+
image: ruby:3.3
|
|
240
|
+
before_script:
|
|
241
|
+
- gem install fake_data_dsl
|
|
242
|
+
script:
|
|
243
|
+
- |
|
|
244
|
+
# Lint and capture output
|
|
245
|
+
OUTPUT=$(fake_data_dsl lint schemas/ --strict 2>&1) || EXIT_CODE=$?
|
|
246
|
+
|
|
247
|
+
# Post as MR comment (requires CI_JOB_TOKEN with api scope)
|
|
248
|
+
if [ -n "$CI_MERGE_REQUEST_IID" ]; then
|
|
249
|
+
curl --request POST \
|
|
250
|
+
--header "PRIVATE-TOKEN: ${CI_JOB_TOKEN}" \
|
|
251
|
+
--form "body=### Schema Validation\n\`\`\`\n${OUTPUT}\n\`\`\`" \
|
|
252
|
+
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes"
|
|
253
|
+
fi
|
|
254
|
+
|
|
255
|
+
exit ${EXIT_CODE:-0}
|
|
256
|
+
rules:
|
|
257
|
+
- if: $CI_MERGE_REQUEST_IID
|
|
258
|
+
changes:
|
|
259
|
+
- schemas/**/*.dsl
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## CircleCI
|
|
265
|
+
|
|
266
|
+
```yaml
|
|
267
|
+
# .circleci/config.yml
|
|
268
|
+
version: 2.1
|
|
269
|
+
|
|
270
|
+
orbs:
|
|
271
|
+
ruby: circleci/ruby@2.1
|
|
272
|
+
|
|
273
|
+
jobs:
|
|
274
|
+
validate-schemas:
|
|
275
|
+
docker:
|
|
276
|
+
- image: cimg/ruby:3.3
|
|
277
|
+
steps:
|
|
278
|
+
- checkout
|
|
279
|
+
- run:
|
|
280
|
+
name: Install FakeDataDSL
|
|
281
|
+
command: gem install fake_data_dsl
|
|
282
|
+
- run:
|
|
283
|
+
name: Lint Schemas
|
|
284
|
+
command: fake_data_dsl lint schemas/ --strict --verbose
|
|
285
|
+
- run:
|
|
286
|
+
name: Schema Info
|
|
287
|
+
command: fake_data_dsl info schemas/
|
|
288
|
+
- store_artifacts:
|
|
289
|
+
path: schema-report.txt
|
|
290
|
+
|
|
291
|
+
workflows:
|
|
292
|
+
schema-validation:
|
|
293
|
+
jobs:
|
|
294
|
+
- validate-schemas:
|
|
295
|
+
filters:
|
|
296
|
+
branches:
|
|
297
|
+
only: /.*/
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Jenkins
|
|
303
|
+
|
|
304
|
+
### Jenkinsfile (Declarative)
|
|
305
|
+
|
|
306
|
+
```groovy
|
|
307
|
+
// Jenkinsfile
|
|
308
|
+
pipeline {
|
|
309
|
+
agent {
|
|
310
|
+
docker {
|
|
311
|
+
image 'ruby:3.3'
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
stages {
|
|
316
|
+
stage('Setup') {
|
|
317
|
+
steps {
|
|
318
|
+
sh 'gem install fake_data_dsl'
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
stage('Lint Schemas') {
|
|
323
|
+
steps {
|
|
324
|
+
sh 'fake_data_dsl lint schemas/ --strict --verbose'
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
stage('Schema Info') {
|
|
329
|
+
steps {
|
|
330
|
+
sh 'fake_data_dsl info schemas/ --verbose > schema-report.txt'
|
|
331
|
+
archiveArtifacts artifacts: 'schema-report.txt'
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
stage('Preview') {
|
|
336
|
+
steps {
|
|
337
|
+
sh '''
|
|
338
|
+
for schema in User Order Product; do
|
|
339
|
+
fake_data_dsl preview $schema --dir schemas/ --pretty || true
|
|
340
|
+
done
|
|
341
|
+
'''
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
post {
|
|
347
|
+
failure {
|
|
348
|
+
echo 'Schema validation failed!'
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## Pre-commit Hooks
|
|
357
|
+
|
|
358
|
+
### Using pre-commit framework
|
|
359
|
+
|
|
360
|
+
```yaml
|
|
361
|
+
# .pre-commit-config.yaml
|
|
362
|
+
repos:
|
|
363
|
+
- repo: local
|
|
364
|
+
hooks:
|
|
365
|
+
- id: fake-data-dsl-lint
|
|
366
|
+
name: FakeDataDSL Lint
|
|
367
|
+
entry: fake_data_dsl lint --strict
|
|
368
|
+
language: ruby
|
|
369
|
+
files: \.dsl$
|
|
370
|
+
types: [file]
|
|
371
|
+
additional_dependencies: ['fake_data_dsl']
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Using Git hooks directly
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
#!/bin/bash
|
|
378
|
+
# .git/hooks/pre-commit
|
|
379
|
+
|
|
380
|
+
# Get list of staged .dsl files
|
|
381
|
+
DSL_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.dsl$')
|
|
382
|
+
|
|
383
|
+
if [ -n "$DSL_FILES" ]; then
|
|
384
|
+
echo "Validating DSL schemas..."
|
|
385
|
+
|
|
386
|
+
# Create temp directory for staged versions
|
|
387
|
+
TMPDIR=$(mktemp -d)
|
|
388
|
+
trap "rm -rf $TMPDIR" EXIT
|
|
389
|
+
|
|
390
|
+
# Copy staged files
|
|
391
|
+
for file in $DSL_FILES; do
|
|
392
|
+
mkdir -p "$TMPDIR/$(dirname $file)"
|
|
393
|
+
git show ":$file" > "$TMPDIR/$file"
|
|
394
|
+
done
|
|
395
|
+
|
|
396
|
+
# Run lint
|
|
397
|
+
if ! fake_data_dsl lint "$TMPDIR" --strict; then
|
|
398
|
+
echo "❌ Schema validation failed. Please fix errors before committing."
|
|
399
|
+
exit 1
|
|
400
|
+
fi
|
|
401
|
+
|
|
402
|
+
echo "✅ Schema validation passed"
|
|
403
|
+
fi
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Installation script
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
#!/bin/bash
|
|
410
|
+
# scripts/setup-hooks.sh
|
|
411
|
+
|
|
412
|
+
# Install pre-commit hook
|
|
413
|
+
cat > .git/hooks/pre-commit << 'EOF'
|
|
414
|
+
#!/bin/bash
|
|
415
|
+
DSL_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.dsl$')
|
|
416
|
+
if [ -n "$DSL_FILES" ]; then
|
|
417
|
+
echo "Validating DSL schemas..."
|
|
418
|
+
fake_data_dsl lint schemas/ --strict || exit 1
|
|
419
|
+
echo "✅ Schema validation passed"
|
|
420
|
+
fi
|
|
421
|
+
EOF
|
|
422
|
+
|
|
423
|
+
chmod +x .git/hooks/pre-commit
|
|
424
|
+
echo "Pre-commit hook installed!"
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Exit Codes
|
|
430
|
+
|
|
431
|
+
### Detailed Exit Code Reference
|
|
432
|
+
|
|
433
|
+
| Code | Status | Description | Action |
|
|
434
|
+
|------|--------|-------------|--------|
|
|
435
|
+
| `0` | ✅ Success | All schemas valid, no warnings | Continue pipeline |
|
|
436
|
+
| `1` | ⚠️ Warning | Schemas valid but have warnings | Pass (non-strict), Fail (strict) |
|
|
437
|
+
| `2` | ❌ Error | Schema parse errors | Fail pipeline |
|
|
438
|
+
| `3` | ❌ Error | File not found | Check paths |
|
|
439
|
+
| `4` | ❌ Error | Invalid arguments | Check command syntax |
|
|
440
|
+
|
|
441
|
+
### Handling in Scripts
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
#!/bin/bash
|
|
445
|
+
set -e
|
|
446
|
+
|
|
447
|
+
fake_data_dsl lint schemas/ --strict
|
|
448
|
+
EXIT_CODE=$?
|
|
449
|
+
|
|
450
|
+
case $EXIT_CODE in
|
|
451
|
+
0) echo "✅ All schemas valid" ;;
|
|
452
|
+
1) echo "⚠️ Warnings found" ;;
|
|
453
|
+
2) echo "❌ Errors found"; exit 1 ;;
|
|
454
|
+
*) echo "❌ Unknown error"; exit 1 ;;
|
|
455
|
+
esac
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
## Best Practices
|
|
461
|
+
|
|
462
|
+
### 1. Always Use `--strict` in CI
|
|
463
|
+
|
|
464
|
+
```bash
|
|
465
|
+
# ❌ Don't do this - warnings may slip through
|
|
466
|
+
fake_data_dsl lint schemas/
|
|
467
|
+
|
|
468
|
+
# ✅ Do this - treat warnings as errors
|
|
469
|
+
fake_data_dsl lint schemas/ --strict
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### 2. Pin FakeDataDSL Version
|
|
473
|
+
|
|
474
|
+
```ruby
|
|
475
|
+
# Gemfile
|
|
476
|
+
gem 'fake_data_dsl', '~> 0.1.0'
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
```yaml
|
|
480
|
+
# CI
|
|
481
|
+
- run: gem install fake_data_dsl -v '~> 0.1.0'
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### 3. Generate Test Data in CI
|
|
485
|
+
|
|
486
|
+
```yaml
|
|
487
|
+
# Verify schemas can generate data
|
|
488
|
+
- name: Test Generation
|
|
489
|
+
run: |
|
|
490
|
+
for schema in $(fake_data_dsl info schemas/ --list); do
|
|
491
|
+
fake_data_dsl generate $schema --dir schemas/ --count 10 --seed 12345 > /dev/null
|
|
492
|
+
done
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### 4. Archive Schema Documentation
|
|
496
|
+
|
|
497
|
+
```yaml
|
|
498
|
+
# GitHub Actions
|
|
499
|
+
- name: Generate Schema Docs
|
|
500
|
+
run: |
|
|
501
|
+
fake_data_dsl info schemas/ --verbose > schema-docs.txt
|
|
502
|
+
fake_data_dsl export --all --dir schemas/ --format json-schema --out-dir ./json-schemas/
|
|
503
|
+
|
|
504
|
+
- uses: actions/upload-artifact@v4
|
|
505
|
+
with:
|
|
506
|
+
name: schema-documentation
|
|
507
|
+
path: |
|
|
508
|
+
schema-docs.txt
|
|
509
|
+
json-schemas/
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### 5. Fail Fast on Schema Changes
|
|
513
|
+
|
|
514
|
+
```yaml
|
|
515
|
+
# Only run expensive tests if schemas are valid
|
|
516
|
+
jobs:
|
|
517
|
+
validate:
|
|
518
|
+
runs-on: ubuntu-latest
|
|
519
|
+
steps:
|
|
520
|
+
- uses: actions/checkout@v4
|
|
521
|
+
- run: gem install fake_data_dsl
|
|
522
|
+
- run: fake_data_dsl lint schemas/ --strict
|
|
523
|
+
|
|
524
|
+
integration-tests:
|
|
525
|
+
needs: validate # Only run if validation passes
|
|
526
|
+
runs-on: ubuntu-latest
|
|
527
|
+
steps:
|
|
528
|
+
- uses: actions/checkout@v4
|
|
529
|
+
- run: bundle exec rspec
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 6. Use Seed for Reproducibility
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
# Same seed = same output across runs
|
|
536
|
+
fake_data_dsl generate User --dir schemas/ --count 100 --seed 12345
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### 7. Monitor Schema Complexity
|
|
540
|
+
|
|
541
|
+
```yaml
|
|
542
|
+
- name: Check Schema Complexity
|
|
543
|
+
run: |
|
|
544
|
+
# Fail if any schema has too many fields
|
|
545
|
+
fake_data_dsl info schemas/ --format json | \
|
|
546
|
+
jq -e '.schemas | all(.field_count < 50)' || \
|
|
547
|
+
(echo "Schema has too many fields!" && exit 1)
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## Troubleshooting
|
|
553
|
+
|
|
554
|
+
### Common Issues
|
|
555
|
+
|
|
556
|
+
| Issue | Cause | Solution |
|
|
557
|
+
|-------|-------|----------|
|
|
558
|
+
| `command not found: fake_data_dsl` | Gem not installed | Add `gem install fake_data_dsl` |
|
|
559
|
+
| Exit code 2 on valid schema | Old gem version | Update to latest version |
|
|
560
|
+
| Slow validation | Many schemas | Use parallel jobs |
|
|
561
|
+
| Memory issues | Large schemas | Use streaming mode |
|
|
562
|
+
|
|
563
|
+
### Debug Mode
|
|
564
|
+
|
|
565
|
+
```bash
|
|
566
|
+
# Verbose output for debugging
|
|
567
|
+
fake_data_dsl lint schemas/ --strict --verbose 2>&1 | tee lint-output.log
|
|
568
|
+
|
|
569
|
+
# Check specific schema
|
|
570
|
+
fake_data_dsl validate schemas/problematic.dsl
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
---
|
|
574
|
+
|
|
575
|
+
## Next Steps
|
|
576
|
+
|
|
577
|
+
- [Schema Templates Gallery](../tutorials/template_gallery.md)
|
|
578
|
+
- [CLI Reference](../../tech_example/04_cli_usage.md)
|
|
579
|
+
- [Best Practices](../best_practices.md)
|