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,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
+