Skip to content

Commit edb2d90

Browse files
committed
Add schema definition extension plumbing
1 parent 3643e2f commit edb2d90

19 files changed

Lines changed: 81 additions & 43 deletions

File tree

config/site/support/doctest_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ module ElasticGraph
8282
artifacts_manager = @api.factory.new_schema_artifact_manager(
8383
schema_definition_results: @api.results,
8484
schema_artifacts_directory: "#{@tmp_dir}/schema_artifacts",
85-
enforce_json_schema_version: true,
85+
extension_artifact_options: {enforce_json_schema_version: true},
8686
output: ::StringIO.new
8787
)
8888

elasticgraph-admin/spec/integration/elastic_graph/admin/index_definition_configurator/for_index_template_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ def fetch_artifact_configuration(schema_artifacts, index_def_name)
167167
factory.new_schema_artifact_manager(
168168
schema_definition_results: schema_def_results,
169169
schema_artifacts_directory: Dir.pwd,
170-
enforce_json_schema_version: true,
170+
extension_artifact_options: {enforce_json_schema_version: true},
171171
output: output_io
172172
).dump_artifacts
173173

elasticgraph-apollo/apollo_tests_implementation/Rakefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#
77
# frozen_string_literal: true
88

9+
require "elastic_graph/schema_definition/extension_module_support"
910
require "elastic_graph/schema_definition/rake_tasks"
1011
require "elastic_graph/apollo/schema_definition/api_extension"
1112
require "pathname"
@@ -17,6 +18,7 @@ ElasticGraph::SchemaDefinition::RakeTasks.new(
1718
index_document_sizes: false,
1819
path_to_schema: project_root / "config/products_schema.rb",
1920
schema_artifacts_directory: project_root / "config/schema/artifacts",
20-
extension_modules: [ElasticGraph::Apollo::SchemaDefinition::APIExtension],
21-
enforce_json_schema_version: false
21+
# Include the JSON ingestion default alongside the Apollo extension so the apollo tests dump JSON schemas.
22+
extension_modules: ElasticGraph::SchemaDefinition::ExtensionModuleSupport.default_extension_modules + [ElasticGraph::Apollo::SchemaDefinition::APIExtension],
23+
extension_artifact_options: {enforce_json_schema_version: false}
2224
)

elasticgraph-graphql/spec/acceptance/schema_evolution_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def dump_schema_artifacts(json_schema_version:, team_extras: "")
6868
index_document_sizes: true,
6969
path_to_schema: path_to_schema,
7070
schema_artifacts_directory: "config/schema/artifacts",
71-
enforce_json_schema_version: true,
71+
extension_artifact_options: {enforce_json_schema_version: true},
7272
output: output
7373
)
7474
end

elasticgraph-indexer/spec/acceptance/schema_evolution_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ def dump_artifacts
404404
index_document_sizes: true,
405405
path_to_schema: path_to_schema,
406406
schema_artifacts_directory: "config/schema/artifacts",
407-
enforce_json_schema_version: true,
407+
extension_artifact_options: {enforce_json_schema_version: true},
408408
output: output
409409
)
410410
end

elasticgraph-local/lib/elastic_graph/local/rake_tasks.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ def initialize(local_config_yaml:, path_to_schema:)
361361
self.derived_type_name_formats = {}
362362
self.type_name_overrides = {}
363363
self.enum_value_overrides_by_type = {}
364-
self.schema_definition_extension_modules = []
364+
self.schema_definition_extension_modules = SchemaDefinition::ExtensionModuleSupport.default_extension_modules
365365
self.enforce_json_schema_version = true
366366
self.env_port_mapping = {}
367367
self.output = $stdout
@@ -394,7 +394,7 @@ def initialize(local_config_yaml:, path_to_schema:)
394394
type_name_overrides: type_name_overrides,
395395
enum_value_overrides_by_type: enum_value_overrides_by_type,
396396
extension_modules: schema_definition_extension_modules,
397-
enforce_json_schema_version: enforce_json_schema_version,
397+
extension_artifact_options: {enforce_json_schema_version: enforce_json_schema_version},
398398
output: output
399399
)
400400

elasticgraph-schema_definition/lib/elastic_graph/schema_definition/api.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
require "elastic_graph/errors"
1010
require "elastic_graph/schema_artifacts/runtime_metadata/extension"
1111
require "elastic_graph/schema_artifacts/runtime_metadata/graphql_resolver"
12+
require "elastic_graph/schema_definition/extension_module_support"
1213
require "elastic_graph/schema_definition/mixins/has_readable_to_s_and_inspect"
1314
require "elastic_graph/schema_definition/results"
1415
require "elastic_graph/schema_definition/state"
@@ -59,7 +60,7 @@ class API
5960
def initialize(
6061
schema_elements,
6162
index_document_sizes,
62-
extension_modules: [],
63+
extension_modules: ExtensionModuleSupport.default_extension_modules,
6364
derived_type_name_formats: {},
6465
type_name_overrides: {},
6566
enum_value_overrides_by_type: {},
@@ -77,7 +78,7 @@ def initialize(
7778

7879
@factory = @state.factory
7980

80-
extension_modules.each { |mod| extend(mod) }
81+
extension_modules.uniq.each { |mod| extend(mod) }
8182

8283
# These lines must come _after_ the extension modules are applied, so that the extension modules
8384
# have a chance to hook into the factory in order to customize built in types if desired.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Copyright 2024 - 2026 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+
module ElasticGraph
10+
module SchemaDefinition
11+
# Helper methods for composing schema definition extension modules.
12+
#
13+
# @private
14+
module ExtensionModuleSupport
15+
# Default extension modules applied to {API} when none are explicitly specified.
16+
#
17+
# @return [Array<Module>] default extension modules
18+
def self.default_extension_modules
19+
[]
20+
end
21+
end
22+
end
23+
end

elasticgraph-schema_definition/lib/elastic_graph/schema_definition/factory.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ module SchemaDefinition
5959
class Factory
6060
include Mixins::HasReadableToSAndInspect.new
6161

62+
# @dynamic state
63+
# @return [State] schema definition state shared with the factory's API
64+
attr_reader :state
65+
6266
def initialize(state)
6367
@state = state
6468
end
@@ -297,15 +301,15 @@ def new_results
297301
def new_schema_artifact_manager(
298302
schema_definition_results:,
299303
schema_artifacts_directory:,
300-
enforce_json_schema_version:,
301304
output:,
305+
extension_artifact_options: {},
302306
max_diff_lines: 50
303307
)
304308
@@schema_artifact_manager_new.call(
305309
schema_definition_results:,
306310
schema_artifacts_directory:,
307-
enforce_json_schema_version:,
308311
output:,
312+
extension_artifact_options:,
309313
max_diff_lines:
310314
)
311315
end

elasticgraph-schema_definition/lib/elastic_graph/schema_definition/rake_tasks.rb

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
require "rake/tasklib"
1010
require "elastic_graph/schema_artifacts/runtime_metadata/schema_element_names"
11+
require "elastic_graph/schema_definition/extension_module_support"
1112

1213
module ElasticGraph
1314
module SchemaDefinition
@@ -41,12 +42,8 @@ class RakeTasks < ::Rake::TaskLib
4142
# specific enum types. For example, to rename the `DayOfWeek.MONDAY` enum to `DayOfWeek.MON`, pass `{DayOfWeek: {MONDAY: "MON"}}`.
4243
# @param extension_modules [Array<Module>] List of Ruby modules to extend onto the `SchemaDefinition::API` instance. Designed to
4344
# support ElasticGraph extension gems (such as `elasticgraph-apollo`).
44-
# @param enforce_json_schema_version [Boolean] Whether or not to enforce the requirement that the JSON schema version is incremented
45-
# every time dumping the JSON schemas results in a changed artifact. Generally speaking, you will want this to be `true` for any
46-
# ElasticGraph application that is in production as the versioning of JSON schemas is what supports safe schema evolution as it
47-
# allows ElasticGraph to identify which version of the JSON schema the publishing system was operating on when it published an
48-
# event. It can be useful to set it to `false` before your application is in production, as you do not want to be forced to bump
49-
# the version after every single schema change while you are building an initial prototype.
45+
# @param extension_artifact_options [Hash<Symbol, Object>] Hash of options forwarded to extension-defined schema artifacts. The JSON
46+
# schema artifact dumper reads `:enforce_json_schema_version` from this hash; extension gems can read their own keys.
5047
# @param output [IO] used for printing task output
5148
#
5249
# @example Minimal setup with defaults
@@ -116,8 +113,8 @@ def initialize(
116113
derived_type_name_formats: {},
117114
type_name_overrides: {},
118115
enum_value_overrides_by_type: {},
119-
extension_modules: [],
120-
enforce_json_schema_version: true,
116+
extension_modules: ExtensionModuleSupport.default_extension_modules,
117+
extension_artifact_options: {},
121118
output: $stdout
122119
)
123120
@schema_element_names = SchemaArtifacts::RuntimeMetadata::SchemaElementNames.new(
@@ -131,7 +128,7 @@ def initialize(
131128
@index_document_sizes = index_document_sizes
132129
@path_to_schema = path_to_schema
133130
@schema_artifacts_directory = schema_artifacts_directory
134-
@enforce_json_schema_version = enforce_json_schema_version
131+
@extension_artifact_options = extension_artifact_options
135132
@extension_modules = extension_modules
136133
@output = output
137134

@@ -164,7 +161,7 @@ def schema_artifact_manager
164161
schema_def_api.factory.new_schema_artifact_manager(
165162
schema_definition_results: schema_def_api.results,
166163
schema_artifacts_directory: @schema_artifacts_directory.to_s,
167-
enforce_json_schema_version: @enforce_json_schema_version,
164+
extension_artifact_options: @extension_artifact_options,
168165
output: @output,
169166
max_diff_lines: max_diff_lines
170167
)

0 commit comments

Comments
 (0)