Sha256: 7035efb4dd0b8a28f5d1a449e3af79279ec429685f7c3704c0f3ef55a2577b5e

Contents?: true

Size: 1.74 KB

Versions: 8

Compression:

Stored size: 1.74 KB

Contents

require_relative "validation"

module JSON
  module SchemaBuilder
    class Schema
      include Validation

      attr_accessor :data, :entities
      delegate :[], :[]=, :to_h, :as_json, to: :data

      def initialize(hash = {}, entities = nil)
        @data = hash.with_indifferent_access
        @entities = Array(entities)
      end

      def options
        JSON::SchemaBuilder.options.to_h
      end

      def fragments
        fragment_map = Hash.new { |hash, key| hash[key] = [] }
        entities.map(&:fragments).each do |entity_fragments|
          entity_fragments.each do |fragment, entity|
            fragment_map[fragment] += entity
          end
        end
        fragment_map
      end

      def merge(schema)
        self.class.new _deep_merge(data, schema.data), entities + schema.entities
      end

      def merge!(schema)
        @data = _deep_merge(data, schema.data)
        @entities += schema.entities
        self
      end

      def _deep_merge(this, other)
        this.deep_merge(other) do |current_key, this_value, other_value|
          if current_key == "anyOf"
            _deep_merge_any_of(Array(this_value), Array(other_value))
          elsif this_value.is_a?(::Array) && other_value.is_a?(::Array)
            this_value + other_value
          else
            other_value
          end
        end
      end

      def _deep_merge_any_of(this, other)
        object = self.class.new
        combined = []

        (this + other).each do |item|
          if item[:type].to_sym == :object
            object.data = object._deep_merge(object.data, item)
          else
            combined << item
          end
        end

        combined << object.data unless object.data.empty?
        combined.uniq
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
json-schema_builder-0.8.2 lib/json/schema_builder/schema.rb
json-schema_builder-0.8.1 lib/json/schema_builder/schema.rb
json-schema_builder-0.8.0 lib/json/schema_builder/schema.rb
json-schema_builder-0.7.1 lib/json/schema_builder/schema.rb
json-schema_builder-0.7.0 lib/json/schema_builder/schema.rb
json-schema_builder-0.6.1 lib/json/schema_builder/schema.rb
json-schema_builder-0.6.0 lib/json/schema_builder/schema.rb
json-schema_builder-0.5.0 lib/json/schema_builder/schema.rb