Class: ElasticGraph::SchemaDefinition::API
- Inherits:
-
Object
- Object
- ElasticGraph::SchemaDefinition::API
- Defined in:
- elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb
Overview
Root API object that provides the schema definition API.
Instance Attribute Summary collapse
-
#factory ⇒ Factory
readonly
Object responsible for instantiating all schema element classes.
-
#state ⇒ State
readonly
Object which holds all state for the schema definition.
Instance Method Summary collapse
-
#deleted_type(name) ⇒ void
Registers the name of a type that existed in a prior version of the schema but has been deleted.
-
#enum_type(name) {|SchemaElements::EnumType| ... } ⇒ void
Defines a GraphQL enum type.
-
#interface_type(name) {|SchemaElements::InterfaceType| ... } ⇒ void
Defines a GraphQL interface.
-
#json_schema_strictness(allow_omitted_fields: false, allow_extra_fields: true) ⇒ void
Defines strictness of the JSON schema validation.
-
#json_schema_version(version) ⇒ void
Defines the version number of the current JSON schema.
-
#object_type(name) {|SchemaElements::ObjectType| ... } ⇒ void
Defines a GraphQL object type Use it to define a concrete type that has subfields.
-
#on_built_in_types {|SchemaElements::EnumType, SchemaElements::InputType, SchemaElements::InterfaceType, SchemaElements::ObjectType, SchemaElements::ScalarType, SchemaElements::UnionType| ... } ⇒ void
Registers a customization callback that will be applied to every built-in type automatically provided by ElasticGraph.
-
#on_root_query_type {|SchemaElements::ObjectType| ... } ⇒ void
Registers a customization callback that will be applied to the root
Querytype when it is generated. -
#raw_sdl(string) ⇒ void
Defines a raw GraphQL SDL snippet that will be included in the generated
schema.graphqlartifact. -
#register_graphql_extension(extension_module, defined_at:, **config) ⇒ void
Registers a GraphQL extension module that will be loaded and used by
elasticgraph-graphql. -
#register_graphql_resolver(name, klass, defined_at:, **resolver_config) ⇒ void
Registers a GraphQL resolver that will be loaded and used by
elasticgraph-graphql. -
#results ⇒ Object
The results of the schema definition.
-
#scalar_type(name) {|SchemaElements::ScalarType| ... } ⇒ void
Defines a GraphQL scalar type.
-
#union_type(name) {|SchemaElements::UnionType| ... } ⇒ void
Defines a GraphQL union type.
Instance Attribute Details
#factory ⇒ Factory (readonly)
Returns object responsible for instantiating all schema element classes.
56 57 58 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 56 def factory @factory end |
#state ⇒ State (readonly)
Returns object which holds all state for the schema definition.
53 54 55 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 53 def state @state end |
Instance Method Details
#deleted_type(name) ⇒ void
In situations where this API applies, ElasticGraph will give you an error message indicating that you need to use this API or SchemaElements::TypeWithSubfields#renamed_from. Likewise, when ElasticGraph no longer needs to know about this, it'll give you a warning indicating the call to this method can be removed.
This method returns an undefined value.
Registers the name of a type that existed in a prior version of the schema but has been deleted.
266 267 268 269 270 271 272 273 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 266 def deleted_type(name) @state.register_deleted_type( name, defined_at: caller_locations(1, 1).to_a.first, # : ::Thread::Backtrace::Location defined_via: %(schema.deleted_type "#{name}") ) nil end |
#enum_type(name) {|SchemaElements::EnumType| ... } ⇒ void
This method returns an undefined value.
Defines a GraphQL enum type.
The type is restricted to an enumerated set of values, each with a unique name.
Use value or values to define the enum values in the passed block.
Note: if required by your configuration, this may generate a pair of Enum types (an input enum and an output enum).
198 199 200 201 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 198 def enum_type(name, &block) @state.register_enum_type @factory.new_enum_type(name.to_s, &block) nil end |
#interface_type(name) {|SchemaElements::InterfaceType| ... } ⇒ void
This method returns an undefined value.
Defines a GraphQL interface. Use it to define an abstract supertype with one or more fields that concrete implementations of the interface must also define. Each implementation can be an SchemaElements::ObjectType or SchemaElements::InterfaceType.
167 168 169 170 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 167 def interface_type(name, &block) @state.register_object_interface_or_union_type @factory.new_interface_type(name.to_s, &block) nil end |
#json_schema_strictness(allow_omitted_fields: false, allow_extra_fields: true) ⇒ void
If you allow both omitted fields and extra fields, ElasticGraph's JSON schema validation will allow (and ignore) misspelled
field names in indexing events. For example, if the ElasticGraph schema has a nullable field named parentId but the publisher
accidentally provides it as parent_id, ElasticGraph would happily ignore the parent_id field entirely, because parentId
is allowed to be omitted and parent_id would be treated as an extra field. Therefore, we recommend that you only set one of
these to true (or none).
This method returns an undefined value.
Defines strictness of the JSON schema validation. By default, the JSON schema will require all fields to be provided by the publisher (but they can be nullable) and will ignore extra fields that are not defined in the schema. Use this method to configure this behavior.
446 447 448 449 450 451 452 453 454 455 456 457 458 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 446 def json_schema_strictness(allow_omitted_fields: false, allow_extra_fields: true) unless [true, false].include?(allow_omitted_fields) raise Errors::SchemaError, "`allow_omitted_fields` must be true or false" end unless [true, false].include?(allow_extra_fields) raise Errors::SchemaError, "`allow_extra_fields` must be true or false" end @state.allow_omitted_json_schema_fields = allow_omitted_fields @state.allow_extra_json_schema_fields = allow_extra_fields nil end |
#json_schema_version(version) ⇒ void
While this is an important part of how ElasticGraph is designed to support schema evolution, it can be annoying constantly
have to increment this while rapidly changing the schema during prototyping. You can disable the requirement to increment this
on every JSON schema change by setting enforce_json_schema_version to false in your Rakefile.
This method returns an undefined value.
Defines the version number of the current JSON schema. Importantly, every time a change is made that impacts the JSON schema artifact, the version number must be incremented to ensure that each different version of the JSON schema is identified by a unique version number. The publisher will then include this version number in published events to identify the version of the schema it was using. This avoids the need to deploy the publisher and ElasticGraph indexer at the same time to keep them in sync.
414 415 416 417 418 419 420 421 422 423 424 425 426 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 414 def json_schema_version(version) if !version.is_a?(Integer) || version < 1 raise Errors::SchemaError, "`json_schema_version` must be a positive integer. Specified version: #{version}" end if @state.json_schema_version raise Errors::SchemaError, "`json_schema_version` can only be set once on a schema. Previously-set version: #{@state.json_schema_version}" end @state.json_schema_version = version @state.json_schema_version_setter_location = caller_locations(1, 1).to_a.first nil end |
#object_type(name) {|SchemaElements::ObjectType| ... } ⇒ void
This method returns an undefined value.
Defines a GraphQL object type Use it to define a concrete type that
has subfields. Object types can either be indexed (e.g. directly indexed in the datastore, and available to query from the
root Query object) or embedded in other indexed types.
133 134 135 136 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 133 def object_type(name, &block) @state.register_object_interface_or_union_type @factory.new_object_type(name.to_s, &block) nil end |
#on_built_in_types {|SchemaElements::EnumType, SchemaElements::InputType, SchemaElements::InterfaceType, SchemaElements::ObjectType, SchemaElements::ScalarType, SchemaElements::UnionType| ... } ⇒ void
This method returns an undefined value.
Registers a customization callback that will be applied to every built-in type automatically provided by ElasticGraph. Provides an opportunity to customize the built-in types (e.g. to add directives to them or whatever).
472 473 474 475 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 472 def on_built_in_types(&customization_block) @state.built_in_types_customization_blocks << customization_block nil end |
#on_root_query_type {|SchemaElements::ObjectType| ... } ⇒ void
This method returns an undefined value.
Registers a customization callback that will be applied to the root Query type when it is generated.
488 489 490 491 492 493 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 488 def on_root_query_type(&customization_block) on_built_in_types do |type| customization_block.call(_ = type) if type.name == "Query" end nil end |
#raw_sdl(string) ⇒ void
This method returns an undefined value.
Defines a raw GraphQL SDL snippet that will be included in the generated schema.graphql artifact. Designed to be an escape hatch,
for when ElasticGraph doesn’t provide another way to write some type of GraphQL SDL element that you need. Currently, the only
known use case is to define custom GraphQL directives.
104 105 106 107 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 104 def raw_sdl(string) @state.sdl_parts << string nil end |
#register_graphql_extension(extension_module, defined_at:, **config) ⇒ void
This method returns an undefined value.
Registers a GraphQL extension module that will be loaded and used by elasticgraph-graphql. While such
extension modules can also be configured in a settings YAML file, it can be useful to register it here
when you want to ensure that the extension is used in all environments. For example, an extension library
that defines custom schema elements (such as elasticgraph-apollo) may need to ensure its corresponding
GraphQL extension module is used since the custom schema elements would not work correctly otherwise.
293 294 295 296 297 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 293 def register_graphql_extension(extension_module, defined_at:, **config) extension = SchemaArtifacts::RuntimeMetadata::Extension.new(extension_module, defined_at, config) @state.graphql_extension_modules << SchemaArtifacts::RuntimeMetadata::GraphQLExtension.new(extension.to_dumpable_hash) nil end |
#register_graphql_resolver(name, klass, defined_at:, **resolver_config) ⇒ void
This method returns an undefined value.
Registers a GraphQL resolver that will be loaded and used by elasticgraph-graphql. To use a GraphQL resolver you have
registered, set a field's resolver to the name you provide when registering your resolver.
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 372 def register_graphql_resolver(name, klass, defined_at:, **resolver_config) extension = SchemaArtifacts::RuntimeMetadata::Extension.new(klass, defined_at, resolver_config) needs_lookahead = if extension.verify_against(SchemaArtifacts::RuntimeMetadata::GraphQLResolver::InterfaceWithLookahead).empty? true else extension.verify_against!(SchemaArtifacts::RuntimeMetadata::GraphQLResolver::InterfaceWithoutLookahead) false end resolver = SchemaArtifacts::RuntimeMetadata::GraphQLResolver.new( needs_lookahead: needs_lookahead, resolver_ref: extension.to_dumpable_hash ) @state.graphql_resolvers_by_name[name] = resolver nil end |
#results ⇒ Object
Returns the results of the schema definition.
393 394 395 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 393 def results @results ||= @factory.new_results end |
#scalar_type(name) {|SchemaElements::ScalarType| ... } ⇒ void
This method returns an undefined value.
Defines a GraphQL scalar type. ElasticGraph itself uses this to define a few
common scalar types (e.g. Date and DateTime), but it is also available to you to use to define your own custom scalar types.
248 249 250 251 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 248 def scalar_type(name, &block) @state.register_scalar_type @factory.new_scalar_type(name.to_s, &block) nil end |
#union_type(name) {|SchemaElements::UnionType| ... } ⇒ void
This method returns an undefined value.
Defines a GraphQL union type. Use it to define an abstract supertype with one or more concrete subtypes. Each subtype must be an SchemaElements::ObjectType, but they do not have to share any fields in common.
229 230 231 232 |
# File 'elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb', line 229 def union_type(name, &block) @state.register_object_interface_or_union_type @factory.new_union_type(name.to_s, &block) nil end |