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.
Files changed (302) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +4 -0
  3. data/.rubocop.yml +40 -0
  4. data/.yardopts +18 -0
  5. data/ACCESS_DOCS.md +116 -0
  6. data/ADVANCED_FEATURES_SUMMARY.md +245 -0
  7. data/CHANGELOG.md +498 -0
  8. data/CODE_OF_CONDUCT.md +122 -0
  9. data/CONTRIBUTING.md +307 -0
  10. data/DOCUMENTATION.md +204 -0
  11. data/DOCUMENTATION_GUIDE.md +194 -0
  12. data/LICENSE +22 -0
  13. data/README.md +1458 -0
  14. data/Rakefile +128 -0
  15. data/benchmark/README.md +591 -0
  16. data/benchmark/batch_generation.rb +63 -0
  17. data/benchmark/engine_comparison.rb +295 -0
  18. data/benchmark/single_record.rb +108 -0
  19. data/benchmark/streaming.rb +74 -0
  20. data/docs/ACTIVERECORD_INFERENCE.md +524 -0
  21. data/docs/API_SERVER.md +278 -0
  22. data/docs/CONFIG_FILE.md +315 -0
  23. data/docs/DATA_CONTRACTS.md +312 -0
  24. data/docs/ENHANCED_REPL.md +304 -0
  25. data/docs/FACTORY_BOT.md +271 -0
  26. data/docs/GITHUB_ACTION.md +420 -0
  27. data/docs/GRAPHQL_EXPORT.md +303 -0
  28. data/docs/GRAPHQL_FEDERATION.md +651 -0
  29. data/docs/HOW_TO_GENERATE_DOCS.md +252 -0
  30. data/docs/LSP.md +189 -0
  31. data/docs/MIGRATION_GENERATOR.md +547 -0
  32. data/docs/MOCK_SERVER.md +280 -0
  33. data/docs/NATIVE_ENGINE.md +298 -0
  34. data/docs/OPENAPI_EXPORT.md +252 -0
  35. data/docs/PERFORMANCE_MODE.md +228 -0
  36. data/docs/PERSONAS.md +547 -0
  37. data/docs/PROPERTY_TESTING.md +284 -0
  38. data/docs/PROTOBUF_EXPORT.md +276 -0
  39. data/docs/QUALITY_METRICS.md +555 -0
  40. data/docs/QUICK_REFERENCE.md +88 -0
  41. data/docs/RAILS_ENGINE.md +404 -0
  42. data/docs/RAILS_INTEGRATION.md +454 -0
  43. data/docs/README.md +175 -0
  44. data/docs/REPL_QUICK_REFERENCE.md +149 -0
  45. data/docs/RUST_INTEGRATION_GUIDE.md +1376 -0
  46. data/docs/SCENARIOS.md +576 -0
  47. data/docs/SECURITY_TESTING.md +318 -0
  48. data/docs/SNAPSHOT_TESTING.md +308 -0
  49. data/docs/STRING_TEXT_TYPES_REFERENCE.md +512 -0
  50. data/docs/TERRAFORM_EXPORT.md +447 -0
  51. data/docs/TIME_TRAVEL.md +507 -0
  52. data/docs/USAGE_GUIDE.md +980 -0
  53. data/docs/WEBHOOK_SIMULATOR.md +579 -0
  54. data/docs/advanced_features.md +183 -0
  55. data/docs/api_reference.md +153 -0
  56. data/docs/behaviors.md +138 -0
  57. data/docs/best_practices.md +191 -0
  58. data/docs/dsl_reference.md +172 -0
  59. data/docs/examples.md +162 -0
  60. data/docs/generation_modes.md +125 -0
  61. data/docs/getting_started.md +92 -0
  62. data/docs/index.html +177 -0
  63. data/docs/strategic/CLOUD_REGISTRY_ARCHITECTURE.md +268 -0
  64. data/docs/strategic/SIMD_OPTIMIZATION_STRATEGY.md +153 -0
  65. data/docs/troubleshooting.md +215 -0
  66. data/docs/type_reference.md +224 -0
  67. data/examples/hostile_mode_demo.rb +64 -0
  68. data/exe/synthra +6 -0
  69. data/ext/synthra_native/Cargo.lock +972 -0
  70. data/ext/synthra_native/Cargo.toml +46 -0
  71. data/ext/synthra_native/extconf.rb +41 -0
  72. data/ext/synthra_native/src/generator.rs +397 -0
  73. data/ext/synthra_native/src/lib.rs +229 -0
  74. data/ext/synthra_native/src/types.rs +1485 -0
  75. data/lib/generators/synthra/install_generator.rb +86 -0
  76. data/lib/generators/synthra/templates/api_response.dsl +15 -0
  77. data/lib/generators/synthra/templates/fake_data.rake +116 -0
  78. data/lib/generators/synthra/templates/synthra.yml +31 -0
  79. data/lib/generators/synthra/templates/synthra_support.rb +19 -0
  80. data/lib/generators/synthra/templates/user.dsl +11 -0
  81. data/lib/synthra/activerecord_inference.rb +394 -0
  82. data/lib/synthra/api.rb +381 -0
  83. data/lib/synthra/api_server.rb +718 -0
  84. data/lib/synthra/behaviors/applicator.rb +165 -0
  85. data/lib/synthra/behaviors/base.rb +155 -0
  86. data/lib/synthra/behaviors/close_connection.rb +60 -0
  87. data/lib/synthra/behaviors/deprecated.rb +100 -0
  88. data/lib/synthra/behaviors/failure.rb +69 -0
  89. data/lib/synthra/behaviors/latency.rb +103 -0
  90. data/lib/synthra/behaviors/partial_data.rb +83 -0
  91. data/lib/synthra/behaviors/randomize_order.rb +74 -0
  92. data/lib/synthra/behaviors/registry.rb +238 -0
  93. data/lib/synthra/behaviors/simulate_error.rb +79 -0
  94. data/lib/synthra/cli/commands/base.rb +105 -0
  95. data/lib/synthra/cli/commands/diff.rb +227 -0
  96. data/lib/synthra/cli/commands/docs.rb +67 -0
  97. data/lib/synthra/cli/commands/export.rb +150 -0
  98. data/lib/synthra/cli/commands/generate.rb +72 -0
  99. data/lib/synthra/cli/commands/import.rb +80 -0
  100. data/lib/synthra/cli/commands/lint.rb +53 -0
  101. data/lib/synthra/cli/commands/live.rb +57 -0
  102. data/lib/synthra/cli/commands/seed.rb +99 -0
  103. data/lib/synthra/cli/commands/validate.rb +28 -0
  104. data/lib/synthra/cli.rb +2471 -0
  105. data/lib/synthra/config_file.rb +129 -0
  106. data/lib/synthra/configuration.rb +281 -0
  107. data/lib/synthra/contracts_registry.rb +408 -0
  108. data/lib/synthra/database_seeder.rb +268 -0
  109. data/lib/synthra/deterministic_ids.rb +218 -0
  110. data/lib/synthra/documentation_generator.rb +414 -0
  111. data/lib/synthra/engine.rb +251 -0
  112. data/lib/synthra/errors.rb +1169 -0
  113. data/lib/synthra/export/base.rb +85 -0
  114. data/lib/synthra/export/csv.rb +101 -0
  115. data/lib/synthra/export/graphql.rb +266 -0
  116. data/lib/synthra/export/graphql_federation.rb +377 -0
  117. data/lib/synthra/export/graphviz.rb +258 -0
  118. data/lib/synthra/export/javascript.rb +327 -0
  119. data/lib/synthra/export/json_data.rb +61 -0
  120. data/lib/synthra/export/json_schema.rb +290 -0
  121. data/lib/synthra/export/openapi.rb +514 -0
  122. data/lib/synthra/export/protobuf.rb +483 -0
  123. data/lib/synthra/export/python.rb +560 -0
  124. data/lib/synthra/export/sql.rb +381 -0
  125. data/lib/synthra/export/sql_insert.rb +152 -0
  126. data/lib/synthra/export/terraform.rb +501 -0
  127. data/lib/synthra/export/type_mapping.rb +389 -0
  128. data/lib/synthra/export/typescript.rb +300 -0
  129. data/lib/synthra/export/xml_data.rb +104 -0
  130. data/lib/synthra/export/yaml_data.rb +56 -0
  131. data/lib/synthra/export.rb +404 -0
  132. data/lib/synthra/factory_bot_integration.rb +157 -0
  133. data/lib/synthra/field.rb +440 -0
  134. data/lib/synthra/functions/registry.rb +104 -0
  135. data/lib/synthra/generator/context.rb +372 -0
  136. data/lib/synthra/generator/engine.rb +336 -0
  137. data/lib/synthra/generator/faker_adapter.rb +425 -0
  138. data/lib/synthra/generator/modes.rb +444 -0
  139. data/lib/synthra/generator/resolver.rb +256 -0
  140. data/lib/synthra/generator/rng.rb +273 -0
  141. data/lib/synthra/generator/streamer.rb +63 -0
  142. data/lib/synthra/generator/uniqueness.rb +118 -0
  143. data/lib/synthra/initializer.rb +97 -0
  144. data/lib/synthra/limits.rb +279 -0
  145. data/lib/synthra/live_preview.rb +518 -0
  146. data/lib/synthra/loader_config.rb +78 -0
  147. data/lib/synthra/lsp/server.rb +689 -0
  148. data/lib/synthra/migration_generator.rb +301 -0
  149. data/lib/synthra/mixin.rb +174 -0
  150. data/lib/synthra/mock_server.rb +458 -0
  151. data/lib/synthra/native_engine.rb +304 -0
  152. data/lib/synthra/openapi_importer.rb +228 -0
  153. data/lib/synthra/output/json_formatter.rb +40 -0
  154. data/lib/synthra/output/ndjson_formatter.rb +55 -0
  155. data/lib/synthra/parser/ast.rb +1287 -0
  156. data/lib/synthra/parser/lexer.rb +1152 -0
  157. data/lib/synthra/parser/parser.rb +1664 -0
  158. data/lib/synthra/parser/tokens.rb +461 -0
  159. data/lib/synthra/performance_mode.rb +364 -0
  160. data/lib/synthra/personas.rb +397 -0
  161. data/lib/synthra/property_testing.rb +172 -0
  162. data/lib/synthra/quality_metrics.rb +405 -0
  163. data/lib/synthra/rails_test_helper.rb +248 -0
  164. data/lib/synthra/registry.rb +533 -0
  165. data/lib/synthra/relationships.rb +193 -0
  166. data/lib/synthra/repl/enhanced_repl.rb +607 -0
  167. data/lib/synthra/repl/formatter.rb +191 -0
  168. data/lib/synthra/scenarios.rb +423 -0
  169. data/lib/synthra/schema.rb +605 -0
  170. data/lib/synthra/schema_inheritance.rb +104 -0
  171. data/lib/synthra/schema_versioning.rb +212 -0
  172. data/lib/synthra/snapshot_testing.rb +199 -0
  173. data/lib/synthra/time_travel.rb +338 -0
  174. data/lib/synthra/type_definitions.rb +274 -0
  175. data/lib/synthra/types/address_location/addresses.rb +125 -0
  176. data/lib/synthra/types/address_location/airports.rb +200 -0
  177. data/lib/synthra/types/address_location/banks_hospitals.rb +207 -0
  178. data/lib/synthra/types/address_location/locations.rb +406 -0
  179. data/lib/synthra/types/base.rb +48 -0
  180. data/lib/synthra/types/commerce_products/commerce.rb +119 -0
  181. data/lib/synthra/types/commerce_products/companies.rb +71 -0
  182. data/lib/synthra/types/commerce_products/construction.rb +126 -0
  183. data/lib/synthra/types/commerce_products/products.rb +205 -0
  184. data/lib/synthra/types/core/collections.rb +513 -0
  185. data/lib/synthra/types/core/defaults.rb +76 -0
  186. data/lib/synthra/types/core/enums.rb +102 -0
  187. data/lib/synthra/types/core/identifiers.rb +445 -0
  188. data/lib/synthra/types/core/primitives.rb +586 -0
  189. data/lib/synthra/types/core/references.rb +466 -0
  190. data/lib/synthra/types/core/sequences.rb +304 -0
  191. data/lib/synthra/types/crypto/crypto.rb +162 -0
  192. data/lib/synthra/types/date_time/dates.rb +387 -0
  193. data/lib/synthra/types/finance_banking/banking.rb +424 -0
  194. data/lib/synthra/types/finance_banking/credit_cards.rb +24 -0
  195. data/lib/synthra/types/finance_banking/identifiers.rb +93 -0
  196. data/lib/synthra/types/formula.rb +184 -0
  197. data/lib/synthra/types/health_medical/medical.rb +150 -0
  198. data/lib/synthra/types/hostile_payloads.rb +122 -0
  199. data/lib/synthra/types/json_array.rb +51 -0
  200. data/lib/synthra/types/media_entertainment/media.rb +62 -0
  201. data/lib/synthra/types/naughty_string.rb +30 -0
  202. data/lib/synthra/types/personal_names/chinese.rb +41 -0
  203. data/lib/synthra/types/personal_names/identifiers.rb +187 -0
  204. data/lib/synthra/types/personal_names/names.rb +246 -0
  205. data/lib/synthra/types/personal_names/national_id.rb +89 -0
  206. data/lib/synthra/types/personal_names/titles_suffixes.rb +41 -0
  207. data/lib/synthra/types/regex.rb +248 -0
  208. data/lib/synthra/types/registry.rb +182 -0
  209. data/lib/synthra/types/repeating_element.rb +50 -0
  210. data/lib/synthra/types/scenario.rb +29 -0
  211. data/lib/synthra/types/technology_internet/apps.rb +67 -0
  212. data/lib/synthra/types/technology_internet/communication.rb +162 -0
  213. data/lib/synthra/types/technology_internet/devices.rb +80 -0
  214. data/lib/synthra/types/technology_internet/formats.rb +139 -0
  215. data/lib/synthra/types/technology_internet/networking.rb +143 -0
  216. data/lib/synthra/types/template.rb +92 -0
  217. data/lib/synthra/types/text_content/business.rb +128 -0
  218. data/lib/synthra/types/text_content/colors.rb +70 -0
  219. data/lib/synthra/types/text_content/misc.rb +237 -0
  220. data/lib/synthra/types/text_content/security.rb +130 -0
  221. data/lib/synthra/types/text_content/text_generation.rb +532 -0
  222. data/lib/synthra/types/travel/travel.rb +150 -0
  223. data/lib/synthra/utils/string_distance.rb +133 -0
  224. data/lib/synthra/validator/dsl_validator.rb +339 -0
  225. data/lib/synthra/validator/path_validator.rb +615 -0
  226. data/lib/synthra/version.rb +35 -0
  227. data/lib/synthra/webhook_simulator.rb +341 -0
  228. data/lib/synthra.rb +259 -0
  229. data/schemas/address.dsl +16 -0
  230. data/schemas/api_response.dsl +8 -0
  231. data/schemas/error_payload.dsl +9 -0
  232. data/schemas/order.dsl +10 -0
  233. data/schemas/order_item.dsl +8 -0
  234. data/schemas/payment.dsl +11 -0
  235. data/schemas/social_post.dsl +13 -0
  236. data/schemas/user.dsl +10 -0
  237. data/scripts/batch_fix_all.rb +96 -0
  238. data/scripts/delete_old_files.rb +32 -0
  239. data/scripts/fix_all_grouped_files.rb +137 -0
  240. data/scripts/fix_all_indentation.rb +48 -0
  241. data/scripts/fix_all_syntax.rb +124 -0
  242. data/scripts/fix_grouped_files.rb +184 -0
  243. data/scripts/fix_syntax_errors.rb +108 -0
  244. data/scripts/group_domain_types.rb +112 -0
  245. data/scripts/group_domain_types_fixed.rb +150 -0
  246. data/scripts/merge_domains_to_one_file.rb +68 -0
  247. data/scripts/move_existing_types.rb +130 -0
  248. data/scripts/split_grouped_types.rb +142 -0
  249. data/tech_docs/README.md +134 -0
  250. data/tech_docs/advanced/streaming.md +405 -0
  251. data/tech_docs/advanced/thread_safety.md +253 -0
  252. data/tech_docs/api/overview.md +485 -0
  253. data/tech_docs/appendices/type_chart.md +193 -0
  254. data/tech_docs/basic_concepts.md +383 -0
  255. data/tech_docs/behaviors/overview.md +346 -0
  256. data/tech_docs/dsl/complex_types.md +790 -0
  257. data/tech_docs/dsl/core_types.md +464 -0
  258. data/tech_docs/dsl/datetime_types.md +325 -0
  259. data/tech_docs/dsl/field_modifiers.md +414 -0
  260. data/tech_docs/dsl/grammar.md +431 -0
  261. data/tech_docs/dsl/schema_definition.md +399 -0
  262. data/tech_docs/export/README.md +276 -0
  263. data/tech_docs/installation.md +273 -0
  264. data/tech_docs/integration/ci_cd.md +707 -0
  265. data/tech_docs/integration/ci_cd_guide.md +579 -0
  266. data/tech_docs/integration/factory_bot.md +485 -0
  267. data/tech_docs/integration/rails.md +630 -0
  268. data/tech_docs/integration/rspec.md +449 -0
  269. data/tech_docs/modes/overview.md +350 -0
  270. data/tech_docs/performance/NATIVE_RUST_EXTENSION.md +1270 -0
  271. data/tech_docs/performance/OPTIMIZATION_GUIDE.md +901 -0
  272. data/tech_docs/quick_start.md +256 -0
  273. data/tech_docs/templates/README.md +805 -0
  274. data/tech_docs/tutorials/advanced.md +371 -0
  275. data/tech_docs/tutorials/getting_started.md +189 -0
  276. data/tech_docs/tutorials/intermediate.md +231 -0
  277. data/tech_docs/tutorials/template_gallery.md +569 -0
  278. data/tech_example/01_basic_usage.rb +238 -0
  279. data/tech_example/02_types_demo.rb +336 -0
  280. data/tech_example/04_cli_usage.md +429 -0
  281. data/tech_example/05_database_seeding.rb +283 -0
  282. data/tech_example/07_rspec_integration.rb +359 -0
  283. data/tech_example/10_custom_types.rb +387 -0
  284. data/tech_example/12_behaviors.rb +372 -0
  285. data/tech_example/13_twitter_dm_example.rb +120 -0
  286. data/tech_example/14_exact_json_structure.rb +253 -0
  287. data/tech_example/16_lsp_server.rb +56 -0
  288. data/tech_example/17_property_testing.rb +92 -0
  289. data/tech_example/18_enhanced_repl.rb +120 -0
  290. data/tech_example/19_security_fuzzing.rb +145 -0
  291. data/tech_example/NEW_FEATURES.md +169 -0
  292. data/tech_example/README.md +118 -0
  293. data/tech_example/schemas/api_response.dsl +123 -0
  294. data/tech_example/schemas/ecommerce.dsl +121 -0
  295. data/tech_example/schemas/twitter_dm.dsl +109 -0
  296. data/tech_example/schemas/user.dsl +36 -0
  297. data/vscode-extension/README.md +246 -0
  298. data/vscode-extension/language-configuration.json +31 -0
  299. data/vscode-extension/package.json +55 -0
  300. data/vscode-extension/snippets/fakedatadsl.json +198 -0
  301. data/vscode-extension/syntaxes/fakedatadsl.tmLanguage.json +128 -0
  302. 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)