apipie-params 0.0.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.
@@ -0,0 +1,2 @@
1
+ Gemfile.lock
2
+ coverage
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'pry'
7
+ gem 'simplecov'
8
+ end
@@ -0,0 +1,20 @@
1
+ Copyright 2012 Pavel Pokorný
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,23 @@
1
+ Apipie Params
2
+ =============
3
+
4
+ DSL for Hash/JSON descriptions. Describe format of hashes using Ruby
5
+ code, generate a json-schema for it and validate values against it.
6
+
7
+ It's based on the DSL of apipie-rails. See
8
+ [its documentation](https://github.com/Pajk/apipie-rails#parameter-description)
9
+ for more details. It basically lets you use the param descriptions
10
+ outside of Rails controllers.
11
+
12
+ In this phase, the validation itself is an experimental feature. You
13
+ need to install `json-schema` gem explicitly.
14
+
15
+ License
16
+ -------
17
+
18
+ MIT
19
+
20
+ Author
21
+ ------
22
+
23
+ Ivan Nečas
@@ -0,0 +1,7 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'lib' << 'test'
5
+ t.test_files = FileList['test/**/*_test.rb']
6
+ t.verbose = true
7
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "apipie/params/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "apipie-params"
7
+ s.version = Apipie::Params::VERSION
8
+ s.authors = ["Ivan Necas"]
9
+ s.email = ["inecas@redhat.com"]
10
+ s.homepage = "http://github.com/iNecas/apipie-params"
11
+ s.summary = "DSL for describing data structures"
12
+ s.description = "Allows defining structure of data and " +
13
+ "perform validation against it using json-schema"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency "activesupport"
20
+ s.add_dependency "rake"
21
+ s.add_development_dependency "json-schema"
22
+ s.add_development_dependency "minitest"
23
+ end
@@ -0,0 +1,6 @@
1
+ require 'json-schema'
2
+ require 'apipie/params.rb'
3
+ require 'apipie/params/errors.rb'
4
+ require 'apipie/params/dsl.rb'
5
+ require 'apipie/params/description.rb'
6
+ require 'apipie/params/descriptor.rb'
@@ -0,0 +1,7 @@
1
+ module Apipie
2
+ module Params
3
+ def self.define(&block)
4
+ Params::Description.define(&block)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,56 @@
1
+ require 'forwardable'
2
+
3
+ module Apipie
4
+ module Params
5
+ class Description
6
+
7
+ attr_accessor :name, :desc, :allow_nil, :required, :descriptor, :options
8
+
9
+ def self.define(&block)
10
+ param_description = Description.new(nil, nil, {})
11
+ param_description.descriptor = Descriptor::Hash.new(block, {})
12
+ return param_description
13
+ end
14
+
15
+ def initialize(name, descriptor_arg, options = {}, &block)
16
+ @options = options
17
+ @name = name
18
+ @desc = @options[:desc]
19
+ # if required is specified, set to boolean of the value, nil
20
+ # otherwise: nil allows us specify the default value later.
21
+ @required = @options.has_key?(:required) ? !!@options[:required] : nil
22
+ @allow_nil = @options.has_key?(:allow_nil) ? !!@options[:allow_nil] : nil
23
+
24
+ unless descriptor_arg.nil?
25
+ @descriptor = Params::Descriptor::Base.find(descriptor_arg,
26
+ options,
27
+ block)
28
+ else
29
+ @descriptor = nil
30
+ end
31
+
32
+ end
33
+
34
+ def validate!(value)
35
+ descriptor.validate!(self, value)
36
+ end
37
+
38
+ def respond_to?(method)
39
+ case method.to_s
40
+ when 'params', 'param'
41
+ @descriptor.respond_to?(method)
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ def method_missing(method, *args, &block)
48
+ if respond_to?(method)
49
+ @descriptor.send(method, *args, &block)
50
+ else
51
+ super
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,343 @@
1
+ require 'active_support/core_ext/hash/indifferent_access'
2
+ require 'forwardable'
3
+
4
+ module Apipie
5
+ module Params
6
+ module Descriptor
7
+
8
+ class Base
9
+ def initialize(options)
10
+ if options.is_a? ::Hash
11
+ @options = options
12
+ else
13
+ @options = {}
14
+ end
15
+ end
16
+
17
+ def self.inherited(subclass)
18
+ @descriptor_classes ||= []
19
+ @descriptor_classes.insert 0, subclass
20
+ end
21
+
22
+ # find the right descriptor for given options
23
+ def self.find(argument, options, block)
24
+ if argument.is_a? Descriptor::Base
25
+ return argument
26
+ end
27
+
28
+ # in case param description (or something else quacking the
29
+ # same) is passed
30
+ if argument.respond_to?(:descriptor) &&
31
+ argument.descriptor.is_a?(Descriptor::Base)
32
+ return argument.descriptor
33
+ end
34
+
35
+ @descriptor_classes.each do |descriptor_class|
36
+ descriptor = descriptor_class.build(argument, options, block)
37
+ return descriptor if descriptor
38
+ end
39
+
40
+ return nil
41
+ end
42
+
43
+ # to be used in the error description and json representation
44
+ def description
45
+ ""
46
+ end
47
+
48
+ def invalid_param_error(param_description, error_value, errors = [])
49
+ Params::Errors::Invalid.new(param_description, error_value, description)
50
+ end
51
+
52
+ def to_json
53
+ self.json_schema
54
+ end
55
+
56
+ end
57
+
58
+ class JsonSchema < Base
59
+ def self.inherited(subclass)
60
+ Base.inherited(subclass)
61
+ end
62
+
63
+ def self.build(*args)
64
+ # this is an abstract class
65
+ nil
66
+ end
67
+
68
+ def json_schema
69
+ {'description' => description}
70
+ end
71
+
72
+
73
+ def validate!(param_description, value)
74
+ encapsulated_value = {'root' => value}
75
+ encapsulated_schema = {
76
+ 'type' => 'object',
77
+ 'properties' => {'root' => json_schema}
78
+ }
79
+ errors = JSON::Validator.fully_validate(encapsulated_schema,
80
+ encapsulated_value.with_indifferent_access,
81
+ :errors_as_objects => true)
82
+
83
+ if errors.any?
84
+ raise invalid_param_error(param_description, value, errors)
85
+ else
86
+ return true
87
+ end
88
+ end
89
+
90
+ end
91
+
92
+ # validate arguments type
93
+ class String < JsonSchema
94
+
95
+ def self.build(type, options, block)
96
+ self.new(options) if type == ::String
97
+ end
98
+
99
+ def description
100
+ "Must be a string"
101
+ end
102
+
103
+ def json_schema
104
+ super.merge('type' => 'string')
105
+ end
106
+
107
+ end
108
+
109
+ # validate arguments type
110
+ class Integer < JsonSchema
111
+
112
+ def self.build(type, options, block)
113
+ self.new(options) if type == ::Integer
114
+ end
115
+
116
+ def description
117
+ "Must be an integer"
118
+ end
119
+
120
+ def json_schema
121
+ super.merge('type' => 'integer')
122
+ end
123
+
124
+ end
125
+
126
+ # validate arguments value with regular expression
127
+ class Regexp < JsonSchema
128
+
129
+ def self.build(regexp, options, block)
130
+ self.new(regexp, options) if regexp.is_a? ::Regexp
131
+ end
132
+
133
+ def initialize(regexp, options)
134
+ super(options)
135
+ @regexp = regexp
136
+ end
137
+
138
+ def description
139
+ "Must match regular expression /#{@regexp.source}/."
140
+ end
141
+
142
+ def json_schema
143
+ super.merge('type' => 'string', 'pattern' => @regexp.source)
144
+ end
145
+
146
+ end
147
+
148
+ # arguments value must be one of given in array
149
+ class Enum < JsonSchema
150
+
151
+ def self.build(enum, options, block)
152
+ if enum.is_a?(::Array) && block.nil?
153
+ self.new(enum, options)
154
+ end
155
+ end
156
+
157
+ def initialize(enum, options)
158
+ super(options)
159
+ @enum = enum
160
+ end
161
+
162
+ def description
163
+ "Must be one of: #{@enum.join(', ')}."
164
+ end
165
+
166
+ def json_schema
167
+ super.merge('type' => 'any', 'enum' => @enum)
168
+ end
169
+
170
+ end
171
+
172
+ class Hash < JsonSchema
173
+
174
+ class DSL
175
+ include Params::DSL
176
+
177
+ def initialize(&block)
178
+ instance_eval(&block)
179
+ end
180
+ end
181
+
182
+ def self.build(argument, options, block)
183
+ if block.is_a?(::Proc) && block.arity <= 0 && argument == ::Hash
184
+ self.new(block, options)
185
+ end
186
+ end
187
+
188
+ def initialize(block, options)
189
+ super(options)
190
+ @dsl_data = DSL.new(&block)._apipie_params_dsl_data
191
+ end
192
+
193
+ def params
194
+ @params ||= @dsl_data.map do |name, arg, options, block|
195
+ Description.new(name, arg, options, &block)
196
+ end
197
+ return @params
198
+ end
199
+
200
+ def param(param_name)
201
+ params.find { |param| param.name.to_s == param_name.to_s }
202
+ end
203
+
204
+ def description
205
+ "Must be a Hash"
206
+ end
207
+
208
+ def json_schema
209
+ properties = params.reduce({}) do |hash, description|
210
+ hash.update(description.name.to_s => description.descriptor.json_schema)
211
+ end
212
+ super.merge('type' => 'object',
213
+ 'properties' => properties)
214
+ end
215
+
216
+ def invalid_param_error(param_description, error_value, errors)
217
+ descriptions = errors.map do |error|
218
+ fragment_descriptor(param_description, error[:fragment])
219
+ end
220
+ # TODO: handle multiple errors at the same time
221
+ invalid_param = descriptions.first
222
+ description = invalid_param.descriptor.description
223
+ Params::Errors::Invalid.new(invalid_param, error_value, description)
224
+ end
225
+
226
+ def fragment_descriptor(param_description, fragment)
227
+ keys_path = fragment.sub(/\A#\/root\//,'').split('/')
228
+ keys_path.delete_if { |a| a =~ /\A\d+\Z/ }
229
+ keys_path.reduce(param_description) do |description, key|
230
+ description.param(key)
231
+ end
232
+ end
233
+
234
+ end
235
+
236
+ class Array < JsonSchema
237
+
238
+ extend Forwardable
239
+
240
+ def_delegators :@descriptor, :invalid_param_error
241
+
242
+ def self.build(argument, options, block)
243
+ if argument == ::Array && block.is_a?(::Proc)
244
+ self.new(block, options)
245
+ end
246
+ end
247
+
248
+ def initialize(descriptor_or_block, options)
249
+ super(options)
250
+ case descriptor_or_block
251
+ when ::Proc
252
+ @descriptor = Hash.new(descriptor_or_block, options)
253
+ when Descriptor::Base
254
+ @descriptor = descriptor_or_block
255
+ else
256
+ raise ArgumentError, "Proc or Descriptor::Base expected, got #{descriptor_or_block.class.name}"
257
+ end
258
+ end
259
+
260
+ def description
261
+ "Must be an Array"
262
+ end
263
+
264
+ def json_schema
265
+ super.merge(
266
+ 'type' => 'array',
267
+ 'items' => @descriptor.json_schema
268
+ )
269
+ end
270
+
271
+ # delegate to params and param only if @descriptor supports those
272
+ def respond_to?(method)
273
+ case method.to_s
274
+ when 'params', 'param'
275
+ @descriptor.respond_to?(method)
276
+ else
277
+ super
278
+ end
279
+ end
280
+
281
+ def method_missing(method, *args, &block)
282
+ if respond_to?(method)
283
+ @descriptor.send(method, *args, &block)
284
+ else
285
+ super
286
+ end
287
+ end
288
+
289
+ end
290
+
291
+ # special type of descriptor: we say that it's not specified
292
+ class Undef < JsonSchema
293
+
294
+ def self.build(argument, options, block)
295
+ if argument == :undef
296
+ self.new(options)
297
+ end
298
+ end
299
+
300
+ def json_schema
301
+ super.merge('type' => 'any')
302
+ end
303
+ end
304
+
305
+ class Number < Regexp
306
+
307
+ def self.build(argument, options, block)
308
+ if argument == :number
309
+ self.new(self.pattern, options)
310
+ end
311
+ end
312
+
313
+ def description
314
+ "Must be a number."
315
+ end
316
+
317
+ def self.pattern
318
+ /\A(0|[1-9]\d*)\Z$/
319
+ end
320
+
321
+ end
322
+
323
+ class Boolean < Enum
324
+
325
+ def self.build(argument, options, block)
326
+ if argument == :bool
327
+ self.new(valid_values, options)
328
+ end
329
+ end
330
+
331
+ def self.valid_values
332
+ %w[true false]
333
+ end
334
+
335
+ def description
336
+ "Must be 'true' or 'false'"
337
+ end
338
+
339
+ end
340
+
341
+ end
342
+ end
343
+ end
@@ -0,0 +1,39 @@
1
+ module Apipie
2
+ module Params
3
+ module DSL
4
+ def _apipie_params_dsl_data
5
+ @_apipie_params_dsl_data ||= _apipie_params_dsl_data_init
6
+ end
7
+
8
+ def _apipie_params_dsl_data_init
9
+ @_apipie_params_dsl_data = []
10
+ end
11
+
12
+ # Describe method's parameter
13
+ #
14
+ # Example:
15
+ # param :greeting, String, :desc => "arbitrary text", :required => true
16
+ #
17
+ def param(param_name, descriptor_arg, desc_or_options = nil, options = {}, &block) #:doc:
18
+ if desc_or_options.is_a? String
19
+ options = options.merge(:desc => desc_or_options)
20
+ end
21
+ _apipie_params_dsl_data << [param_name,
22
+ descriptor_arg,
23
+ options,
24
+ block]
25
+ end
26
+
27
+ # +descriptor+ might be instance of Descriptor::Base or
28
+ # something that has it in :descriptor method
29
+ def array_of(descriptor)
30
+ descriptor = if descriptor.is_a? Descriptor::Base
31
+ elsif descriptor.respond_to?(:descriptor)
32
+ descriptor.descriptor
33
+ end
34
+ Descriptor::Array.new(descriptor, {})
35
+ end
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,35 @@
1
+ module Apipie
2
+ module Params
3
+ module Errors
4
+
5
+ class ParamError < StandardError
6
+ attr_accessor :description
7
+
8
+ def initialize(description)
9
+ @description = description
10
+ end
11
+ end
12
+
13
+ class Missing < ParamError
14
+ def to_s
15
+ "Missing parameter #{@description.name}"
16
+ end
17
+ end
18
+
19
+ class Invalid < ParamError
20
+ attr_accessor :value, :error
21
+
22
+ def initialize(description, value, error)
23
+ super(description)
24
+ @value = value
25
+ @error = error
26
+ end
27
+
28
+ def to_s
29
+ "Invalid parameter '#{description.name}' value #{@value.inspect}: #{@error}"
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ module Apipie
2
+ module Params
3
+ VERSION = '0.0.1' unless defined? Apipie::Params::VERSION
4
+ end
5
+ end
@@ -0,0 +1,58 @@
1
+ require 'test_helper'
2
+
3
+ module Apipie
4
+ module Params
5
+ class DescriptionTest < Test::Unit::TestCase
6
+
7
+ def test_define
8
+ person_description = Params.define do
9
+ param :name, String
10
+ param :age, :number, 'in years'
11
+ param :address, Hash do
12
+ param :street, String
13
+ param :zip, String
14
+ end
15
+ end
16
+
17
+ assert_equal [:name, :age, :address], person_description.params.map(&:name)
18
+ assert_equal [:street, :zip], person_description.param(:address).params.map(&:name)
19
+
20
+ classroom_description = Params.define do
21
+ param :name, String
22
+ param :teacher, person_description
23
+ param :students, array_of(person_description)
24
+ end
25
+
26
+ teacher_description = classroom_description.param(:teacher)
27
+ assert_equal [:name, :age, :address], teacher_description.params.map(&:name)
28
+ students_description = classroom_description.param(:students)
29
+ assert_instance_of Descriptor::Array, students_description.descriptor
30
+ assert_equal [:name, :age, :address], students_description.params.map(&:name)
31
+ end
32
+
33
+ def test_params
34
+ description = Description.new('test', nil, {})
35
+ descriptor_with_params =
36
+ Descriptor::Hash.new(Proc.new { param(:test, String) }, {})
37
+ descriptor_without_params = Descriptor::String.new({})
38
+
39
+ description.descriptor = descriptor_with_params
40
+ assert description.respond_to?(:params)
41
+ assert description.respond_to?(:param)
42
+
43
+ description.descriptor = descriptor_without_params
44
+ assert !description.respond_to?(:params)
45
+ assert !description.respond_to?(:param)
46
+ end
47
+
48
+ def test_validate
49
+ description = Description.new('test', String, {})
50
+ description.validate!('123')
51
+ assert_raise Errors::Invalid do
52
+ description.validate!(123)
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,120 @@
1
+ require 'test_helper'
2
+
3
+ module Apipie
4
+ module Params
5
+ describe Descriptor do
6
+
7
+ def self.describe_validator(valid_value, invalid_value, exception_matcher)
8
+ describe 'valid value' do
9
+ let(:value) { valid_value }
10
+
11
+ it 'succeeds' do
12
+ subject.validate!(value)
13
+ end
14
+ end
15
+
16
+ describe 'invalid value' do
17
+ let(:value) { invalid_value }
18
+
19
+ it 'fails' do
20
+ exception = lambda do
21
+ subject.validate!(value)
22
+ end.must_raise Params::Errors::Invalid
23
+ exception.message.must_match(exception_matcher)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe 'custom descriptor' do
29
+ subject { Description.new('test', :custom, {}) }
30
+ #describe_validator('valid', 'invalid', /value has to be "value"/)
31
+ it 'allows to extend the default json schema'
32
+ end
33
+
34
+ describe 'string descriptor' do
35
+ subject { Description.new('test', String, {}) }
36
+ describe_validator('valid', :invalid, /Must be a string/)
37
+ end
38
+
39
+ describe 'integer descriptor' do
40
+ subject { Description.new('test', Integer, {}) }
41
+ describe_validator(123, '123', /Must be an integer/)
42
+ end
43
+
44
+ describe 'regexp descriptor' do
45
+ subject { Description.new('test', /\Avalid/, {}) }
46
+ describe_validator('valid', 'invalid', /Must match/)
47
+ end
48
+
49
+ describe 'enum descriptor' do
50
+ subject { Description.new('test', ['valid', 'valider'], {}) }
51
+ describe_validator('valid', 'invalid', /Must be one of/)
52
+ end
53
+
54
+ describe 'hash descriptor' do
55
+ subject do
56
+ Description.new('test', Hash, {}) do
57
+ param :name, String
58
+ param :address, Hash do
59
+ param :street, String
60
+ param :zip, String
61
+ end
62
+ end
63
+ end
64
+ # TODO: test require and allow_nil
65
+ describe_validator({:name => "valid"}, {:name => 123}, /Must be a string/)
66
+
67
+ describe '#params' do
68
+ it 'returns param descriptions of all keys' do
69
+ name_description, address_description = subject.params
70
+ name_description.name.must_equal :name
71
+ address_description.name.must_equal :address
72
+ address_description.params.map(&:name).must_equal([:street, :zip])
73
+ end
74
+ end
75
+
76
+ describe '#param' do
77
+ it 'returns param description for a key' do
78
+ street_description = subject.param(:address).param(:street)
79
+ street_description.name.must_equal :street
80
+ street_description.descriptor.must_be_kind_of Descriptor::String
81
+ end
82
+ end
83
+ end
84
+
85
+ describe 'array descriptor' do
86
+ subject do
87
+ Description.new('test', ::Array, {}) do
88
+ param :name, String
89
+ end
90
+ end
91
+
92
+ describe_validator([{:name => "valid"}], [{:name => :invalid}], /Must be a string/)
93
+ end
94
+
95
+ describe 'undef descriptor' do
96
+ subject { Description.new('test', :undef, {}) }
97
+
98
+ describe 'valid value' do
99
+ let(:value) { 'whatever' }
100
+
101
+ it 'succeeds' do
102
+ subject.validate!(value)
103
+ end
104
+ end
105
+
106
+ end
107
+
108
+ describe 'number descriptor' do
109
+ subject { Description.new('test', :number, {}) }
110
+ describe_validator('123', 'a23', /Must be a number/)
111
+ end
112
+
113
+ describe 'boolean descriptor' do
114
+ subject { Description.new('test', :bool, {}) }
115
+ describe_validator('true', 'no', /Must be 'true' or 'false'/)
116
+ end
117
+
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,13 @@
1
+ if ENV['SIMPLECOV']
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter '/test/'
5
+ end
6
+ end
7
+
8
+ require 'test/unit'
9
+
10
+
11
+ require 'minitest/spec'
12
+
13
+ require 'apipie-params'
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: apipie-params
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ivan Necas
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: json-schema
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: minitest
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Allows defining structure of data and perform validation against it using
79
+ json-schema
80
+ email:
81
+ - inecas@redhat.com
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - Gemfile
88
+ - MIT-LICENSE
89
+ - README.md
90
+ - Rakefile
91
+ - apipie-params.gemspec
92
+ - lib/apipie-params.rb
93
+ - lib/apipie/params.rb
94
+ - lib/apipie/params/description.rb
95
+ - lib/apipie/params/descriptor.rb
96
+ - lib/apipie/params/dsl.rb
97
+ - lib/apipie/params/errors.rb
98
+ - lib/apipie/params/version.rb
99
+ - test/description_test.rb
100
+ - test/descriptor_test.rb
101
+ - test/test_helper.rb
102
+ homepage: http://github.com/iNecas/apipie-params
103
+ licenses: []
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 1.8.25
123
+ signing_key:
124
+ specification_version: 3
125
+ summary: DSL for describing data structures
126
+ test_files:
127
+ - test/description_test.rb
128
+ - test/descriptor_test.rb
129
+ - test/test_helper.rb