Sha256: 49cbf503003339ff9fa4bce52a9fbde3975a3f7d3ef1574abb54344216dd0909
Contents?: true
Size: 1.82 KB
Versions: 2
Compression:
Stored size: 1.82 KB
Contents
# frozen_string_literal: true module Jimmy # Factory class for making +JSONSchemer::Schema::Base+ instances class SchemerFactory # Returns true if the +json_schemer+ gem is loaded. # @return [true, false] def self.available? defined? ::JSONSchemer end # @param [Schema, #as_json] schema # @param [Array<#resolve, 'net/http'>] resolvers # @param [true, false] cache_resolvers # @param [Hash] opts Options to be passed to +JSONSchemer+ def initialize(schema, *resolvers, cache_resolvers: true, **opts) unless self.class.available? raise LoadError, 'Please add the json_schemer gem to your Gemfile' end @schema = schema @resolvers = resolvers.map(&method(:cast_resolver)) @options = opts.dup return if @resolvers.empty? res = method(:resolve) res = JSONSchemer::CachedRefResolver.new(&res) if cache_resolvers @options[:ref_resolver] = res end # Get an instance of +JSONSchemer::Schema::Base+ that can be used to # validate JSON documents against the given {Schema}. # @return [JSONSchemer::Schema::Base] def schemer @schemer ||= JSONSchemer.schema(@schema.as_json, **@options) end # @param [String, URI, Json::URI] uri # @return [Hash{String => Object}, nil] def resolve(uri) @resolvers.each do |resolver| return resolver.call(uri) unless resolver.respond_to? :resolve schema = resolver.resolve(uri) return schema.as_json if schema end nil end private def cast_resolver(resolver) if resolver == 'net/http' return JSONSchemer::Schema::Base::NET_HTTP_REF_RESOLVER end unless resolver.respond_to? :resolve raise Error::BadArgument, 'Expected an object responding to :resolve' end resolver end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
jimmy-2.1.0 | lib/jimmy/schemer_factory.rb |
jimmy-2.0.3 | lib/jimmy/schemer_factory.rb |