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,303 @@
|
|
|
1
|
+
# GraphQL Schema Export
|
|
2
|
+
|
|
3
|
+
FakeDataDSL can export schemas to GraphQL SDL (Schema Definition Language), making it easy to generate type-safe GraphQL APIs from your data schemas.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Ruby API
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
require 'fake_data_dsl'
|
|
11
|
+
|
|
12
|
+
# Load schema
|
|
13
|
+
schema = FakeDataDSL.load("schemas/user.dsl")
|
|
14
|
+
|
|
15
|
+
# Export to GraphQL
|
|
16
|
+
graphql = FakeDataDSL.to_graphql(schema)
|
|
17
|
+
puts graphql
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### CLI
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Export single schema
|
|
24
|
+
fake_data_dsl export User -d schemas -f graphql -o schema.graphql
|
|
25
|
+
|
|
26
|
+
# Export all schemas
|
|
27
|
+
fake_data_dsl export --all -d schemas -f graphql -o schema.graphql
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Output Example
|
|
31
|
+
|
|
32
|
+
Given this DSL:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
User:
|
|
36
|
+
id: uuid
|
|
37
|
+
name: text
|
|
38
|
+
email: email
|
|
39
|
+
age: number
|
|
40
|
+
active: boolean
|
|
41
|
+
role: enum(user, admin, moderator)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Generates this GraphQL:
|
|
45
|
+
|
|
46
|
+
```graphql
|
|
47
|
+
# FakeDataDSL Generated GraphQL Schema
|
|
48
|
+
# Generated at: 2024-01-15T10:30:00Z
|
|
49
|
+
|
|
50
|
+
enum UserRoleEnum {
|
|
51
|
+
USER
|
|
52
|
+
ADMIN
|
|
53
|
+
MODERATOR
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
type User {
|
|
57
|
+
id: ID!
|
|
58
|
+
name: String!
|
|
59
|
+
email: String!
|
|
60
|
+
age: Int!
|
|
61
|
+
active: Boolean!
|
|
62
|
+
role: UserRoleEnum!
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type Query {
|
|
66
|
+
user(id: ID!): User
|
|
67
|
+
users(limit: Int = 10, offset: Int = 0): [User!]!
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Type Mapping
|
|
72
|
+
|
|
73
|
+
FakeDataDSL types are mapped to GraphQL types:
|
|
74
|
+
|
|
75
|
+
| FakeDataDSL | GraphQL | Notes |
|
|
76
|
+
|-------------|---------|-------|
|
|
77
|
+
| `uuid`, `ulid`, `id_sequence` | `ID` | Identifier types |
|
|
78
|
+
| `text`, `name`, `email`, `phone` | `String` | String types |
|
|
79
|
+
| `number`, `integer`, `age` | `Int` | Integer types |
|
|
80
|
+
| `float`, `money`, `latitude` | `Float` | Floating point |
|
|
81
|
+
| `boolean` | `Boolean` | Boolean type |
|
|
82
|
+
| `date`, `timestamp` | `String` | Dates as ISO strings |
|
|
83
|
+
| `enum(...)` | `enum` | Auto-generated enums |
|
|
84
|
+
| `array(T)` | `[T!]!` | Non-nullable arrays |
|
|
85
|
+
| `Schema` reference | `Schema` | Nested types |
|
|
86
|
+
|
|
87
|
+
## Features
|
|
88
|
+
|
|
89
|
+
### Nullable Fields
|
|
90
|
+
|
|
91
|
+
Optional and nullable fields omit the `!`:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
User:
|
|
95
|
+
id: uuid
|
|
96
|
+
bio?: text # Optional field
|
|
97
|
+
nickname: text? # Nullable field
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```graphql
|
|
101
|
+
type User {
|
|
102
|
+
id: ID!
|
|
103
|
+
bio: String # No ! (optional)
|
|
104
|
+
nickname: String # No ! (nullable)
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Enum Generation
|
|
109
|
+
|
|
110
|
+
Enums are automatically extracted and named:
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
Product:
|
|
114
|
+
status: enum(draft, published, archived)
|
|
115
|
+
category: enum(electronics, clothing, home)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```graphql
|
|
119
|
+
enum ProductStatusEnum {
|
|
120
|
+
DRAFT
|
|
121
|
+
PUBLISHED
|
|
122
|
+
ARCHIVED
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
enum ProductCategoryEnum {
|
|
126
|
+
ELECTRONICS
|
|
127
|
+
CLOTHING
|
|
128
|
+
HOME
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
type Product {
|
|
132
|
+
status: ProductStatusEnum!
|
|
133
|
+
category: ProductCategoryEnum!
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Array Fields
|
|
138
|
+
|
|
139
|
+
Arrays map to GraphQL list types:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
Order:
|
|
143
|
+
items: array(OrderItem, 1..10)
|
|
144
|
+
tags: array(text, 0..5)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```graphql
|
|
148
|
+
type Order {
|
|
149
|
+
items: [OrderItem!]!
|
|
150
|
+
tags: [String!]!
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Schema References
|
|
155
|
+
|
|
156
|
+
Cross-schema references maintain their types:
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
Order:
|
|
160
|
+
id: uuid
|
|
161
|
+
customer: Customer
|
|
162
|
+
items: array(OrderItem, 1..5)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```graphql
|
|
166
|
+
type Order {
|
|
167
|
+
id: ID!
|
|
168
|
+
customer: Customer!
|
|
169
|
+
items: [OrderItem!]!
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Export All Schemas
|
|
174
|
+
|
|
175
|
+
Export an entire registry to a single GraphQL file:
|
|
176
|
+
|
|
177
|
+
```ruby
|
|
178
|
+
registry = FakeDataDSL::Registry.new
|
|
179
|
+
registry.load_dir("schemas/")
|
|
180
|
+
|
|
181
|
+
graphql = FakeDataDSL.to_graphql_all(registry)
|
|
182
|
+
File.write("schema.graphql", graphql)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
This generates:
|
|
186
|
+
- All types from all schemas
|
|
187
|
+
- All enums extracted from schemas
|
|
188
|
+
- A Query type with CRUD-like queries for each type
|
|
189
|
+
|
|
190
|
+
## Query Type Generation
|
|
191
|
+
|
|
192
|
+
When exporting all schemas, a Query type is automatically generated:
|
|
193
|
+
|
|
194
|
+
```graphql
|
|
195
|
+
type Query {
|
|
196
|
+
user(id: ID!): User
|
|
197
|
+
users(limit: Int = 10, offset: Int = 0): [User!]!
|
|
198
|
+
|
|
199
|
+
order(id: ID!): Order
|
|
200
|
+
orders(limit: Int = 10, offset: Int = 0): [Order!]!
|
|
201
|
+
|
|
202
|
+
product(id: ID!): Product
|
|
203
|
+
products(limit: Int = 10, offset: Int = 0): [Product!]!
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Customization
|
|
208
|
+
|
|
209
|
+
### With Registry
|
|
210
|
+
|
|
211
|
+
Pass a registry for cross-schema reference resolution:
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
registry = FakeDataDSL::Registry.new
|
|
215
|
+
registry.load_dir("schemas/")
|
|
216
|
+
|
|
217
|
+
schema = registry.schema("User")
|
|
218
|
+
graphql = FakeDataDSL.to_graphql(schema, registry: registry)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Integration with GraphQL Servers
|
|
222
|
+
|
|
223
|
+
### Ruby (graphql-ruby)
|
|
224
|
+
|
|
225
|
+
```ruby
|
|
226
|
+
# Use the generated schema as a starting point
|
|
227
|
+
schema_string = FakeDataDSL.to_graphql_all(registry)
|
|
228
|
+
File.write("app/graphql/schema.graphql", schema_string)
|
|
229
|
+
|
|
230
|
+
# Then implement resolvers
|
|
231
|
+
class QueryType < GraphQL::Schema::Object
|
|
232
|
+
field :user, UserType, null: true do
|
|
233
|
+
argument :id, ID, required: true
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def user(id:)
|
|
237
|
+
User.find(id)
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Node.js
|
|
243
|
+
|
|
244
|
+
```javascript
|
|
245
|
+
// Save the generated schema
|
|
246
|
+
const fs = require('fs');
|
|
247
|
+
const schema = fs.readFileSync('schema.graphql', 'utf8');
|
|
248
|
+
|
|
249
|
+
// Use with Apollo Server
|
|
250
|
+
const { ApolloServer } = require('apollo-server');
|
|
251
|
+
const typeDefs = gql(schema);
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Best Practices
|
|
255
|
+
|
|
256
|
+
### 1. Keep Schemas in Sync
|
|
257
|
+
|
|
258
|
+
Generate GraphQL schemas as part of your build process:
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
# In CI or pre-commit hook
|
|
262
|
+
fake_data_dsl export --all -d schemas -f graphql -o schema.graphql
|
|
263
|
+
git diff --exit-code schema.graphql || echo "GraphQL schema out of sync!"
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### 2. Use Consistent Naming
|
|
267
|
+
|
|
268
|
+
FakeDataDSL uses PascalCase for types and camelCase for fields:
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
UserProfile: # → type UserProfile
|
|
272
|
+
firstName: name # → firstName: String!
|
|
273
|
+
lastName: name # → lastName: String!
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 3. Document Deprecated Fields
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
User:
|
|
280
|
+
@deprecated "Use email_verified instead"
|
|
281
|
+
verified: boolean
|
|
282
|
+
email_verified: boolean
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
```graphql
|
|
286
|
+
type User {
|
|
287
|
+
verified: Boolean! @deprecated
|
|
288
|
+
emailVerified: Boolean!
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Limitations
|
|
293
|
+
|
|
294
|
+
- Custom scalars not yet supported
|
|
295
|
+
- Directives limited to `@deprecated`
|
|
296
|
+
- Interfaces and unions not supported
|
|
297
|
+
- Input types not generated (only output types)
|
|
298
|
+
|
|
299
|
+
## See Also
|
|
300
|
+
|
|
301
|
+
- [Export Guide](../tech_docs/export/README.md)
|
|
302
|
+
- [Type Reference](../tech_docs/appendices/type_chart.md)
|
|
303
|
+
- [CLI Usage](../tech_example/04_cli_usage.md)
|