Class: ElasticGraph::SchemaDefinition::JSONSchemaPruner
- Inherits:
-
Object
- Object
- ElasticGraph::SchemaDefinition::JSONSchemaPruner
- Defined in:
- lib/elastic_graph/schema_definition/json_schema_pruner.rb
Overview
Prunes unused type definitions from a given JSON schema.
Class Method Summary collapse
- .collect_ref_names(hash) ⇒ Object
- .prune(original_json_schema) ⇒ Object
- .referenced_type_names(source_type_names, original_defs) ⇒ Object
Class Method Details
.collect_ref_names(hash) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/elastic_graph/schema_definition/json_schema_pruner.rb', line 41 def self.collect_ref_names(hash) hash.flat_map do |key, value| case value when ::Hash collect_ref_names(value) when ::Array value.grep(::Hash).flat_map { |subhash| collect_ref_names(subhash) } when ::String if key == "$ref" && (type = value[%r{\A#/\$defs/(.+)\z}, 1]) [type] else [] end else [] end end end |
.prune(original_json_schema) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/elastic_graph/schema_definition/json_schema_pruner.rb', line 17 def self.prune(original_json_schema) initial_type_names = [EVENT_ENVELOPE_JSON_SCHEMA_NAME] + original_json_schema .dig("$defs", EVENT_ENVELOPE_JSON_SCHEMA_NAME, "properties", "type", "enum") types_to_keep = referenced_type_names(initial_type_names, original_json_schema["$defs"]) # The .select will preserve the sort order of the original hash pruned_defs = original_json_schema["$defs"].select { |k, _v| types_to_keep.include?(k) } original_json_schema.merge("$defs" => pruned_defs) end |
.referenced_type_names(source_type_names, original_defs) ⇒ Object
31 32 33 34 35 36 37 38 |
# File 'lib/elastic_graph/schema_definition/json_schema_pruner.rb', line 31 def self.referenced_type_names(source_type_names, original_defs) return Set.new if source_type_names.empty? referenced_type_defs = original_defs.select { |k, _| source_type_names.include?(k) } ref_names = collect_ref_names(referenced_type_defs) referenced_type_names(ref_names, original_defs) + source_type_names end |