parametric 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 9fece5e356da755e6b7d0571b1e86b20a6291def
4
- data.tar.gz: af78d3380fb03a0b95036d5a66345d26c6ec85aa
5
- SHA512:
6
- metadata.gz: 365b72ed5a785678d6788023972124ddfc796118426f4281da28ea1529ebb4bd38db417fbc85d0c8fe6b28bfa9482ba22d9dc8a073448450a4bdc33f92de879c
7
- data.tar.gz: d3bc507e91bc614db0f665bff1ef33ae5af4ae77a6ab92e98befb3e90b97ddca09908fa65dfeac583e44dac5a9915421de60b02a8432c89dc48da9b959ba5bd1
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ea2ea42f0944e44e3fa09a487428f6b8cd6ef61f
4
+ data.tar.gz: 5e058214303cc07ac28f93924529efe8b88875fc
5
+ SHA512:
6
+ metadata.gz: e418038925d9b0e9c302cfd616b8148dd855377aaf1fa3d69ec7cb9f821add9c6e649bb096bb539fb581b4c2fcb6ca2b51ea23fc953530930daa71cdb754d184
7
+ data.tar.gz: 6efb123579da71f5195f3a36f5a02a0747193c55a60217c2061afc3186367cfe28bf5798c09ba11da82335b05a9e2cd83b2434964457685e9c3e905df621d45a
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  [![Build Status](https://travis-ci.org/ismasan/parametric.png)](https://travis-ci.org/ismasan/parametric)
3
3
  [![Gem Version](https://badge.fury.io/rb/parametric.png)](http://badge.fury.io/rb/parametric)
4
4
 
5
- DSL for declaring allowed parameters with options, regexp patern and default values.
5
+ DSL for declaring allowed parameters with options, regexp pattern and default values.
6
6
 
7
7
  Useful for building self-documeting APIs, search or form objects.
8
8
 
@@ -138,24 +138,25 @@ order_search.available_params # => {page: 2, per_page: 50}
138
138
  `#schema` returns a data structure including meta-data on each parameter, such as "label" and "options". Useful for building forms or self-documented Hypermedia APIs (or maybe [json-schema](http://json-schema.org/example2.html) endpoints).
139
139
 
140
140
  ```ruby
141
- order_search.schema # =>
141
+ order_search.schema[:q].label # => 'Full text search query'
142
+ order_search.schema[:q].value # => ''
142
143
 
143
- {
144
- q: {label: 'Full text search query', value: ''},
145
- page: {label: 'Page number', value: 1},
146
- per_page: {label: 'Items per page', value: 30},
147
- status: {label: 'Order status', value: '', options: ['checkout', 'pending', 'closed', 'shipped'], multiple: true},
148
- sort: {label: 'Sort', value: 'updated_on-desc', options: ['updated_on-desc', 'updated_on-asc']}
149
- }
144
+ order_search.schema[:page].label # => 'Page number'
145
+ order_search.schema[:page].value # => 1
146
+
147
+ order_search.schema[:status].label # => 'Order status'
148
+ order_search.schema[:status].value # => ['pending']
149
+ order_search.schema[:status].options # => ['checkout', 'pending', 'closed', 'shipped']
150
+ order_search.schema[:status].multiple # => true
151
+ order_search.schema[:status].default # => 'closed'
150
152
  ```
151
153
 
152
154
  ## Parametric::Hash
153
155
 
154
- The alternative `Parametric::Hash` module makes your objects quack like a hash, instead of exposing the `#params` object directly.
156
+ The alternative `Parametric::Hash` class makes your objects quack like a hash, instead of exposing the `#params` object directly.
155
157
 
156
158
  ```ruby
157
- class OrdersParams
158
- include Parametric::Hash
159
+ class OrdersParams < Parametric::Hash
159
160
  param :q, 'Full text search query'
160
161
  param :page, 'Page number', default: 1
161
162
  param :per_page, 'Items per page', default: 30
@@ -170,10 +171,48 @@ order_params[:per_page] # => 30
170
171
  order_params.each{|key, value| ... }
171
172
  ```
172
173
 
174
+ ## Nested structures
175
+
176
+ You can also nest parameter definitions. This is useful if you need to model POST payloads, for example.
177
+
178
+ ```ruby
179
+ class AccountPayload
180
+ include Parametric::Params
181
+ param :status, 'Account status', default: 'pending', options: ['pending', 'active', 'cancelled']
182
+ param :users, 'Users in this account', multiple: true do
183
+ param :name, 'User name'
184
+ param :title, 'Job title', default: 'Employee'
185
+ param :email, 'User email', match: /\w+@\w+\.\w+/
186
+ end
187
+ param :owner, 'Owner user' do
188
+ param :name, 'User name'
189
+ param :email, 'User email', match: /\w+@\w+\.\w+/
190
+ end
191
+ end
192
+ ```
193
+
194
+ The example above expects a data structure like the following:
195
+
196
+ ```ruby
197
+ {
198
+ status: 'active',
199
+ users: [
200
+ {name: 'Joe Bloggs', email: 'joe@bloggs.com'},
201
+ {name: 'jane Bloggs', email: 'jane@bloggs.com', title: 'CEO'}
202
+ ],
203
+ owner: {
204
+ name: 'Olivia Owner',
205
+ email: 'olivia@owner.com'
206
+ }
207
+ }
208
+ ```
209
+
173
210
  ## Use cases
174
211
 
175
212
  ### In Rails
176
213
 
214
+ You can use one-level param definitions in GET actions
215
+
177
216
  ```ruby
178
217
  def index
179
218
  @search = OrdersSearch.new(params)
@@ -190,6 +229,29 @@ def index
190
229
  end
191
230
  ```
192
231
 
232
+ You can use nested definitions on POST/PUT actions, for example as part of your own strategy objects.
233
+
234
+ ```ruby
235
+ def create
236
+ @payload = AccountPayload.new(params)
237
+ if @payload.save
238
+ render json: AccountSerializer.new(@payload.order)
239
+ else
240
+ render json: ErrorSerializer.new(@payload.errors), status: 422
241
+ end
242
+ end
243
+ ```
244
+
245
+ You can also use the `#schema` metadata to build Hypermedia "actions" or forms.
246
+
247
+ ```ruby
248
+ # /accounts/new.json
249
+ def new
250
+ @payload = AccountPayload.new
251
+ render json: JsonSchemaSerializer.new(@payload.schema)
252
+ end
253
+ ```
254
+
193
255
  ## Installation
194
256
 
195
257
  Add this line to your application's Gemfile:
@@ -1,36 +1,38 @@
1
+ require 'forwardable'
1
2
  module Parametric
2
- module Hash
3
-
4
- def self.included(base)
5
- base.send(:include, Params)
6
- base.send(:include, Enumerable)
7
- base.extend Forwardable
8
- base.send(:def_delegators, :params,
9
- :[],
10
- :[]=,
11
- :each,
12
- :each_value,
13
- :each_key,
14
- :each_pair,
15
- :keys,
16
- :values,
17
- :values_at,
18
- :fetch,
19
- :size,
20
- :to_hash,
21
- :merge,
22
- :merge!,
23
- :replace,
24
- :update,
25
- :has_key?,
26
- :key?,
27
- :key,
28
- :select,
29
- :select!,
30
- :delete,
31
- :store
32
- )
33
- end
3
+ class Hash
4
+ include Params
5
+ include Enumerable
6
+ extend ::Forwardable
7
+ def_delegators(:params,
8
+ :[],
9
+ :[]=,
10
+ :each,
11
+ :each_value,
12
+ :each_key,
13
+ :each_pair,
14
+ :keys,
15
+ :values,
16
+ :values_at,
17
+ :fetch,
18
+ :size,
19
+ :to_hash,
20
+ :merge,
21
+ :merge!,
22
+ :replace,
23
+ :update,
24
+ :has_key?,
25
+ :key?,
26
+ :key,
27
+ :select,
28
+ :select!,
29
+ :delete,
30
+ :store,
31
+ :inspect,
32
+ :stringify_keys,
33
+ :symbolize_keys
34
+ )
34
35
 
35
36
  end
37
+
36
38
  end
@@ -1,3 +1,4 @@
1
+ require 'ostruct'
1
2
  module Parametric
2
3
 
3
4
  class ParamsHash < Hash
@@ -21,19 +22,19 @@ module Parametric
21
22
 
22
23
  def available_params
23
24
  @available_params ||= params.each_with_object(ParamsHash.new) do |(k,v),memo|
24
- memo[k] = v if Utils.present?(v)
25
+ if Utils.present?(v)
26
+ memo[k] = v.respond_to?(:available_params) ? v.available_params : v
27
+ end
25
28
  end
26
29
  end
27
30
 
28
31
  def schema
29
32
  @schema ||= params.each_with_object({}) do |(k,v),memo|
30
- memo[k] = {
31
- value: Utils.value(v),
32
- label: self.class._allowed_params[k][:label],
33
- multiple: !!self.class._allowed_params[k][:multiple]
34
- }
35
- memo[k][:match] = self.class._allowed_params[k][:match].to_s if self.class._allowed_params[k].has_key?(:match)
36
- memo[k][:options] = self.class._allowed_params[k][:options] if self.class._allowed_params[k].has_key?(:options)
33
+ is_nested = v.kind_of?(Parametric::Hash)
34
+ attrs = self.class._allowed_params[k].dup
35
+ attrs[:value] = is_nested ? v : Utils.value(v)
36
+ attrs[:schema] = v.schema if is_nested
37
+ memo[k] = OpenStruct.new(attrs)
37
38
  end
38
39
  end
39
40
 
@@ -41,13 +42,13 @@ module Parametric
41
42
 
42
43
  def _reduce(raw_params)
43
44
  self.class._allowed_params.each_with_object(ParamsHash.new) do |(key,options),memo|
44
- policy = Policies::Policy.new(raw_params[key], options)
45
+ policy = Policies::Policy.new((raw_params.has_key?(key) ? raw_params[key] : []), options)
46
+ policy = policy.wrap(Policies::NestedPolicy) if options[:nested]
45
47
  policy = policy.wrap(Policies::MultiplePolicy) if options[:multiple]
46
48
  policy = policy.wrap(Policies::OptionsPolicy) if options[:options]
47
49
  policy = policy.wrap(Policies::MatchPolicy) if options[:match]
48
50
  policy = policy.wrap(Policies::DefaultPolicy) if options.has_key?(:default)
49
51
  policy = policy.wrap(Policies::SinglePolicy) unless options[:multiple]
50
-
51
52
  memo[key] = policy.value
52
53
  end
53
54
  end
@@ -57,8 +58,13 @@ module Parametric
57
58
  @allowed_params ||= {}
58
59
  end
59
60
 
60
- def param(field_name, label = '', opts = {})
61
+ def param(field_name, label = '', opts = {}, &block)
61
62
  opts[:label] = label
63
+ if block_given?
64
+ nested = Class.new(Parametric::Hash)
65
+ nested.instance_eval &block
66
+ opts[:nested] = nested
67
+ end
62
68
  _allowed_params[field_name] = opts
63
69
  end
64
70
  end
@@ -12,7 +12,7 @@ module Parametric
12
12
  end
13
13
 
14
14
  def value
15
- Array(@value)
15
+ [@value].flatten
16
16
  end
17
17
 
18
18
  protected
@@ -22,7 +22,7 @@ module Parametric
22
22
  class DefaultPolicy < Policy
23
23
  def value
24
24
  v = decorated.value
25
- v.any? ? v : Array(options[:default])
25
+ v.size > 0 ? v : Array(options[:default])
26
26
  end
27
27
  end
28
28
 
@@ -36,6 +36,14 @@ module Parametric
36
36
  end
37
37
  end
38
38
 
39
+ class NestedPolicy < Policy
40
+ def value
41
+ decorated.value.map do |v|
42
+ options[:nested].new(v)
43
+ end
44
+ end
45
+ end
46
+
39
47
  class SinglePolicy < Policy
40
48
  def value
41
49
  decorated.value.first
@@ -1,3 +1,3 @@
1
1
  module Parametric
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe Parametric do
4
+
5
+ describe Parametric::Params do
6
+
7
+ let(:klass) do
8
+ Class.new do
9
+ include Parametric::Params
10
+ param :name, 'User name'
11
+ param :tags, 'Tags', multiple: true, default: 'defaulttag'
12
+ param :lala, 'Lala' do
13
+ param :foo, 'foo'
14
+ end
15
+ param :account, 'Account' do
16
+ param :name, 'Account name'
17
+ param :admin, 'Admin user' do
18
+ param :name, 'User name'
19
+ end
20
+ param :shop, 'Shop' do
21
+ param :url, 'Shop url', default: 'http://google.com'
22
+ end
23
+ end
24
+ param :variants, 'Product variants', multiple: true do
25
+ param :name, 'variant name', default: 'default'
26
+ param :price
27
+ param :tags, 'Variant tags', multiple: true
28
+ end
29
+ end
30
+ end
31
+
32
+ let(:subject) do
33
+ klass.new({
34
+ foo: 'bar',
35
+ name: 'user1',
36
+ account: {
37
+ name: 'account1',
38
+ lala: 1,
39
+ admin: {
40
+ name: 'Joe Bloggs'
41
+ }
42
+ },
43
+ variants: [
44
+ {name: 'red', price: 10},
45
+ {price: 11, tags: 'foo,bar'}
46
+ ]
47
+ })
48
+ end
49
+
50
+ describe '#params' do
51
+ it 'filters nested objects' do
52
+ expect(subject.params.has_key?(:foo)).to be_false
53
+ expect(subject.params[:name]).to eql('user1')
54
+ expect(subject.params[:account][:name]).to eql('account1')
55
+ expect(subject.params[:account].has_key?(:lala)).to be_false
56
+ expect(subject.params[:account][:admin][:name]).to eql('Joe Bloggs')
57
+ end
58
+
59
+ it 'nullifies nested objects that were not passed' do
60
+ expect(subject.params[:account].has_key?(:shop)).to be_true
61
+ expect(subject.params[:account][:shop]).to be_nil
62
+ end
63
+
64
+ it 'filters nested :multiple into arrays of objects' do
65
+ expect(subject.params[:variants].size).to eql(2)
66
+ expect(subject.params[:variants][0][:name]).to eql('red')
67
+ expect(subject.params[:variants][0][:price]).to eql(10)
68
+ expect(subject.params[:variants][0][:tags]).to match_array([])
69
+ expect(subject.params[:variants][1][:name]).to eql('default')
70
+ expect(subject.params[:variants][1][:price]).to eql(11)
71
+ expect(subject.params[:variants][1][:tags]).to match_array(['foo', 'bar'])
72
+ end
73
+ end
74
+
75
+ describe '#available_params' do
76
+ it 'does not include key for nested objects that were not passed' do
77
+ expect(subject.available_params.has_key?(:lala)).to be_false
78
+ expect(subject.available_params[:account].has_key?(:shop)).to be_false
79
+ end
80
+ end
81
+
82
+ describe '#schema' do
83
+ it 'includes nested param schemas' do
84
+ expect(subject.schema[:account].schema[:name].value).to eql('account1')
85
+ expect(subject.schema[:account].schema[:name].label).to eql('Account name')
86
+ expect(subject.schema[:account].schema[:admin].schema[:name].value).to eql('Joe Bloggs')
87
+ end
88
+ end
89
+ end
90
+ end
@@ -5,7 +5,7 @@ describe Parametric do
5
5
  Parametric::VERSION.should_not be_nil
6
6
  end
7
7
 
8
- describe Parametric do
8
+ describe Parametric::Params do
9
9
 
10
10
  let(:klass) do
11
11
  Class.new do
@@ -18,6 +18,7 @@ describe Parametric do
18
18
  param :country, 'country', options: ['UK', 'CL', 'JPN']
19
19
  param :email, 'email', match: /\w+@\w+\.\w+/
20
20
  param :emails, 'emails', match: /\w+@\w+\.\w+/, multiple: true, default: 'default@email.com'
21
+ param :available, 'available', default: true
21
22
  end
22
23
  end
23
24
 
@@ -44,8 +45,12 @@ describe Parametric do
44
45
  klass.new(email: 'my@email').params[:email].should be_nil
45
46
  end
46
47
 
48
+ it 'defaults work for false values' do
49
+ klass.new(email: 'my@email').params[:email].should be_nil
50
+ end
51
+
47
52
  it 'does set value if it does :match' do
48
- klass.new(email: 'my@email.com').params[:email].should == 'my@email.com'
53
+ klass.new(available: false).params[:available].should be_false
49
54
  end
50
55
 
51
56
  it 'only sets value for :multiple values that :match' do
@@ -101,7 +106,7 @@ describe Parametric do
101
106
  let(:subject) { klass.new(foo: 'bar', name: 'lala', per_page: 20, status: 'four', emails: 'one@email.com,two@email.com') }
102
107
 
103
108
  it 'only includes declared params with values or defaults' do
104
- subject.available_params.keys.sort.should == [:emails, :name, :page, :per_page]
109
+ subject.available_params.keys.sort.should == [:available, :emails, :name, :page, :per_page]
105
110
  subject.available_params[:emails].should == ['one@email.com', 'two@email.com']
106
111
  subject.available_params[:name].should == 'lala'
107
112
  subject.available_params[:per_page].should == 20
@@ -119,46 +124,45 @@ describe Parametric do
119
124
  let(:subject) { klass.new(foo: 'bar', name: 'lala', per_page: 20, status: 'four') }
120
125
 
121
126
  it 'returns full param definitions with populated value' do
122
- regexp = /\w+@\w+\.\w+/.to_s
127
+ regexp = /\w+@\w+\.\w+/
123
128
 
124
- subject.schema[:name][:label].should == 'User name'
125
- subject.schema[:name][:value].should == 'lala'
129
+ subject.schema[:name].label.should == 'User name'
130
+ subject.schema[:name].value.should == 'lala'
126
131
 
127
- subject.schema[:page][:label].should == 'page number'
128
- subject.schema[:page][:value].should == 1
132
+ subject.schema[:page].label.should == 'page number'
133
+ subject.schema[:page].value.should == 1
129
134
 
130
- subject.schema[:per_page][:label].should == 'items per page'
131
- subject.schema[:per_page][:value].should == 20
135
+ subject.schema[:per_page].label.should == 'items per page'
136
+ subject.schema[:per_page].value.should == 20
132
137
 
133
- subject.schema[:status][:label].should == 'status'
134
- subject.schema[:status][:value].should == ''
135
- subject.schema[:status][:options].should == ['one', 'two', 'three']
136
- subject.schema[:status][:multiple].should be_true
138
+ subject.schema[:status].label.should == 'status'
139
+ subject.schema[:status].value.should == ''
140
+ subject.schema[:status].options.should == ['one', 'two', 'three']
141
+ subject.schema[:status].multiple.should be_true
137
142
 
138
- subject.schema[:piped_status][:label].should == 'status with pipes'
139
- subject.schema[:piped_status][:value].should == ''
140
- subject.schema[:piped_status][:multiple].should be_true
143
+ subject.schema[:piped_status].label.should == 'status with pipes'
144
+ subject.schema[:piped_status].value.should == ''
145
+ subject.schema[:piped_status].multiple.should be_true
141
146
 
142
- subject.schema[:country][:label].should == 'country'
143
- subject.schema[:country][:value].should == ''
144
- subject.schema[:country][:options].should == ['UK', 'CL', 'JPN']
147
+ subject.schema[:country].label.should == 'country'
148
+ subject.schema[:country].value.should == ''
149
+ subject.schema[:country].options.should == ['UK', 'CL', 'JPN']
145
150
 
146
- subject.schema[:email][:label].should == 'email'
147
- subject.schema[:email][:value].should == ''
148
- subject.schema[:email][:match].should == regexp
151
+ subject.schema[:email].label.should == 'email'
152
+ subject.schema[:email].value.should == ''
153
+ subject.schema[:email].match.should == regexp
149
154
 
150
- subject.schema[:emails][:label].should == 'emails'
151
- subject.schema[:emails][:value].should == 'default@email.com'
152
- subject.schema[:emails][:multiple].should be_true
153
- subject.schema[:emails][:match].should == regexp
155
+ subject.schema[:emails].label.should == 'emails'
156
+ subject.schema[:emails].value.should == 'default@email.com'
157
+ subject.schema[:emails].multiple.should be_true
158
+ subject.schema[:emails].match.should == regexp
154
159
  end
155
160
  end
156
161
  end
157
162
 
158
163
  describe Parametric::Hash do
159
164
  let(:klass) do
160
- Class.new do
161
- include Parametric::Hash
165
+ Class.new(Parametric::Hash) do
162
166
  param :name, 'User name'
163
167
  param :page, 'page number', default: 1
164
168
  param :per_page, 'items per page', default: 50
@@ -185,8 +189,8 @@ describe Parametric do
185
189
  end
186
190
 
187
191
  it 'has #schema' do
188
- subject.schema[:name][:label].should == 'User name'
189
- subject.schema[:name][:value].should == 'Ismael'
192
+ subject.schema[:name].label.should == 'User name'
193
+ subject.schema[:name].value.should == 'Ismael'
190
194
  end
191
195
  end
192
196
  end
metadata CHANGED
@@ -1,65 +1,55 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: parametric
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Ismael Celis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-18 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
11
+
12
+ date: 2014-04-03 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
14
15
  name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '1.5'
20
- type: :development
21
16
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
24
19
  - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '1.5'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
20
+ - !ruby/object:Gem::Version
21
+ version: "1.5"
34
22
  type: :development
23
+ version_requirements: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ name: rake
35
26
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
27
+ requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - &id003
30
+ - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: "0"
48
33
  type: :development
34
+ version_requirements: *id002
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec
49
37
  prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- description: Useful for modelling search or form objects, white-listed query parameters
56
- and safe parameter defaults.
57
- email:
38
+ requirement: &id004 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - *id003
41
+ type: :development
42
+ version_requirements: *id004
43
+ description: Useful for modelling search or form objects, white-listed query parameters and safe parameter defaults.
44
+ email:
58
45
  - ismaelct@gmail.com
59
46
  executables: []
47
+
60
48
  extensions: []
49
+
61
50
  extra_rdoc_files: []
62
- files:
51
+
52
+ files:
63
53
  - .gitignore
64
54
  - .rspec
65
55
  - .travis.yml
@@ -74,33 +64,34 @@ files:
74
64
  - lib/parametric/utils.rb
75
65
  - lib/parametric/version.rb
76
66
  - parametric.gemspec
67
+ - spec/nested_params_spec.rb
77
68
  - spec/parametric_spec.rb
78
69
  - spec/spec_helper.rb
79
- homepage: ''
80
- licenses:
70
+ homepage: ""
71
+ licenses:
81
72
  - MIT
82
73
  metadata: {}
74
+
83
75
  post_install_message:
84
76
  rdoc_options: []
85
- require_paths:
77
+
78
+ require_paths:
86
79
  - lib
87
- required_ruby_version: !ruby/object:Gem::Requirement
88
- requirements:
89
- - - '>='
90
- - !ruby/object:Gem::Version
91
- version: '0'
92
- required_rubygems_version: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - *id003
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - *id003
97
86
  requirements: []
87
+
98
88
  rubyforge_project:
99
- rubygems_version: 2.0.3
89
+ rubygems_version: 2.0.5
100
90
  signing_key:
101
91
  specification_version: 4
102
- summary: DSL for declaring allowed parameters with options, regexp patern and default
103
- values.
104
- test_files:
92
+ summary: DSL for declaring allowed parameters with options, regexp patern and default values.
93
+ test_files:
94
+ - spec/nested_params_spec.rb
105
95
  - spec/parametric_spec.rb
106
96
  - spec/spec_helper.rb
97
+ has_rdoc: