elasticgraph-schema_definition 0.18.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +7 -0
- data/elasticgraph-schema_definition.gemspec +26 -0
- data/lib/elastic_graph/schema_definition/api.rb +359 -0
- data/lib/elastic_graph/schema_definition/factory.rb +506 -0
- data/lib/elastic_graph/schema_definition/indexing/derived_fields/append_only_set.rb +79 -0
- data/lib/elastic_graph/schema_definition/indexing/derived_fields/field_initializer_support.rb +59 -0
- data/lib/elastic_graph/schema_definition/indexing/derived_fields/immutable_value.rb +99 -0
- data/lib/elastic_graph/schema_definition/indexing/derived_fields/min_or_max_value.rb +62 -0
- data/lib/elastic_graph/schema_definition/indexing/derived_indexed_type.rb +346 -0
- data/lib/elastic_graph/schema_definition/indexing/event_envelope.rb +74 -0
- data/lib/elastic_graph/schema_definition/indexing/field.rb +181 -0
- data/lib/elastic_graph/schema_definition/indexing/field_reference.rb +51 -0
- data/lib/elastic_graph/schema_definition/indexing/field_type/enum.rb +65 -0
- data/lib/elastic_graph/schema_definition/indexing/field_type/object.rb +113 -0
- data/lib/elastic_graph/schema_definition/indexing/field_type/scalar.rb +51 -0
- data/lib/elastic_graph/schema_definition/indexing/field_type/union.rb +70 -0
- data/lib/elastic_graph/schema_definition/indexing/index.rb +318 -0
- data/lib/elastic_graph/schema_definition/indexing/json_schema_field_metadata.rb +34 -0
- data/lib/elastic_graph/schema_definition/indexing/json_schema_with_metadata.rb +234 -0
- data/lib/elastic_graph/schema_definition/indexing/list_counts_mapping.rb +53 -0
- data/lib/elastic_graph/schema_definition/indexing/relationship_resolver.rb +96 -0
- data/lib/elastic_graph/schema_definition/indexing/rollover_config.rb +25 -0
- data/lib/elastic_graph/schema_definition/indexing/update_target_factory.rb +54 -0
- data/lib/elastic_graph/schema_definition/indexing/update_target_resolver.rb +195 -0
- data/lib/elastic_graph/schema_definition/json_schema_pruner.rb +61 -0
- data/lib/elastic_graph/schema_definition/mixins/can_be_graphql_only.rb +31 -0
- data/lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb +119 -0
- data/lib/elastic_graph/schema_definition/mixins/has_directives.rb +65 -0
- data/lib/elastic_graph/schema_definition/mixins/has_documentation.rb +74 -0
- data/lib/elastic_graph/schema_definition/mixins/has_indices.rb +281 -0
- data/lib/elastic_graph/schema_definition/mixins/has_readable_to_s_and_inspect.rb +46 -0
- data/lib/elastic_graph/schema_definition/mixins/has_subtypes.rb +116 -0
- data/lib/elastic_graph/schema_definition/mixins/has_type_info.rb +181 -0
- data/lib/elastic_graph/schema_definition/mixins/implements_interfaces.rb +122 -0
- data/lib/elastic_graph/schema_definition/mixins/supports_default_value.rb +47 -0
- data/lib/elastic_graph/schema_definition/mixins/supports_filtering_and_aggregation.rb +267 -0
- data/lib/elastic_graph/schema_definition/mixins/verifies_graphql_name.rb +38 -0
- data/lib/elastic_graph/schema_definition/rake_tasks.rb +190 -0
- data/lib/elastic_graph/schema_definition/results.rb +404 -0
- data/lib/elastic_graph/schema_definition/schema_artifact_manager.rb +482 -0
- data/lib/elastic_graph/schema_definition/schema_elements/argument.rb +56 -0
- data/lib/elastic_graph/schema_definition/schema_elements/built_in_types.rb +1541 -0
- data/lib/elastic_graph/schema_definition/schema_elements/deprecated_element.rb +21 -0
- data/lib/elastic_graph/schema_definition/schema_elements/directive.rb +40 -0
- data/lib/elastic_graph/schema_definition/schema_elements/enum_type.rb +189 -0
- data/lib/elastic_graph/schema_definition/schema_elements/enum_value.rb +73 -0
- data/lib/elastic_graph/schema_definition/schema_elements/enum_value_namer.rb +89 -0
- data/lib/elastic_graph/schema_definition/schema_elements/enums_for_indexed_types.rb +82 -0
- data/lib/elastic_graph/schema_definition/schema_elements/field.rb +1085 -0
- data/lib/elastic_graph/schema_definition/schema_elements/field_path.rb +112 -0
- data/lib/elastic_graph/schema_definition/schema_elements/field_source.rb +16 -0
- data/lib/elastic_graph/schema_definition/schema_elements/graphql_sdl_enumerator.rb +113 -0
- data/lib/elastic_graph/schema_definition/schema_elements/input_field.rb +31 -0
- data/lib/elastic_graph/schema_definition/schema_elements/input_type.rb +60 -0
- data/lib/elastic_graph/schema_definition/schema_elements/interface_type.rb +72 -0
- data/lib/elastic_graph/schema_definition/schema_elements/list_counts_state.rb +40 -0
- data/lib/elastic_graph/schema_definition/schema_elements/object_type.rb +53 -0
- data/lib/elastic_graph/schema_definition/schema_elements/relationship.rb +218 -0
- data/lib/elastic_graph/schema_definition/schema_elements/scalar_type.rb +310 -0
- data/lib/elastic_graph/schema_definition/schema_elements/sort_order_enum_value.rb +36 -0
- data/lib/elastic_graph/schema_definition/schema_elements/sub_aggregation_path.rb +66 -0
- data/lib/elastic_graph/schema_definition/schema_elements/type_namer.rb +237 -0
- data/lib/elastic_graph/schema_definition/schema_elements/type_reference.rb +353 -0
- data/lib/elastic_graph/schema_definition/schema_elements/type_with_subfields.rb +579 -0
- data/lib/elastic_graph/schema_definition/schema_elements/union_type.rb +157 -0
- data/lib/elastic_graph/schema_definition/scripting/file_system_repository.rb +77 -0
- data/lib/elastic_graph/schema_definition/scripting/script.rb +48 -0
- data/lib/elastic_graph/schema_definition/scripting/scripts/field/as_day_of_week.painless +24 -0
- data/lib/elastic_graph/schema_definition/scripting/scripts/field/as_time_of_day.painless +41 -0
- data/lib/elastic_graph/schema_definition/scripting/scripts/filter/by_time_of_day.painless +22 -0
- data/lib/elastic_graph/schema_definition/scripting/scripts/update/index_data.painless +93 -0
- data/lib/elastic_graph/schema_definition/state.rb +212 -0
- data/lib/elastic_graph/schema_definition/test_support.rb +113 -0
- metadata +513 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 47ae5c55ab0b2b648a5f0df3d5648e842c31f5426865cef9a2ef4f9cf51269bb
|
4
|
+
data.tar.gz: a0c1ded435206b9ba3afa2a049cd262c5f31046aa750401a2797292f5b8211c8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: adf50d9102ca7a6eeb5024d0b4dad9ae81579bb4a4eb19a46355c3d92b7e337c566a8d352f6298c38600a56189b6e31749f63d15690071405430ee46ab212a72
|
7
|
+
data.tar.gz: 984cdaed0275b0c37896f733448b9a7039aaf7cbd4b13ce8eb8f0c9b47725e22b6e2836984eaed66bd6fe866ab0690e6a30816c2f940b3f6c828e4ad1a728154
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2024 Block, Inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Copyright 2024 Block, Inc.
|
2
|
+
#
|
3
|
+
# Use of this source code is governed by an MIT-style
|
4
|
+
# license that can be found in the LICENSE file or at
|
5
|
+
# https://opensource.org/licenses/MIT.
|
6
|
+
#
|
7
|
+
# frozen_string_literal: true
|
8
|
+
|
9
|
+
require_relative "../gemspec_helper"
|
10
|
+
|
11
|
+
ElasticGraphGemspecHelper.define_elasticgraph_gem(gemspec_file: __FILE__, category: :local) do |spec, eg_version|
|
12
|
+
spec.summary = "ElasticGraph gem that provides the schema definition API and generates schema artifacts."
|
13
|
+
|
14
|
+
spec.add_dependency "elasticgraph-graphql", eg_version # needed since we validate that scalar `coerce_with` options are valid (which loads scalar coercion adapters)
|
15
|
+
spec.add_dependency "elasticgraph-indexer", eg_version # needed since we validate that scalar `prepare_for_indexing_with` options are valid (which loads indexing preparer adapters)
|
16
|
+
spec.add_dependency "elasticgraph-json_schema", eg_version
|
17
|
+
spec.add_dependency "elasticgraph-schema_artifacts", eg_version
|
18
|
+
spec.add_dependency "elasticgraph-support", eg_version
|
19
|
+
spec.add_dependency "graphql", ">= 2.3.7", "< 2.4"
|
20
|
+
spec.add_dependency "rake", "~> 13.2"
|
21
|
+
|
22
|
+
spec.add_development_dependency "elasticgraph-admin", eg_version
|
23
|
+
spec.add_development_dependency "elasticgraph-datastore_core", eg_version
|
24
|
+
spec.add_development_dependency "elasticgraph-elasticsearch", eg_version
|
25
|
+
spec.add_development_dependency "elasticgraph-opensearch", eg_version
|
26
|
+
end
|
@@ -0,0 +1,359 @@
|
|
1
|
+
# Copyright 2024 Block, Inc.
|
2
|
+
#
|
3
|
+
# Use of this source code is governed by an MIT-style
|
4
|
+
# license that can be found in the LICENSE file or at
|
5
|
+
# https://opensource.org/licenses/MIT.
|
6
|
+
#
|
7
|
+
# frozen_string_literal: true
|
8
|
+
|
9
|
+
require "elastic_graph/error"
|
10
|
+
require "elastic_graph/schema_artifacts/runtime_metadata/extension"
|
11
|
+
require "elastic_graph/schema_definition/mixins/has_readable_to_s_and_inspect"
|
12
|
+
require "elastic_graph/schema_definition/results"
|
13
|
+
require "elastic_graph/schema_definition/state"
|
14
|
+
|
15
|
+
module ElasticGraph
|
16
|
+
# The main entry point for schema definition from ElasticGraph applications.
|
17
|
+
#
|
18
|
+
# Call this API from a Ruby file configured as the `path_to_schema` (or from a Ruby file
|
19
|
+
# `load`ed from the `path_to_schema` file).
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# ElasticGraph.define_schema do |schema|
|
23
|
+
# # The `schema` object provides the schema definition API. Use it in this block.
|
24
|
+
# end
|
25
|
+
def self.define_schema
|
26
|
+
if (api_instance = ::Thread.current[:ElasticGraph_SchemaDefinition_API_instance])
|
27
|
+
yield api_instance
|
28
|
+
else
|
29
|
+
raise SchemaError, "No active `SchemaDefinition::API` instance is available. " \
|
30
|
+
"Let ElasticGraph load the schema definition files."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Provides the ElasticGraph schema definition API. The primary entry point is {.define_schema}.
|
35
|
+
module SchemaDefinition
|
36
|
+
# Root API object that provides the schema definition API.
|
37
|
+
#
|
38
|
+
# @example
|
39
|
+
# ElasticGraph.define_schema do |schema|
|
40
|
+
# # The `schema` object is an instance of `API`
|
41
|
+
# end
|
42
|
+
class API
|
43
|
+
include Mixins::HasReadableToSAndInspect.new
|
44
|
+
|
45
|
+
# @dynamic state, factory
|
46
|
+
|
47
|
+
# @return [State] object which holds all state for the schema definition
|
48
|
+
attr_reader :state
|
49
|
+
|
50
|
+
# @return [Factory] object responsible for instantiating all schema element classes
|
51
|
+
attr_reader :factory
|
52
|
+
|
53
|
+
# @private
|
54
|
+
def initialize(
|
55
|
+
schema_elements,
|
56
|
+
index_document_sizes,
|
57
|
+
extension_modules: [],
|
58
|
+
derived_type_name_formats: {},
|
59
|
+
type_name_overrides: {},
|
60
|
+
enum_value_overrides_by_type: {},
|
61
|
+
output: $stdout
|
62
|
+
)
|
63
|
+
@state = State.with(
|
64
|
+
api: self,
|
65
|
+
schema_elements: schema_elements,
|
66
|
+
index_document_sizes: index_document_sizes,
|
67
|
+
derived_type_name_formats: derived_type_name_formats,
|
68
|
+
type_name_overrides: type_name_overrides,
|
69
|
+
enum_value_overrides_by_type: enum_value_overrides_by_type,
|
70
|
+
output: output
|
71
|
+
)
|
72
|
+
|
73
|
+
@factory = @state.factory
|
74
|
+
|
75
|
+
extension_modules.each { |mod| extend(mod) }
|
76
|
+
|
77
|
+
# These lines must come _after_ the extension modules are applied, so that the extension modules
|
78
|
+
# have a chance to hook into the factory in order to customize built in types if desired.
|
79
|
+
@factory.new_built_in_types(self).register_built_in_types
|
80
|
+
@state.initially_registered_built_in_types.merge(@state.types_by_name.keys)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Defines a raw GraphQL SDL snippet that will be included in the generated `schema.graphql` artifact. Designed to be an escape hatch,
|
84
|
+
# for when ElasticGraph doesn’t provide another way to write some type of GraphQL SDL element that you need. Currently, the only
|
85
|
+
# known use case is to define custom GraphQL directives.
|
86
|
+
#
|
87
|
+
# @param string [String] Raw snippet of SDL
|
88
|
+
# @return [void]
|
89
|
+
#
|
90
|
+
# @example Define a custom directive and use it
|
91
|
+
# ElasticGraph.define_schema do |schema|
|
92
|
+
# # Define a directive we can use to annotate what system a data type comes from.
|
93
|
+
# schema.raw_sdl "directive @sourcedFrom(system: String!) on OBJECT"
|
94
|
+
#
|
95
|
+
# schema.object_type "Transaction" do |t|
|
96
|
+
# t.directive "sourcedFrom", system: "transaction-processor"
|
97
|
+
# end
|
98
|
+
# end
|
99
|
+
def raw_sdl(string)
|
100
|
+
@state.sdl_parts << string
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
|
104
|
+
# Defines a [GraphQL object type](https://graphql.org/learn/schema/#object-types-and-fields) Use it to define a concrete type that
|
105
|
+
# has subfields. Object types can either be _indexed_ (e.g. directly indexed in the datastore, and available to query from the
|
106
|
+
# root `Query` object) or _embedded_ in other indexed types.
|
107
|
+
#
|
108
|
+
# @param name [String] name of the object type
|
109
|
+
# @yield [SchemaElements::ObjectType] object type object
|
110
|
+
# @return [void]
|
111
|
+
#
|
112
|
+
# @example Define embedded and indexed object types
|
113
|
+
# ElasticGraph.define_schema do |schema|
|
114
|
+
# # `Money` is an embedded object type
|
115
|
+
# schema.object_type "Money" do |t|
|
116
|
+
# t.field "currency", "String"
|
117
|
+
# t.field "amount", "JsonSafeLong"
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# # `Transaction` is an indexed object type
|
121
|
+
# schema.object_type "Transaction" do |t|
|
122
|
+
# t.root_query_fields plural: "transactions"
|
123
|
+
# t.field "id", "ID"
|
124
|
+
# t.field "cost", "Money"
|
125
|
+
# t.index "transactions"
|
126
|
+
# end
|
127
|
+
# end
|
128
|
+
def object_type(name, &block)
|
129
|
+
@state.register_object_interface_or_union_type @factory.new_object_type(name.to_s, &block)
|
130
|
+
nil
|
131
|
+
end
|
132
|
+
|
133
|
+
# Defines a [GraphQL interface](https://graphql.org/learn/schema/#interfaces). Use it to define an abstract supertype with
|
134
|
+
# one or more fields that concrete implementations of the interface must also define. Each implementation can be an
|
135
|
+
# {SchemaElements::ObjectType} or {SchemaElements::InterfaceType}.
|
136
|
+
#
|
137
|
+
# @param name [String] name of the interface
|
138
|
+
# @yield [SchemaElements::InterfaceType] interface type object
|
139
|
+
# @return [void]
|
140
|
+
#
|
141
|
+
# @example Define an interface and implement it
|
142
|
+
# ElasticGraph.define_schema do |schema|
|
143
|
+
# schema.interface_type "Athlete" do |t|
|
144
|
+
# t.field "name", "String"
|
145
|
+
# t.field "team", "String"
|
146
|
+
# end
|
147
|
+
#
|
148
|
+
# schema.object_type "BaseballPlayer" do |t|
|
149
|
+
# t.implements "Athlete"
|
150
|
+
# t.field "name", "String"
|
151
|
+
# t.field "team", "String"
|
152
|
+
# t.field "battingAvg", "Float"
|
153
|
+
# end
|
154
|
+
#
|
155
|
+
# schema.object_type "BasketballPlayer" do |t|
|
156
|
+
# t.implements "Athlete"
|
157
|
+
# t.field "name", "String"
|
158
|
+
# t.field "team", "String"
|
159
|
+
# t.field "pointsPerGame", "Float"
|
160
|
+
# end
|
161
|
+
# end
|
162
|
+
def interface_type(name, &block)
|
163
|
+
@state.register_object_interface_or_union_type @factory.new_interface_type(name.to_s, &block)
|
164
|
+
nil
|
165
|
+
end
|
166
|
+
|
167
|
+
# Defines a [GraphQL enum type](https://graphql.org/learn/schema/#enumeration-types).
|
168
|
+
# The type is restricted to an enumerated set of values, each with a unique name.
|
169
|
+
# Use `value` or `values` to define the enum values in the passed block.
|
170
|
+
#
|
171
|
+
# Note: if required by your configuration, this may generate a pair of Enum types (an input
|
172
|
+
# enum and an output enum).
|
173
|
+
#
|
174
|
+
# @param name [String] name of the enum type
|
175
|
+
# @yield [SchemaElements::EnumType] enum type object
|
176
|
+
# @return [void]
|
177
|
+
#
|
178
|
+
# @example Define an enum type
|
179
|
+
# ElasticGraph.define_schema do |schema|
|
180
|
+
# schema.enum_type "Currency" do |t|
|
181
|
+
# t.value "USD" do |v|
|
182
|
+
# v.documentation "US Dollars."
|
183
|
+
# end
|
184
|
+
#
|
185
|
+
# t.value "JPY" do |v|
|
186
|
+
# v.documentation "Japanese Yen."
|
187
|
+
# end
|
188
|
+
#
|
189
|
+
# # You can define multiple values in one call if you don't care about their docs or directives.
|
190
|
+
# t.values "GBP", "AUD"
|
191
|
+
# end
|
192
|
+
# end
|
193
|
+
def enum_type(name, &block)
|
194
|
+
@state.register_enum_type @factory.new_enum_type(name.to_s, &block)
|
195
|
+
nil
|
196
|
+
end
|
197
|
+
|
198
|
+
# Defines a [GraphQL union type](https://graphql.org/learn/schema/#union-types). Use it to define an abstract supertype with one or
|
199
|
+
# more concrete subtypes. Each subtype must be an {SchemaElements::ObjectType}, but they do not have to share any fields in common.
|
200
|
+
#
|
201
|
+
# @param name [String] name of the union type
|
202
|
+
# @yield [SchemaElements::UnionType] union type object
|
203
|
+
# @return [void]
|
204
|
+
#
|
205
|
+
# @example Define a union type
|
206
|
+
# ElasticGraph.define_schema do |schema|
|
207
|
+
# schema.object_type "Card" do |t|
|
208
|
+
# # ...
|
209
|
+
# end
|
210
|
+
#
|
211
|
+
# schema.object_type "BankAccount" do |t|
|
212
|
+
# # ...
|
213
|
+
# end
|
214
|
+
#
|
215
|
+
# schema.object_type "BitcoinWallet" do |t|
|
216
|
+
# # ...
|
217
|
+
# end
|
218
|
+
#
|
219
|
+
# schema.union_type "FundingSource" do |t|
|
220
|
+
# t.subtype "Card"
|
221
|
+
# t.subtypes "BankAccount", "BitcoinWallet"
|
222
|
+
# end
|
223
|
+
# end
|
224
|
+
def union_type(name, &block)
|
225
|
+
@state.register_object_interface_or_union_type @factory.new_union_type(name.to_s, &block)
|
226
|
+
nil
|
227
|
+
end
|
228
|
+
|
229
|
+
# Defines a [GraphQL scalar type](https://graphql.org/learn/schema/#scalar-types). ElasticGraph itself uses this to define a few
|
230
|
+
# common scalar types (e.g. `Date` and `DateTime`), but it is also available to you to use to define your own custom scalar types.
|
231
|
+
#
|
232
|
+
# @param name [String] name of the scalar type
|
233
|
+
# @yield [SchemaElements::ScalarType] scalar type object
|
234
|
+
# @return [void]
|
235
|
+
#
|
236
|
+
# @example Define a scalar type
|
237
|
+
# ElasticGraph.define_schema do |schema|
|
238
|
+
# schema.scalar_type "URL" do |t|
|
239
|
+
# t.mapping type: "keyword"
|
240
|
+
# t.json_schema type: "string", format: "uri"
|
241
|
+
# end
|
242
|
+
# end
|
243
|
+
def scalar_type(name, &block)
|
244
|
+
@state.register_scalar_type @factory.new_scalar_type(name.to_s, &block)
|
245
|
+
nil
|
246
|
+
end
|
247
|
+
|
248
|
+
# Registers the name of a type that existed in a prior version of the schema but has been deleted.
|
249
|
+
#
|
250
|
+
# @note In situations where this API applies, ElasticGraph will give you an error message indicating that you need to use this API
|
251
|
+
# or {SchemaElements::TypeWithSubfields#renamed_from}. Likewise, when ElasticGraph no longer needs to know about this, it'll give you a warning
|
252
|
+
# indicating the call to this method can be removed.
|
253
|
+
#
|
254
|
+
# @param name [String] name of type that used to exist but has been deleted
|
255
|
+
# @return [void]
|
256
|
+
#
|
257
|
+
# @example Indicate that `Widget` has been deleted
|
258
|
+
# ElasticGraph.define_schema do |schema|
|
259
|
+
# schema.deleted_type "Widget"
|
260
|
+
# end
|
261
|
+
def deleted_type(name)
|
262
|
+
@state.register_deleted_type(
|
263
|
+
name,
|
264
|
+
defined_at: caller_locations(1, 1).first, # : ::Thread::Backtrace::Location
|
265
|
+
defined_via: %(schema.deleted_type "#{name}")
|
266
|
+
)
|
267
|
+
nil
|
268
|
+
end
|
269
|
+
|
270
|
+
# Registers a GraphQL extension module that will be loaded and used by `elasticgraph-graphql`. While such
|
271
|
+
# extension modules can also be configured in a settings YAML file, it can be useful to register it here
|
272
|
+
# when you want to ensure that the extension is used in all environments. For example, an extension library
|
273
|
+
# that defines custom schema elements (such as `elasticgraph-apollo`) may need to ensure its corresponding
|
274
|
+
# GraphQL extension module is used since the custom schema elements would not work correctly otherwise.
|
275
|
+
#
|
276
|
+
# @param extension_module [Module] GraphQL extension module
|
277
|
+
# @param defined_at [String] the `require` path of the extension module
|
278
|
+
# @param extension_config [Hash<Symbol, Object>] configuration options for the extension module
|
279
|
+
# @return [void]
|
280
|
+
#
|
281
|
+
# @example Register `elasticgraph-query_registry` extension module
|
282
|
+
# require(query_registry_require_path = "elastic_graph/query_registry/graphql_extension")
|
283
|
+
#
|
284
|
+
# ElasticGraph.define_schema do |schema|
|
285
|
+
# schema.register_graphql_extension ElasticGraph::QueryRegistry::GraphQLExtension,
|
286
|
+
# defined_at: query_registry_require_path
|
287
|
+
# end
|
288
|
+
def register_graphql_extension(extension_module, defined_at:, **extension_config)
|
289
|
+
@state.graphql_extension_modules << SchemaArtifacts::RuntimeMetadata::Extension.new(extension_module, defined_at, extension_config)
|
290
|
+
nil
|
291
|
+
end
|
292
|
+
|
293
|
+
# @return the results of the schema definition
|
294
|
+
def results
|
295
|
+
@results ||= Results.new(@state)
|
296
|
+
end
|
297
|
+
|
298
|
+
# Defines the version number of the current JSON schema. Importantly, every time a change is made that impacts the JSON schema
|
299
|
+
# artifact, the version number must be incremented to ensure that each different version of the JSON schema is identified by a unique
|
300
|
+
# version number. The publisher will then include this version number in published events to identify the version of the schema it
|
301
|
+
# was using. This avoids the need to deploy the publisher and ElasticGraph indexer at the same time to keep them in sync.
|
302
|
+
#
|
303
|
+
# @note While this is an important part of how ElasticGraph is designed to support schema evolution, it can be annoying constantly
|
304
|
+
# have to increment this while rapidly changing the schema during prototyping. You can disable the requirement to increment this
|
305
|
+
# on every JSON schema change by setting `enforce_json_schema_version` to `false` in your `Rakefile`.
|
306
|
+
#
|
307
|
+
# @param version [Integer] current version number of the JSON schema artifact
|
308
|
+
# @return [void]
|
309
|
+
# @see Local::RakeTasks#enforce_json_schema_version
|
310
|
+
#
|
311
|
+
# @example Set the JSON schema version to 1
|
312
|
+
# ElasticGraph.define_schema do |schema|
|
313
|
+
# schema.json_schema_version 1
|
314
|
+
# end
|
315
|
+
def json_schema_version(version)
|
316
|
+
if !version.is_a?(Integer) || version < 1
|
317
|
+
raise SchemaError, "`json_schema_version` must be a positive integer. Specified version: #{version}"
|
318
|
+
end
|
319
|
+
|
320
|
+
if @state.json_schema_version
|
321
|
+
raise SchemaError, "`json_schema_version` can only be set once on a schema. Previously-set version: #{@state.json_schema_version}"
|
322
|
+
end
|
323
|
+
|
324
|
+
@state.json_schema_version = version
|
325
|
+
@state.json_schema_version_setter_location = caller_locations(1, 1).to_a.first
|
326
|
+
nil
|
327
|
+
end
|
328
|
+
|
329
|
+
# Registers a customization callback that will be applied to every built-in type automatically provided by ElasticGraph. Provides
|
330
|
+
# an opportunity to customize the built-in types (e.g. to add directives to them or whatever).
|
331
|
+
#
|
332
|
+
# @yield [SchemaElements::EnumType, SchemaElements::InputType, SchemaElements::InterfaceType, SchemaElements::ObjectType, SchemaElements::ScalarType, SchemaElements::UnionType] built in type
|
333
|
+
# @return [void]
|
334
|
+
#
|
335
|
+
# @example Customize documentation of built-in types
|
336
|
+
# ElasticGraph.define_schema do |schema|
|
337
|
+
# schema.on_built_in_types do |type|
|
338
|
+
# type.append_to_documentation "This is a built-in ElasticGraph type."
|
339
|
+
# end
|
340
|
+
# end
|
341
|
+
def on_built_in_types(&customization_block)
|
342
|
+
@state.built_in_types_customization_blocks << customization_block
|
343
|
+
nil
|
344
|
+
end
|
345
|
+
|
346
|
+
# While the block executes, makes any `ElasticGraph.define_schema` calls operate on this `API` instance.
|
347
|
+
#
|
348
|
+
# @private
|
349
|
+
def as_active_instance
|
350
|
+
# @type var old_value: API?
|
351
|
+
old_value = ::Thread.current[:ElasticGraph_SchemaDefinition_API_instance]
|
352
|
+
::Thread.current[:ElasticGraph_SchemaDefinition_API_instance] = self
|
353
|
+
yield
|
354
|
+
ensure
|
355
|
+
::Thread.current[:ElasticGraph_SchemaDefinition_API_instance] = old_value
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|