openapi_parser 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +10 -0
- data/Gemfile +2 -2
- data/README.md +2 -2
- data/Rakefile +2 -2
- data/lib/openapi_parser.rb +7 -2
- data/lib/openapi_parser/concern.rb +2 -0
- data/lib/openapi_parser/concerns/findable.rb +22 -0
- data/lib/openapi_parser/concerns/parseable.rb +232 -0
- data/lib/openapi_parser/path_item_finder.rb +93 -0
- data/lib/openapi_parser/request_operation.rb +30 -0
- data/lib/openapi_parser/schema_validator.rb +172 -0
- data/lib/openapi_parser/schemas.rb +15 -0
- data/lib/openapi_parser/schemas/base.rb +28 -0
- data/lib/openapi_parser/schemas/classes.rb +17 -0
- data/lib/openapi_parser/schemas/components.rb +25 -0
- data/lib/openapi_parser/schemas/media_type.rb +16 -0
- data/lib/openapi_parser/schemas/openapi.rb +31 -0
- data/lib/openapi_parser/schemas/operation.rb +24 -0
- data/lib/openapi_parser/schemas/parameter.rb +12 -0
- data/lib/openapi_parser/schemas/path_item.rb +16 -0
- data/lib/openapi_parser/schemas/paths.rb +7 -0
- data/lib/openapi_parser/schemas/reference.rb +5 -0
- data/lib/openapi_parser/schemas/request_body.rb +20 -0
- data/lib/openapi_parser/schemas/response.rb +12 -0
- data/lib/openapi_parser/schemas/responses.rb +13 -0
- data/lib/openapi_parser/schemas/schema.rb +108 -0
- data/lib/openapi_parser/version.rb +2 -2
- data/openapi_parser.gemspec +19 -17
- metadata +67 -4
- data/Gemfile.lock +0 -35
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ee6c1b21577fd0129c63e8b80fab4f929cccd3220d7888af95bd38f19665e994
         | 
| 4 | 
            +
              data.tar.gz: 1107cd65d31bed5e98f2aad6a5629e87b0bd031c1c23e81e2357f4e2cf6dbad2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 349707da91353ab6a915b192656731d098c8fc45944ac30f2f25569c9ad1379b72909ef1cf305c950a9afc2c3477414d2c457312d9f88a5030fdf04ea30d26b9
         | 
| 7 | 
            +
              data.tar.gz: 06e38d3763f60731baeb3cf650978ad5bcd6ced36701e50122f31df7a2a9855c22e77e75867dec3f63d201878bad10c51d00bf38c560ab35ca3725d502d6807a
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rubocop.yml
    ADDED
    
    
    
        data/Gemfile
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 | 
            -
            source  | 
| 1 | 
            +
            source 'https://rubygems.org'
         | 
| 2 2 |  | 
| 3 | 
            -
            git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
         | 
| 3 | 
            +
            git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
         | 
| 4 4 |  | 
| 5 5 | 
             
            # Specify your gem's dependencies in openapi_parser.gemspec
         | 
| 6 6 | 
             
            gemspec
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            #  | 
| 1 | 
            +
            # OpenAPI Parser
         | 
| 2 2 |  | 
| 3 3 | 
             
            Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/openapi_parser`. To experiment with that code, run `bin/console` for an interactive prompt.
         | 
| 4 4 |  | 
| @@ -40,4 +40,4 @@ The gem is available as open source under the terms of the [MIT License](https:/ | |
| 40 40 |  | 
| 41 41 | 
             
            ## Code of Conduct
         | 
| 42 42 |  | 
| 43 | 
            -
            Everyone interacting in the  | 
| 43 | 
            +
            Everyone interacting in the OpenAPIParser project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/openapi_parser/blob/master/CODE_OF_CONDUCT.md).
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/lib/openapi_parser.rb
    CHANGED
    
    | @@ -1,5 +1,10 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'openapi_parser/version'
         | 
| 2 | 
            +
            require 'openapi_parser/concern'
         | 
| 3 | 
            +
            require 'openapi_parser/schemas'
         | 
| 4 | 
            +
            require 'openapi_parser/path_item_finder'
         | 
| 5 | 
            +
            require 'openapi_parser/request_operation'
         | 
| 6 | 
            +
            require 'openapi_parser/schema_validator'
         | 
| 2 7 |  | 
| 3 | 
            -
            module  | 
| 8 | 
            +
            module OpenAPIParser
         | 
| 4 9 | 
             
              # Your code goes here...
         | 
| 5 10 | 
             
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            module OpenAPIParser::Findable
         | 
| 2 | 
            +
              # @param [String] reference
         | 
| 3 | 
            +
              # @return [OpenAPIParser::Findable]
         | 
| 4 | 
            +
              def find_object(reference)
         | 
| 5 | 
            +
                return nil unless reference.start_with?(object_reference)
         | 
| 6 | 
            +
                return self if object_reference == reference
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                @find_object_cache = {} unless defined? @find_object_cache
         | 
| 9 | 
            +
                if (obj = @find_object_cache[reference])
         | 
| 10 | 
            +
                  return obj
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                _openapi_all_child_objects.each do |c|
         | 
| 14 | 
            +
                  if (obj = c.find_object(reference))
         | 
| 15 | 
            +
                    @find_object_cache[reference] = obj
         | 
| 16 | 
            +
                    return obj
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                nil
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,232 @@ | |
| 1 | 
            +
            module OpenAPIParser::Parseable
         | 
| 2 | 
            +
              def self.included(base)
         | 
| 3 | 
            +
                base.extend(ClassMethods)
         | 
| 4 | 
            +
              end
         | 
| 5 | 
            +
              module ClassMethods
         | 
| 6 | 
            +
                attr_reader :_openapi_attr_values,
         | 
| 7 | 
            +
                            :_openapi_attr_list_objects,
         | 
| 8 | 
            +
                            :_openapi_attr_objects,
         | 
| 9 | 
            +
                            :_openapi_attr_hash_objects,
         | 
| 10 | 
            +
                            :_openapi_attr_hash_body_objects
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                # no option support
         | 
| 13 | 
            +
                def openapi_attr_values(*names)
         | 
| 14 | 
            +
                  names.each { |name| openapi_attr_value(name) }
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def openapi_attr_value(name, options = {})
         | 
| 18 | 
            +
                  @_openapi_attr_values = {} unless defined?(@_openapi_attr_values)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  attr_reader name
         | 
| 21 | 
            +
                  @_openapi_attr_values[name] =  options
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # no option support
         | 
| 25 | 
            +
                def openapi_attr_objects(*names, klass)
         | 
| 26 | 
            +
                  names.each { |name| openapi_attr_object(name, klass) }
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def openapi_attr_object(name, klass, options = {})
         | 
| 30 | 
            +
                  @_openapi_attr_objects = {} unless defined?(@_openapi_attr_objects )
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  attr_reader name
         | 
| 33 | 
            +
                  @_openapi_attr_objects[name] = options.merge(klass: klass)
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def openapi_attr_list_object(name, klass, options = {})
         | 
| 37 | 
            +
                  @_openapi_attr_list_objects = {} unless defined?(@_openapi_attr_list_objects)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  attr_reader name
         | 
| 40 | 
            +
                  @_openapi_attr_list_objects[name] = options.merge(klass: klass)
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def openapi_attr_hash_object(name, klass, options = {})
         | 
| 44 | 
            +
                  @_openapi_attr_hash_objects = {} unless defined?(@_openapi_attr_hash_objects)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  attr_reader name
         | 
| 47 | 
            +
                  @_openapi_attr_hash_objects[name] = options.merge(klass: klass)
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def openapi_attr_hash_body_objects(name, klass, options = {})
         | 
| 51 | 
            +
                  @_openapi_attr_hash_body_objects = {} unless defined?(@_openapi_attr_hash_body_objects)
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  options[:reject_keys] = options[:reject_keys] ? options[:reject_keys].map(&:to_s) : []
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  attr_reader name
         | 
| 56 | 
            +
                  @_openapi_attr_hash_body_objects[name] = options.merge(klass: klass)
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
             | 
| 61 | 
            +
              def _openapi_all_child_objects
         | 
| 62 | 
            +
                @_openapi_all_child_objects ||= []
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              def _add_child_object(object)
         | 
| 66 | 
            +
                return unless object.is_a?(OpenAPIParser::Parseable)
         | 
| 67 | 
            +
                _openapi_all_child_objects << object
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
             | 
| 71 | 
            +
              def load_data
         | 
| 72 | 
            +
                create_attr_values(self.class._openapi_attr_values)
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                create_attr_objects(self.class._openapi_attr_objects)
         | 
| 75 | 
            +
                create_attr_list_objects(self.class._openapi_attr_list_objects)
         | 
| 76 | 
            +
                create_attr_hash_objects(self.class._openapi_attr_hash_objects)
         | 
| 77 | 
            +
                create_attr_hash_body_objects(self.class._openapi_attr_hash_body_objects)
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              def create_attr_list_objects(settings)
         | 
| 81 | 
            +
                return unless settings
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                settings.each do |variable_name, options|
         | 
| 84 | 
            +
                  ref_name_base = options[:schema_key] ? options[:schema_key] : variable_name
         | 
| 85 | 
            +
                  klass = options[:klass]
         | 
| 86 | 
            +
                  allow_reference = options[:reference] || false
         | 
| 87 | 
            +
                  allow_data_type = options[:allow_data_type]
         | 
| 88 | 
            +
                  
         | 
| 89 | 
            +
                  create_attr_list_object(variable_name, raw_schema[ref_name_base.to_s], ref_name_base, klass, allow_reference, allow_data_type)
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              def create_attr_hash_objects(settings)
         | 
| 94 | 
            +
                return unless settings
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                settings.each do |variable_name, options|
         | 
| 97 | 
            +
                  ref_name_base = options[:schema_key] ? options[:schema_key] : variable_name
         | 
| 98 | 
            +
                  klass = options[:klass]
         | 
| 99 | 
            +
                  allow_reference = options[:reference] || false
         | 
| 100 | 
            +
                  allow_data_type = options[:allow_data_type]
         | 
| 101 | 
            +
                  
         | 
| 102 | 
            +
                  create_attr_hash_object(variable_name, raw_schema[ref_name_base .to_s], ref_name_base, klass, allow_reference, allow_data_type)
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
              def create_attr_objects(values)
         | 
| 107 | 
            +
                return unless values
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                values.each do |name, options|
         | 
| 110 | 
            +
                  key = options[:schema_key] ? options[:schema_key] : name
         | 
| 111 | 
            +
                  klass = options[:klass]
         | 
| 112 | 
            +
                  allow_reference = options[:reference] || false
         | 
| 113 | 
            +
                  allow_data_type = options[:allow_data_type]
         | 
| 114 | 
            +
                  
         | 
| 115 | 
            +
                  obj = create_attr_object(name, key, raw_schema[key.to_s], klass, allow_reference, allow_data_type)
         | 
| 116 | 
            +
                  _add_child_object(obj)
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
              end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
              def create_attr_hash_body_objects(values)
         | 
| 121 | 
            +
                return unless values
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                values.each do |name, options|
         | 
| 124 | 
            +
                  klass = options[:klass]
         | 
| 125 | 
            +
                  allow_reference = options[:reference] || false
         | 
| 126 | 
            +
                  allow_data_type = options[:allow_data_type]
         | 
| 127 | 
            +
                  reject_keys = options[:reject_keys]
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  create_hash_body_objects(name, raw_schema, klass, allow_reference, allow_data_type, reject_keys)
         | 
| 130 | 
            +
                end
         | 
| 131 | 
            +
              end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
              def create_attr_values(values)
         | 
| 134 | 
            +
                return unless values
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                values.each do |variable_name, options|
         | 
| 137 | 
            +
                  key = options[:schema_key] ? options[:schema_key] : variable_name
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                  create_variable(variable_name, raw_schema[key.to_s])
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
              end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
             | 
| 144 | 
            +
              # for responses and paths object
         | 
| 145 | 
            +
              def create_hash_body_objects(name, schema, klass, allow_reference, allow_data_type, reject_keys)
         | 
| 146 | 
            +
                unless schema
         | 
| 147 | 
            +
                  create_variable(name, nil)
         | 
| 148 | 
            +
                  return
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                objects = schema.reject{|k, _| reject_keys.include?(k)}.map do |name, child_schema|
         | 
| 152 | 
            +
                  [
         | 
| 153 | 
            +
                      name.to_s, # support string key only in OpenAPI3
         | 
| 154 | 
            +
                      build_openapi_object(escape_reference(name), child_schema, klass, allow_reference, allow_data_type)
         | 
| 155 | 
            +
                  ]
         | 
| 156 | 
            +
                end.to_h
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                create_variable(name, objects)
         | 
| 159 | 
            +
                objects.values.each { |o| _add_child_object(o) }
         | 
| 160 | 
            +
              end
         | 
| 161 | 
            +
             | 
| 162 | 
            +
              # @return [OpenAPIParser::Schemas::Base]
         | 
| 163 | 
            +
              def create_attr_object(variable_name, ref_name, schema, klass, allow_reference, allow_data_type)
         | 
| 164 | 
            +
                data = build_openapi_object(ref_name, schema, klass, allow_reference, allow_data_type)
         | 
| 165 | 
            +
                create_variable(variable_name, data)
         | 
| 166 | 
            +
                data
         | 
| 167 | 
            +
              end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
              def create_attr_hash_object(variable_name, hash_schema, ref_name_base, klass, allow_reference, allow_data_type)
         | 
| 170 | 
            +
                data = if hash_schema
         | 
| 171 | 
            +
                         hash_schema.map { |key, s| [key, build_openapi_object([ref_name_base, key], s, klass, allow_reference, allow_data_type) ]}.to_h
         | 
| 172 | 
            +
                       else
         | 
| 173 | 
            +
                         nil
         | 
| 174 | 
            +
                       end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                create_variable(variable_name, data)
         | 
| 177 | 
            +
                data.values.each { |obj| _add_child_object(obj) } if data
         | 
| 178 | 
            +
              end
         | 
| 179 | 
            +
             | 
| 180 | 
            +
              def create_attr_list_object(variable_name, array_schema, ref_name_base, klass, allow_reference, allow_data_type)
         | 
| 181 | 
            +
                data = if array_schema
         | 
| 182 | 
            +
                         array_schema.map.with_index { |s, idx| build_openapi_object([ref_name_base, idx], s, klass, allow_reference, allow_data_type) }
         | 
| 183 | 
            +
                       else
         | 
| 184 | 
            +
                         nil
         | 
| 185 | 
            +
                       end
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                create_variable(variable_name, data)
         | 
| 188 | 
            +
                data.each { |obj| _add_child_object(obj) } if data
         | 
| 189 | 
            +
              end
         | 
| 190 | 
            +
             | 
| 191 | 
            +
             | 
| 192 | 
            +
              # create instance variable @variable_name using data
         | 
| 193 | 
            +
              # @param [String] variable_name
         | 
| 194 | 
            +
              # @param [Object] data
         | 
| 195 | 
            +
              def create_variable(variable_name, data)
         | 
| 196 | 
            +
                instance_variable_set("@#{variable_name}", data)
         | 
| 197 | 
            +
              end
         | 
| 198 | 
            +
             | 
| 199 | 
            +
              # return nil, klass, Reference
         | 
| 200 | 
            +
              def build_openapi_object(ref_names, schema, klass, allow_reference, allow_data_type)
         | 
| 201 | 
            +
                return nil unless schema
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                if allow_data_type && !check_object_schema?(schema)
         | 
| 204 | 
            +
                  schema
         | 
| 205 | 
            +
                elsif allow_reference && check_reference_schema?(schema)
         | 
| 206 | 
            +
                  OpenAPIParser::Schemas::Reference.new(build_object_reference(ref_names), self, self.root, schema)
         | 
| 207 | 
            +
                else
         | 
| 208 | 
            +
                  klass.new(build_object_reference(ref_names), self, self.root, schema)
         | 
| 209 | 
            +
                end
         | 
| 210 | 
            +
              end
         | 
| 211 | 
            +
             | 
| 212 | 
            +
              # @return Boolean
         | 
| 213 | 
            +
              def check_reference_schema?(check_schema)
         | 
| 214 | 
            +
                check_object_schema?(check_schema) && !check_schema['$ref'].nil?
         | 
| 215 | 
            +
              end
         | 
| 216 | 
            +
             | 
| 217 | 
            +
              def check_object_schema?(check_schema)
         | 
| 218 | 
            +
                check_schema.is_a?(Hash)
         | 
| 219 | 
            +
              end
         | 
| 220 | 
            +
             | 
| 221 | 
            +
              def escape_reference(str)
         | 
| 222 | 
            +
                str.to_s.gsub('/', '~1')
         | 
| 223 | 
            +
              end
         | 
| 224 | 
            +
             | 
| 225 | 
            +
              # @return [String]
         | 
| 226 | 
            +
              def build_object_reference(names)
         | 
| 227 | 
            +
                names = [names] unless names.is_a?(Array)
         | 
| 228 | 
            +
                ref = names.map{ |n| escape_reference(n)}.join('/')
         | 
| 229 | 
            +
             | 
| 230 | 
            +
                "#{object_reference}/#{ref}"
         | 
| 231 | 
            +
              end
         | 
| 232 | 
            +
            end
         | 
| @@ -0,0 +1,93 @@ | |
| 1 | 
            +
            class OpenAPIParser::PathItemFinder
         | 
| 2 | 
            +
              # @param [OpenAPIParser::Schemas::Paths] paths
         | 
| 3 | 
            +
              def initialize(paths)
         | 
| 4 | 
            +
                @root = PathNode.new('/')
         | 
| 5 | 
            +
                @paths = paths
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                @paths.path.each { |path, _path_item_object| @root.register_path_node(path.split("/"), path) }
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              # @param [String, Symbol] http_method like (get, post .... allow symbol)
         | 
| 11 | 
            +
              # @param [String] request_path
         | 
| 12 | 
            +
              # @return [OpenAPIParser::Schemas::Paths]
         | 
| 13 | 
            +
              def operation_object(http_method, request_path)
         | 
| 14 | 
            +
                if (path_item_object = @paths.path[request_path])
         | 
| 15 | 
            +
                  if (op = path_item_object.operation(http_method))
         | 
| 16 | 
            +
                    return op, {} # find no path_params path
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # check with path_params
         | 
| 21 | 
            +
                parse_request_path(http_method, request_path)
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              class PathNode
         | 
| 25 | 
            +
                attr_accessor :full_path, :name
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def initialize(name)
         | 
| 28 | 
            +
                  @name = name
         | 
| 29 | 
            +
                  @children = Hash.new {|h, k| h[k] = PathNode.new(k) }
         | 
| 30 | 
            +
                  @path_template_node = nil # we can't initialize because recursive initialize...
         | 
| 31 | 
            +
                  @full_path = nil
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def register_path_node(splited_path, full_path)
         | 
| 35 | 
            +
                  if splited_path.empty?
         | 
| 36 | 
            +
                    @full_path = full_path
         | 
| 37 | 
            +
                    return
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  path_name = splited_path.shift
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  child = path_template?(path_name) ? path_template_node(path_name) : children[path_name]
         | 
| 43 | 
            +
                  child.register_path_node(splited_path, full_path)
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                # @return [String, nil] and Hash
         | 
| 47 | 
            +
                def find_full_path(splited_path)
         | 
| 48 | 
            +
                  return [@full_path, {}] if splited_path.empty?
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  path_name = splited_path.shift
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  # when ambiguous matching like this
         | 
| 53 | 
            +
                  # /{entity}/me
         | 
| 54 | 
            +
                  # /books/{id}
         | 
| 55 | 
            +
                  # OpenAPI3 depend on the tooling so we use concrete one (using /books/)
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  path_params = {}
         | 
| 58 | 
            +
                  if children.key?(path_name)
         | 
| 59 | 
            +
                    child = children[path_name]
         | 
| 60 | 
            +
                  else
         | 
| 61 | 
            +
                    child = path_template_node(path_name)
         | 
| 62 | 
            +
                    path_params = {"#{child.name}" =>path_name}
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  ret, other_path_params = child.find_full_path(splited_path)
         | 
| 66 | 
            +
                  [ret, path_params.merge(other_path_params)]
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                private
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                attr_reader :children
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                def path_template_node(path_name)
         | 
| 74 | 
            +
                  @path_template_node ||= PathNode.new(path_name[1..(path_name.length-2)]) # delete {} from {name}
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def path_template?(path_name)
         | 
| 78 | 
            +
                  path_name.start_with?('{') && path_name.end_with?('}')
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              private
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              def parse_request_path(http_method, request_path)
         | 
| 85 | 
            +
                original_path, path_params = @root.find_full_path(request_path.split("/"))
         | 
| 86 | 
            +
                return nil, path_params unless original_path
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                path_item_object = @paths.path[original_path]
         | 
| 89 | 
            +
                obj = path_item_object.operation(http_method.to_s)
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                [obj, path_params]
         | 
| 92 | 
            +
              end
         | 
| 93 | 
            +
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            # binding request data and operation object
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class OpenAPIParser::RequestOperation
         | 
| 4 | 
            +
              class << self
         | 
| 5 | 
            +
                # @param [OpenAPIParser::PathItemFinder] path_item_finder
         | 
| 6 | 
            +
                def create(http_method, request_path, path_item_finder)
         | 
| 7 | 
            +
                  endpoint, path_params = path_item_finder.operation_object(http_method, request_path)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  return nil unless endpoint
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  self.new(endpoint, path_params)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              # @!attribute [r] operation_object
         | 
| 16 | 
            +
              #   @return [OpenAPIParser::Schemas::Operation, nil]
         | 
| 17 | 
            +
              # @!attribute [r] path_params
         | 
| 18 | 
            +
              #   @return [Hash{String => String}]
         | 
| 19 | 
            +
              attr_reader :operation_object, :path_params
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def initialize(operation_object, path_params)
         | 
| 22 | 
            +
                @operation_object = operation_object
         | 
| 23 | 
            +
                @path_params = path_params || {}
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              # support application/json only :(
         | 
| 27 | 
            +
              def validate_request_body(content_type, params)
         | 
| 28 | 
            +
                operation_object&.validate_request_body(content_type, params)
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,172 @@ | |
| 1 | 
            +
            class OpenAPIParser::SchemaValidator
         | 
| 2 | 
            +
              class ValidateError < StandardError
         | 
| 3 | 
            +
                def initialize(data, type, reference)
         | 
| 4 | 
            +
                  @data = data
         | 
| 5 | 
            +
                  @type = type
         | 
| 6 | 
            +
                  @reference = reference
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def message
         | 
| 10 | 
            +
                  "#{@data} class is #{@data.class} but it's not valid #{@type} in #{@reference}"
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              class NotNullError < StandardError
         | 
| 15 | 
            +
                def initialize(reference)
         | 
| 16 | 
            +
                  @reference = reference
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def message
         | 
| 20 | 
            +
                  "#{@reference} don't allow null"
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              class NotExistRequiredKey < StandardError
         | 
| 25 | 
            +
                def initialize(keys, reference)
         | 
| 26 | 
            +
                  @keys = keys
         | 
| 27 | 
            +
                  @reference = reference
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def message
         | 
| 31 | 
            +
                  "required parameters #{@keys.join(",")} not exist in #{@reference}"
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              class NotAnyOf < StandardError
         | 
| 36 | 
            +
                def initialize(value, reference)
         | 
| 37 | 
            +
                  @value = value
         | 
| 38 | 
            +
                  @reference = reference
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def message
         | 
| 42 | 
            +
                  "#{@value} isn't any of in #{@reference}"
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              class NotEnumInclude < StandardError
         | 
| 47 | 
            +
                def initialize(value, reference)
         | 
| 48 | 
            +
                  @value = value
         | 
| 49 | 
            +
                  @reference = reference
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def message
         | 
| 53 | 
            +
                  "#{@value} isn't include enum in #{@reference}"
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              class << self
         | 
| 58 | 
            +
                # @param [Hash] value
         | 
| 59 | 
            +
                # @param [OpenAPIParser::Schemas::Schema]
         | 
| 60 | 
            +
                def validate(value, schema)
         | 
| 61 | 
            +
                  new(value, schema).validate_data
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              # @param [Hash] value
         | 
| 66 | 
            +
              # @param [OpenAPIParser::Schemas::Schema] schema
         | 
| 67 | 
            +
              def initialize(value, schema)
         | 
| 68 | 
            +
                @value = value
         | 
| 69 | 
            +
                @schema = schema
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              def validate_data
         | 
| 73 | 
            +
                err = validate_schema(@value, @schema)
         | 
| 74 | 
            +
                raise err if err
         | 
| 75 | 
            +
                nil
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              private
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              # @param [Object] value
         | 
| 81 | 
            +
              # @param [OpenAPIParser::Schemas::Schema] schema
         | 
| 82 | 
            +
              def validate_schema(value, schema)
         | 
| 83 | 
            +
                return unless schema
         | 
| 84 | 
            +
                return validate_any_of(value, schema) if schema.any_of
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                if value.nil?
         | 
| 87 | 
            +
                  return if schema.nullable
         | 
| 88 | 
            +
                  return NotNullError.new(schema.object_reference)
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                case schema.type
         | 
| 92 | 
            +
                when "string"
         | 
| 93 | 
            +
                  return validate_string(value, schema) if value.is_a?(String)
         | 
| 94 | 
            +
                when "integer"
         | 
| 95 | 
            +
                  return validate_integer(value, schema) if value.is_a?(Integer)
         | 
| 96 | 
            +
                when "boolean"
         | 
| 97 | 
            +
                  return if value.is_a?(TrueClass)
         | 
| 98 | 
            +
                  return if value.is_a?(FalseClass)
         | 
| 99 | 
            +
                when "number"
         | 
| 100 | 
            +
                  return validate_integer(value, schema) if value.is_a?(Integer)
         | 
| 101 | 
            +
                  return validate_number(value, schema) if value.is_a?(Numeric)
         | 
| 102 | 
            +
                when "object"
         | 
| 103 | 
            +
                  return validate_object(value, schema) if value.is_a?(Hash)
         | 
| 104 | 
            +
                when "array"
         | 
| 105 | 
            +
                  return validate_array(value, schema) if value.is_a?(Array)
         | 
| 106 | 
            +
                else
         | 
| 107 | 
            +
                  # TODO: unknown type support
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                ValidateError.new(value, schema.type, schema.object_reference)
         | 
| 111 | 
            +
              end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
              # @param [Object] value
         | 
| 114 | 
            +
              # @param [OpenAPIParser::Schemas::Schema] schema
         | 
| 115 | 
            +
              def validate_any_of(value, schema)
         | 
| 116 | 
            +
                # in all schema return error (=true) not any of data
         | 
| 117 | 
            +
                schema.any_of.all? { |s| validate_schema(value, s) } ? NotAnyOf.new(value, schema.object_reference) : nil
         | 
| 118 | 
            +
              end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
              def validate_string(value, schema)
         | 
| 121 | 
            +
                check_enum_include(value, schema)
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
              def validate_integer(value, schema)
         | 
| 125 | 
            +
                check_enum_include(value, schema)
         | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
             | 
| 128 | 
            +
              def validate_number(value, schema)
         | 
| 129 | 
            +
                check_enum_include(value, schema)
         | 
| 130 | 
            +
              end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
              # @param [Object] value
         | 
| 133 | 
            +
              # @param [OpenAPIParser::Schemas::Schema] schema
         | 
| 134 | 
            +
              def check_enum_include(value, schema)
         | 
| 135 | 
            +
                return unless schema.enum
         | 
| 136 | 
            +
                return if schema.enum.include?(value)
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                NotEnumInclude.new(value, schema.object_reference)
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              # @param [Hash] value
         | 
| 142 | 
            +
              # @param [OpenAPIParser::Schemas::Schema] schema
         | 
| 143 | 
            +
              def validate_object(value, schema)
         | 
| 144 | 
            +
                return unless schema.properties
         | 
| 145 | 
            +
                required_set = schema.required ? schema.required.to_set : Set.new
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                value.each do |name, v|
         | 
| 148 | 
            +
                  s = schema.properties[name]
         | 
| 149 | 
            +
                  err = validate_schema(v, s)
         | 
| 150 | 
            +
                  return err if err
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                  required_set.delete(name)
         | 
| 153 | 
            +
                end
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                return NotExistRequiredKey.new(required_set.to_a, schema.object_reference) unless required_set.empty?
         | 
| 156 | 
            +
                nil
         | 
| 157 | 
            +
              end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
              # @param [Array] value
         | 
| 160 | 
            +
              # @param [OpenAPIParser::Schemas::Schema] schema
         | 
| 161 | 
            +
              def validate_array(value, schema)
         | 
| 162 | 
            +
                # array type have an schema in items property
         | 
| 163 | 
            +
                items_schema = schema.items
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                value.each do |v|
         | 
| 166 | 
            +
                  err = validate_schema(v, items_schema)
         | 
| 167 | 
            +
                  return err if err
         | 
| 168 | 
            +
                end
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                nil
         | 
| 171 | 
            +
              end
         | 
| 172 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require_relative 'schemas/classes'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require_relative 'schemas/base'
         | 
| 4 | 
            +
            require_relative 'schemas/openapi'
         | 
| 5 | 
            +
            require_relative 'schemas/paths'
         | 
| 6 | 
            +
            require_relative 'schemas/path_item'
         | 
| 7 | 
            +
            require_relative 'schemas/operation'
         | 
| 8 | 
            +
            require_relative 'schemas/parameter'
         | 
| 9 | 
            +
            require_relative 'schemas/reference'
         | 
| 10 | 
            +
            require_relative 'schemas/request_body'
         | 
| 11 | 
            +
            require_relative 'schemas/response'
         | 
| 12 | 
            +
            require_relative 'schemas/responses'
         | 
| 13 | 
            +
            require_relative 'schemas/components'
         | 
| 14 | 
            +
            require_relative 'schemas/media_type'
         | 
| 15 | 
            +
            require_relative 'schemas/schema'
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            module OpenAPIParser::Schemas
         | 
| 2 | 
            +
              class Base
         | 
| 3 | 
            +
                include OpenAPIParser::Parseable
         | 
| 4 | 
            +
                include OpenAPIParser::Findable
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                attr_reader :parent, :raw_schema, :object_reference, :root
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                # @param [OpenAPIParser::Schemas::Base]
         | 
| 9 | 
            +
                def initialize(object_reference, parent, root, raw_schema)
         | 
| 10 | 
            +
                  @raw_schema = raw_schema
         | 
| 11 | 
            +
                  @parent = parent
         | 
| 12 | 
            +
                  @root = root
         | 
| 13 | 
            +
                  @object_reference = object_reference
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  load_data
         | 
| 16 | 
            +
                  after_init
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                # override
         | 
| 20 | 
            +
                def after_init
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def inspect
         | 
| 25 | 
            +
                  @object_reference
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            # We want to use class name for DSL in class definition so we should define first...
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module OpenAPIParser::Schemas
         | 
| 4 | 
            +
              class Base; end
         | 
| 5 | 
            +
              class OpenAPI < Base; end
         | 
| 6 | 
            +
              class Operation < Base; end
         | 
| 7 | 
            +
              class Parameter < Base; end
         | 
| 8 | 
            +
              class PathItem < Base; end
         | 
| 9 | 
            +
              class Paths < Base; end
         | 
| 10 | 
            +
              class Reference < Base; end
         | 
| 11 | 
            +
              class RequestBody < Base; end
         | 
| 12 | 
            +
              class Responses < Base; end
         | 
| 13 | 
            +
              class Response < Base; end
         | 
| 14 | 
            +
              class MediaType < Base; end
         | 
| 15 | 
            +
              class Schema < Base; end
         | 
| 16 | 
            +
              class Components < Base; end
         | 
| 17 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            # TODO: examples
         | 
| 2 | 
            +
            # TODO: headers
         | 
| 3 | 
            +
            # TODO: securitySchemes
         | 
| 4 | 
            +
            # TODO: links
         | 
| 5 | 
            +
            # TODO: callbacks
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module OpenAPIParser::Schemas
         | 
| 8 | 
            +
              class Components < Base
         | 
| 9 | 
            +
                # @!attribute [r] parameters
         | 
| 10 | 
            +
                #   @return [Hash{String => Parameter}, nil]
         | 
| 11 | 
            +
                openapi_attr_hash_object :parameters, Parameter, reference: true
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                # @!attribute [r] parameters
         | 
| 14 | 
            +
                #   @return [Hash{String => Parameter}, nil]
         | 
| 15 | 
            +
                openapi_attr_hash_object :schemas, Schema, reference: true
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # @!attribute [r] responses
         | 
| 18 | 
            +
                #   @return [Hash{String => Response}, nil]
         | 
| 19 | 
            +
                openapi_attr_hash_object :responses, Response, reference: true
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                # @!attribute [r] request_bodies
         | 
| 22 | 
            +
                #   @return [Hash{String => RequestBody}, nil]
         | 
| 23 | 
            +
                openapi_attr_hash_object :request_bodies, RequestBody, reference: true, schema_key: :requestBodies
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            # TODO: example
         | 
| 2 | 
            +
            # TODO: examples
         | 
| 3 | 
            +
            # TODO: encoding
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module OpenAPIParser::Schemas
         | 
| 6 | 
            +
              class MediaType < Base
         | 
| 7 | 
            +
                # @!attribute [r] schema
         | 
| 8 | 
            +
                #   @return [Schema, nil]
         | 
| 9 | 
            +
                openapi_attr_object :schema, Schema, reference: true
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # @param [Hash] params
         | 
| 12 | 
            +
                def validate_parameter(params)
         | 
| 13 | 
            +
                  OpenAPIParser::SchemaValidator.validate(params, schema)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # TODO: info object
         | 
| 2 | 
            +
            # TODO: servers object
         | 
| 3 | 
            +
            # TODO: tags object
         | 
| 4 | 
            +
            # TODO: externalDocs object
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module OpenAPIParser::Schemas
         | 
| 7 | 
            +
              class OpenAPI < Base
         | 
| 8 | 
            +
                def initialize(raw_schema)
         | 
| 9 | 
            +
                  super('#', nil, self, raw_schema)
         | 
| 10 | 
            +
                  @find_object_cache = {}
         | 
| 11 | 
            +
                  @path_item_finder = OpenAPIParser::PathItemFinder.new(paths)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # @!attribute [r] openapi
         | 
| 15 | 
            +
                #   @return [String, nil]
         | 
| 16 | 
            +
                openapi_attr_values :openapi
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                # @!attribute [r] paths
         | 
| 19 | 
            +
                #   @return [Paths, nil]
         | 
| 20 | 
            +
                openapi_attr_object :paths, Paths, reference: false
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # @!attribute [r] components
         | 
| 23 | 
            +
                #   @return [Components, nil]
         | 
| 24 | 
            +
                openapi_attr_object :components, Components, reference: false
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                # @return [OpenAPIParser::RequestOperation]
         | 
| 27 | 
            +
                def request_operation(http_method, request_path)
         | 
| 28 | 
            +
                  OpenAPIParser::RequestOperation.create(http_method, request_path, @path_item_finder)
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            # TODO: externalDocs
         | 
| 2 | 
            +
            # TODO: callbacks
         | 
| 3 | 
            +
            # TODO: security
         | 
| 4 | 
            +
            # TODO: servers
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module OpenAPIParser::Schemas
         | 
| 7 | 
            +
              class Operation < Base
         | 
| 8 | 
            +
                openapi_attr_values :tags, :summary, :description, :deprecated
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                openapi_attr_value :operation_id, schema_key: :operationId
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                openapi_attr_list_object :parameters, Parameter, reference: true
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # @!attribute [r] request_body
         | 
| 15 | 
            +
                #   @return [OpenAPIParser::Schemas::RequestBody, nil]
         | 
| 16 | 
            +
                openapi_attr_object :request_body, RequestBody, reference: true, schema_key: :requestBody
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                openapi_attr_object :responses, Responses, reference: false
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def validate_request_body(content_type, params)
         | 
| 21 | 
            +
                  request_body&.validate_request_body(content_type, params)
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            # TODO: support examples
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module OpenAPIParser::Schemas
         | 
| 4 | 
            +
              class Parameter < Base
         | 
| 5 | 
            +
                openapi_attr_values :name, :in, :description, :required, :deprecated, :style, :explode, :example
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                openapi_attr_value :allow_empty_value, schema_key: :allowEmptyValue
         | 
| 8 | 
            +
                openapi_attr_value :allow_reserved, schema_key: :allowReserved
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                openapi_attr_object :schema, Schema, reference: true
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            # TODO: support servers
         | 
| 2 | 
            +
            # TODO: support reference
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module OpenAPIParser::Schemas
         | 
| 5 | 
            +
              class PathItem < Base
         | 
| 6 | 
            +
                openapi_attr_values :summary, :description
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                openapi_attr_objects :get, :put, :post, :delete, :options, :head, :patch, :trace, Operation
         | 
| 9 | 
            +
                openapi_attr_list_object :parameters, Parameter, reference: true
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # @return [Operation]
         | 
| 12 | 
            +
                def operation(method)
         | 
| 13 | 
            +
                  send(method)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            # TODO: support extended property
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module OpenAPIParser::Schemas
         | 
| 4 | 
            +
              class RequestBody < Base
         | 
| 5 | 
            +
                openapi_attr_values :description, :required
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # @!attribute [r] content
         | 
| 8 | 
            +
                #   @return [Hash{String => MediaType}, nil]
         | 
| 9 | 
            +
                openapi_attr_hash_object :content, MediaType, reference: false
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def validate_request_body(_content_type, params)
         | 
| 12 | 
            +
                  # TODO: now support application/json only :(
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  media_type = content['application/json']
         | 
| 15 | 
            +
                  return nil unless media_type
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  media_type.validate_parameter(params)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            # TODO: headers
         | 
| 2 | 
            +
            # TODO: links
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module OpenAPIParser::Schemas
         | 
| 5 | 
            +
              class Response < Base
         | 
| 6 | 
            +
                openapi_attr_values :description
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                # @!attribute [r] content
         | 
| 9 | 
            +
                #   @return [Hash{String => MediaType}, nil]
         | 
| 10 | 
            +
                openapi_attr_hash_object :content, MediaType, reference: false
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            # TODO: support extended property
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module OpenAPIParser::Schemas
         | 
| 4 | 
            +
              class Responses < Base
         | 
| 5 | 
            +
                # @!attribute [r] default
         | 
| 6 | 
            +
                #   @return [Response, Reference, nil]
         | 
| 7 | 
            +
                openapi_attr_object :default, Response, reference: true
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                # @!attribute [r] response
         | 
| 10 | 
            +
                #   @return [Hash{String => Response, Reference}, nil]
         | 
| 11 | 
            +
                openapi_attr_hash_body_objects 'response', Response, reject_keys: [:default], allow_reference: true, allow_data_type: false
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| @@ -0,0 +1,108 @@ | |
| 1 | 
            +
            # TODO: support 'not' because I need check reference...
         | 
| 2 | 
            +
            # TODO: support 'discriminator', 'xml', 'externalDocs'
         | 
| 3 | 
            +
            # TODO: support extended property
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module OpenAPIParser::Schemas
         | 
| 6 | 
            +
              class Schema < Base
         | 
| 7 | 
            +
                # @!attribute [r] title
         | 
| 8 | 
            +
                #   @return [String, nil]
         | 
| 9 | 
            +
                # @!attribute [r] pattern
         | 
| 10 | 
            +
                #   @return [String, nil] regexp
         | 
| 11 | 
            +
                # @!attribute [r] pattern
         | 
| 12 | 
            +
                #   @return [String, nil] regexp
         | 
| 13 | 
            +
                # @!attribute [r] description
         | 
| 14 | 
            +
                #   @return [String, nil]
         | 
| 15 | 
            +
                # @!attribute [r] format
         | 
| 16 | 
            +
                #   @return [String, nil]
         | 
| 17 | 
            +
                # @!attribute [r] type
         | 
| 18 | 
            +
                #   @return [String, nil] multiple types doesn't supported in OpenAPI3
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # @!attribute [r] maximum
         | 
| 21 | 
            +
                #   @return [Float, nil]
         | 
| 22 | 
            +
                # @!attribute [r] multipleOf
         | 
| 23 | 
            +
                #   @return [Float, nil]
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                # @!attribute [r] maxLength
         | 
| 26 | 
            +
                #   @return [Integer, nil]
         | 
| 27 | 
            +
                # @!attribute [r] minLength
         | 
| 28 | 
            +
                #   @return [Integer, nil]
         | 
| 29 | 
            +
                # @!attribute [r] maxItems
         | 
| 30 | 
            +
                #   @return [Integer, nil]
         | 
| 31 | 
            +
                # @!attribute [r] minItems
         | 
| 32 | 
            +
                #   @return [Integer, nil]
         | 
| 33 | 
            +
                # @!attribute [r] maxProperties
         | 
| 34 | 
            +
                #   @return [Integer, nil]
         | 
| 35 | 
            +
                # @!attribute [r] minProperties
         | 
| 36 | 
            +
                #   @return [Integer, nil]
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                # @!attribute [r] exclusiveMaximum
         | 
| 39 | 
            +
                #   @return [Boolean, nil]
         | 
| 40 | 
            +
                # @!attribute [r] exclusiveMinimum
         | 
| 41 | 
            +
                #   @return [Boolean, nil]
         | 
| 42 | 
            +
                # @!attribute [r] uniqueItems
         | 
| 43 | 
            +
                #   @return [Boolean, nil]
         | 
| 44 | 
            +
                # @!attribute [r] nullable
         | 
| 45 | 
            +
                #   @return [Boolean, nil]
         | 
| 46 | 
            +
                # @!attribute [r] deprecated
         | 
| 47 | 
            +
                #   @return [Boolean, nil]
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                # @!attribute [r] required
         | 
| 50 | 
            +
                #   @return [Array<String>, nil] at least one item included
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                # @!attribute [r] enum
         | 
| 53 | 
            +
                #   @return [Array, nil] any type array
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                # @!attribute [r] default
         | 
| 56 | 
            +
                #   @return [Object, nil]
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                # @!attribute [r] example
         | 
| 59 | 
            +
                #   @return [Object, nil]
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                openapi_attr_values :title, :multipleOf,
         | 
| 62 | 
            +
                                    :maximum, :exclusiveMaximum, :minimum, :exclusiveMinimum,
         | 
| 63 | 
            +
                                    :maxLength, :minLength,
         | 
| 64 | 
            +
                                    :pattern,
         | 
| 65 | 
            +
                                    :maxItems, :minItems, :uniqueItems,
         | 
| 66 | 
            +
                                    :maxProperties, :minProperties,
         | 
| 67 | 
            +
                                    :required, :enum,
         | 
| 68 | 
            +
                                    :description,
         | 
| 69 | 
            +
                                    :format,
         | 
| 70 | 
            +
                                    :default,
         | 
| 71 | 
            +
                                    :type,
         | 
| 72 | 
            +
                                    :nullable,
         | 
| 73 | 
            +
                                    :example,
         | 
| 74 | 
            +
                                    :deprecated
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                # @!attribute [r] read_only
         | 
| 77 | 
            +
                #   @return [Boolean, nil]
         | 
| 78 | 
            +
                openapi_attr_value :read_only, schema_key: :readOnly
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                # @!attribute [r] write_only
         | 
| 81 | 
            +
                #   @return [Boolean, nil]
         | 
| 82 | 
            +
                openapi_attr_value :write_only, schema_key: :writeOnly
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                # @!attribute [r] all_of
         | 
| 85 | 
            +
                #   @return [Array<Schema, Reference>, nil]
         | 
| 86 | 
            +
                openapi_attr_list_object :all_of, Schema, reference: true, schema_key: :allOf
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                # @!attribute [r] one_of
         | 
| 89 | 
            +
                #   @return [Array<Schema, Reference>, nil]
         | 
| 90 | 
            +
                openapi_attr_list_object :one_of, Schema, reference: true, schema_key: :oneOf
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                # @!attribute [r] any_of
         | 
| 93 | 
            +
                #   @return [Array<Schema, Reference>, nil]
         | 
| 94 | 
            +
                openapi_attr_list_object :any_of, Schema, reference: true, schema_key: :anyOf
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                # @!attribute [r] items
         | 
| 97 | 
            +
                #   @return [Schema, nil]
         | 
| 98 | 
            +
                openapi_attr_object :items, Schema, reference: true
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                # @!attribute [r] properties
         | 
| 101 | 
            +
                #   @return [Hash{String => Schema}, nil]
         | 
| 102 | 
            +
                openapi_attr_hash_object :properties, Schema, reference: true
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                # @!attribute [r] additional_properties
         | 
| 105 | 
            +
                #   @return [Boolean, Schema, Reference, nil]
         | 
| 106 | 
            +
                openapi_attr_object :additional_properties, Schema, reference: true, allow_data_type: true, schema_key: :additionalProperties
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
            end
         | 
| @@ -1,3 +1,3 @@ | |
| 1 | 
            -
            module  | 
| 2 | 
            -
              VERSION =  | 
| 1 | 
            +
            module OpenAPIParser
         | 
| 2 | 
            +
              VERSION = '0.1.1'.freeze
         | 
| 3 3 | 
             
            end
         | 
    
        data/openapi_parser.gemspec
    CHANGED
    
    | @@ -1,29 +1,31 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
            lib = File.expand_path("../lib", __FILE__)
         | 
| 1 | 
            +
            lib = File.expand_path('lib', __dir__)
         | 
| 3 2 | 
             
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 4 | 
            -
            require  | 
| 3 | 
            +
            require 'openapi_parser/version'
         | 
| 5 4 |  | 
| 6 5 | 
             
            Gem::Specification.new do |spec|
         | 
| 7 | 
            -
              spec.name          =  | 
| 8 | 
            -
              spec.version       =  | 
| 9 | 
            -
              spec.authors       = [ | 
| 10 | 
            -
              spec.email         = [ | 
| 6 | 
            +
              spec.name          = 'openapi_parser'
         | 
| 7 | 
            +
              spec.version       = OpenAPIParser::VERSION
         | 
| 8 | 
            +
              spec.authors       = ['ota42y']
         | 
| 9 | 
            +
              spec.email         = ['ota42y@gmail.com']
         | 
| 11 10 |  | 
| 12 | 
            -
              spec.summary       =  | 
| 13 | 
            -
              spec.description   =  | 
| 14 | 
            -
              spec.homepage      =  | 
| 15 | 
            -
              spec.license       =  | 
| 11 | 
            +
              spec.summary       = 'OpenAPI3 parser'
         | 
| 12 | 
            +
              spec.description   = 'parser for OpenAPI 3.0 or later'
         | 
| 13 | 
            +
              spec.homepage      = 'https://github.com/ota42y/openapi_parser'
         | 
| 14 | 
            +
              spec.license       = 'MIT'
         | 
| 16 15 |  | 
| 17 16 | 
             
              # Specify which files should be added to the gem when it is released.
         | 
| 18 17 | 
             
              # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
         | 
| 19 | 
            -
              spec.files         = Dir.chdir(File.expand_path( | 
| 18 | 
            +
              spec.files         = Dir.chdir(File.expand_path(__dir__)) do
         | 
| 20 19 | 
             
                `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
         | 
| 21 20 | 
             
              end
         | 
| 22 | 
            -
              spec.bindir        =  | 
| 21 | 
            +
              spec.bindir        = 'exe'
         | 
| 23 22 | 
             
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 24 | 
            -
              spec.require_paths = [ | 
| 23 | 
            +
              spec.require_paths = ['lib']
         | 
| 25 24 |  | 
| 26 | 
            -
              spec.add_development_dependency  | 
| 27 | 
            -
              spec.add_development_dependency  | 
| 28 | 
            -
              spec.add_development_dependency  | 
| 25 | 
            +
              spec.add_development_dependency 'bundler', '~> 1.16'
         | 
| 26 | 
            +
              spec.add_development_dependency 'fincop'
         | 
| 27 | 
            +
              spec.add_development_dependency 'rake', '~> 10.0'
         | 
| 28 | 
            +
              spec.add_development_dependency 'rspec', '~> 3.0'
         | 
| 29 | 
            +
              spec.add_development_dependency 'pry'
         | 
| 30 | 
            +
              spec.add_development_dependency 'pry-byebug'
         | 
| 29 31 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: openapi_parser
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - ota42y
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018- | 
| 11 | 
            +
            date: 2018-12-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -24,6 +24,20 @@ dependencies: | |
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '1.16'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: fincop
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0'
         | 
| 27 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 42 | 
             
              name: rake
         | 
| 29 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -52,6 +66,34 @@ dependencies: | |
| 52 66 | 
             
                - - "~>"
         | 
| 53 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 68 | 
             
                    version: '3.0'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: pry
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - ">="
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '0'
         | 
| 76 | 
            +
              type: :development
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - ">="
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '0'
         | 
| 83 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            +
              name: pry-byebug
         | 
| 85 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            +
                requirements:
         | 
| 87 | 
            +
                - - ">="
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '0'
         | 
| 90 | 
            +
              type: :development
         | 
| 91 | 
            +
              prerelease: false
         | 
| 92 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
                requirements:
         | 
| 94 | 
            +
                - - ">="
         | 
| 95 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            +
                    version: '0'
         | 
| 55 97 | 
             
            description: parser for OpenAPI 3.0 or later
         | 
| 56 98 | 
             
            email:
         | 
| 57 99 | 
             
            - ota42y@gmail.com
         | 
| @@ -61,19 +103,40 @@ extra_rdoc_files: [] | |
| 61 103 | 
             
            files:
         | 
| 62 104 | 
             
            - ".gitignore"
         | 
| 63 105 | 
             
            - ".rspec"
         | 
| 106 | 
            +
            - ".rubocop.yml"
         | 
| 64 107 | 
             
            - ".travis.yml"
         | 
| 65 108 | 
             
            - CODE_OF_CONDUCT.md
         | 
| 66 109 | 
             
            - Gemfile
         | 
| 67 | 
            -
            - Gemfile.lock
         | 
| 68 110 | 
             
            - LICENSE.txt
         | 
| 69 111 | 
             
            - README.md
         | 
| 70 112 | 
             
            - Rakefile
         | 
| 71 113 | 
             
            - bin/console
         | 
| 72 114 | 
             
            - bin/setup
         | 
| 73 115 | 
             
            - lib/openapi_parser.rb
         | 
| 116 | 
            +
            - lib/openapi_parser/concern.rb
         | 
| 117 | 
            +
            - lib/openapi_parser/concerns/findable.rb
         | 
| 118 | 
            +
            - lib/openapi_parser/concerns/parseable.rb
         | 
| 119 | 
            +
            - lib/openapi_parser/path_item_finder.rb
         | 
| 120 | 
            +
            - lib/openapi_parser/request_operation.rb
         | 
| 121 | 
            +
            - lib/openapi_parser/schema_validator.rb
         | 
| 122 | 
            +
            - lib/openapi_parser/schemas.rb
         | 
| 123 | 
            +
            - lib/openapi_parser/schemas/base.rb
         | 
| 124 | 
            +
            - lib/openapi_parser/schemas/classes.rb
         | 
| 125 | 
            +
            - lib/openapi_parser/schemas/components.rb
         | 
| 126 | 
            +
            - lib/openapi_parser/schemas/media_type.rb
         | 
| 127 | 
            +
            - lib/openapi_parser/schemas/openapi.rb
         | 
| 128 | 
            +
            - lib/openapi_parser/schemas/operation.rb
         | 
| 129 | 
            +
            - lib/openapi_parser/schemas/parameter.rb
         | 
| 130 | 
            +
            - lib/openapi_parser/schemas/path_item.rb
         | 
| 131 | 
            +
            - lib/openapi_parser/schemas/paths.rb
         | 
| 132 | 
            +
            - lib/openapi_parser/schemas/reference.rb
         | 
| 133 | 
            +
            - lib/openapi_parser/schemas/request_body.rb
         | 
| 134 | 
            +
            - lib/openapi_parser/schemas/response.rb
         | 
| 135 | 
            +
            - lib/openapi_parser/schemas/responses.rb
         | 
| 136 | 
            +
            - lib/openapi_parser/schemas/schema.rb
         | 
| 74 137 | 
             
            - lib/openapi_parser/version.rb
         | 
| 75 138 | 
             
            - openapi_parser.gemspec
         | 
| 76 | 
            -
            homepage: https:// | 
| 139 | 
            +
            homepage: https://github.com/ota42y/openapi_parser
         | 
| 77 140 | 
             
            licenses:
         | 
| 78 141 | 
             
            - MIT
         | 
| 79 142 | 
             
            metadata: {}
         | 
    
        data/Gemfile.lock
    DELETED
    
    | @@ -1,35 +0,0 @@ | |
| 1 | 
            -
            PATH
         | 
| 2 | 
            -
              remote: .
         | 
| 3 | 
            -
              specs:
         | 
| 4 | 
            -
                openapi_parser (0.1.0)
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            GEM
         | 
| 7 | 
            -
              remote: https://rubygems.org/
         | 
| 8 | 
            -
              specs:
         | 
| 9 | 
            -
                diff-lcs (1.3)
         | 
| 10 | 
            -
                rake (10.5.0)
         | 
| 11 | 
            -
                rspec (3.8.0)
         | 
| 12 | 
            -
                  rspec-core (~> 3.8.0)
         | 
| 13 | 
            -
                  rspec-expectations (~> 3.8.0)
         | 
| 14 | 
            -
                  rspec-mocks (~> 3.8.0)
         | 
| 15 | 
            -
                rspec-core (3.8.0)
         | 
| 16 | 
            -
                  rspec-support (~> 3.8.0)
         | 
| 17 | 
            -
                rspec-expectations (3.8.2)
         | 
| 18 | 
            -
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 19 | 
            -
                  rspec-support (~> 3.8.0)
         | 
| 20 | 
            -
                rspec-mocks (3.8.0)
         | 
| 21 | 
            -
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 22 | 
            -
                  rspec-support (~> 3.8.0)
         | 
| 23 | 
            -
                rspec-support (3.8.0)
         | 
| 24 | 
            -
             | 
| 25 | 
            -
            PLATFORMS
         | 
| 26 | 
            -
              ruby
         | 
| 27 | 
            -
             | 
| 28 | 
            -
            DEPENDENCIES
         | 
| 29 | 
            -
              bundler (~> 1.16)
         | 
| 30 | 
            -
              openapi_parser!
         | 
| 31 | 
            -
              rake (~> 10.0)
         | 
| 32 | 
            -
              rspec (~> 3.0)
         | 
| 33 | 
            -
             | 
| 34 | 
            -
            BUNDLED WITH
         | 
| 35 | 
            -
               1.16.6
         |