foraneus 0.0.11 → 0.0.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12e7ca9e67520a6b1241639c29cb3490d0143ffe
4
- data.tar.gz: 20883eadd4038c4867375eac5f53fd59d39e83b7
3
+ metadata.gz: 5dd151153010e57f4108ce2e054238b10b2d0b46
4
+ data.tar.gz: b582478fbb77f95ef5f924b1e7ae2b5bb492c15b
5
5
  SHA512:
6
- metadata.gz: 36edfb9dec61a50be5dec519f106b8043658c3da5a087e77b9daacccb205946edc4f6f8d14e79d976c7bb6e55d195a0d928967de115d03039566b0cbd38570c9
7
- data.tar.gz: 252773ebedc620864d9aaa10181b734f58100bbc3190ea95ca78be7ff531b07edf7cc6582f793062f7577fe374c8e00ee7dbc080ba0e4d30534489c3fed39639
6
+ metadata.gz: 6a0c78292a5a51eb6d59dbb6000bed04e4669b95e0b3a78b09e84a9d4c302db1a426930a141166291cab1d2b34279a5837625932655f29270e25b7c82abef74f
7
+ data.tar.gz: c9385cc3522459024a4d68f148dbb08200411099b3d809e85f54d4c51d4ab99bc8a2965466f278b960d093d15e9d0fe929bd687dffd75e5c4e0f24d7a2a1135d
data/README.md CHANGED
@@ -142,6 +142,73 @@ message is added to the error's `message` attribute.
142
142
  Data coming from the inside is assumed to be valid, so `.raw` won't return an instance having
143
143
  errors neither being invalid.
144
144
 
145
+ ## Required fields
146
+
147
+ Fields can be declared as required.
148
+
149
+ ``` ruby
150
+ class MyForm < Foraneus
151
+ integer :delay, :required => true
152
+ end
153
+ ```
154
+
155
+ If an external value is not fed into a required field, an error with key 'KeyError' will be assigned.
156
+
157
+ ``` ruby
158
+ form = MyForm.parse
159
+
160
+ form.valid? # => false
161
+
162
+ form[:errors][:delay].key # => 'KeyError'
163
+ form[:errors][:delay].message # => 'required parameter not found: "delay"'
164
+ ```
165
+
166
+ ## Blank values
167
+
168
+ By default, any blank value is treated as nil.
169
+
170
+ ``` ruby
171
+ MyForm = Class.new(Foraneus) { string :name }
172
+
173
+ MyForm.parse(:name => '').name
174
+ # => nil
175
+ ```
176
+
177
+ This behaviour can be modified by setting opt `blanks_as_nil` to false.
178
+
179
+ ``` ruby
180
+ MyForm = Class.new(Foraneus) { string :name, :blanks_as_nil => false }
181
+
182
+ MyForm.parse(:name => '').name
183
+ # => ''
184
+ ```
185
+
186
+ ## Default values
187
+
188
+ Define fields with default values:
189
+
190
+ ``` ruby
191
+ MyForm = Class.new(Foraneus) { string :name, :default => 'Alice' }
192
+ ```
193
+
194
+ Parse data from the ouside:
195
+
196
+ ``` ruby
197
+ form = MyForm.parse
198
+
199
+ form.name # => 'Alice'
200
+ form[:name] # => nil, data from the outside don't include any value
201
+ ```
202
+
203
+ Convert values back from the inside:
204
+
205
+ ``` ruby
206
+ form = MyForm.raw
207
+
208
+ form[:name] # => 'Alice'
209
+ form.name # => nil, data from the inside don't include any value
210
+ ```
211
+
145
212
  ## Installation
146
213
 
147
214
  - Install `foraneus` as a gem.
data/lib/foraneus.rb CHANGED
@@ -25,8 +25,8 @@ class Foraneus
25
25
  # Declares a boolean field.
26
26
  #
27
27
  # @param [Symbol] name The name of the field.
28
- def self.boolean(name)
29
- converter = Foraneus::Converters::Boolean.new
28
+ def self.boolean(name, *args)
29
+ converter = Foraneus::Converters::Boolean.new(*args)
30
30
  field(name, converter)
31
31
  end
32
32
 
@@ -69,16 +69,16 @@ class Foraneus
69
69
  # Declares a noop field.
70
70
  #
71
71
  # @param [Symbol] name The name of the field.
72
- def self.noop(name)
73
- converter = Foraneus::Converters::Noop.new
72
+ def self.noop(name, *args)
73
+ converter = Foraneus::Converters::Noop.new(*args)
74
74
  field(name, converter)
75
75
  end
76
76
 
77
77
  # Declares a string field.
78
78
  #
79
79
  # @param [Symbol] name The name of the field.
80
- def self.string(name)
81
- converter = Foraneus::Converters::String.new
80
+ def self.string(name, *args)
81
+ converter = Foraneus::Converters::String.new(*args)
82
82
  field(name, converter)
83
83
  end
84
84
 
@@ -104,28 +104,28 @@ class Foraneus
104
104
 
105
105
  # Parses data coming from an external source.
106
106
  #
107
- # @param [Hash<Symbol, String>] raw_data
107
+ # @param [Hash<Symbol, String>] data External data.
108
108
  #
109
109
  # @return [Foraneus] An instance of a form.
110
- def self.parse(raw_data = {})
110
+ def self.parse(data = {})
111
111
  instance = self.new
112
112
 
113
113
  parsed_keys = []
114
114
 
115
- @fields.each do |k, _|
116
- given_key = k
117
- v = raw_data.fetch(given_key) do |k|
118
- given_key = k.to_sym
119
- raw_data.fetch(given_key, nil)
115
+ fields.each do |field, converter|
116
+ given_key = field
117
+ v = data.fetch(given_key) do
118
+ given_key = field.to_sym
119
+ data.fetch(given_key, nil)
120
120
  end
121
121
 
122
122
  parsed_keys << given_key
123
- __parse_raw_datum(instance, given_key, v)
123
+ __parse_raw_datum(given_key, v, instance, converter)
124
124
  end
125
125
 
126
- raw_data.each do |k, v|
126
+ data.each do |k, v|
127
127
  unless parsed_keys.include?(k)
128
- __parse_raw_datum(instance, k, v)
128
+ instance[k] = v
129
129
  end
130
130
  end
131
131
 
@@ -140,10 +140,19 @@ class Foraneus
140
140
  def self.raw(data = {})
141
141
  instance = self.new
142
142
 
143
- data.each do |k, v|
144
- next unless fields.has_key?(k.to_s)
145
- instance.send("#{k}=", v)
146
- converter = fields[k.to_s]
143
+ fields.each do |field, converter|
144
+ given_key = field
145
+
146
+ v = data.fetch(given_key) do
147
+ given_key = field.to_sym
148
+ data.fetch(given_key, nil)
149
+ end
150
+
151
+ instance.send("#{field}=", v)
152
+
153
+ if v.nil?
154
+ v = converter.opts[:default]
155
+ end
147
156
 
148
157
  s = if v.nil?
149
158
  nil
@@ -151,8 +160,8 @@ class Foraneus
151
160
  converter.raw(v)
152
161
  end
153
162
 
154
- instance[k] = s
155
- instance.data[k] = v
163
+ instance[given_key] = s
164
+ instance.data[given_key] = v
156
165
  end
157
166
 
158
167
  instance
@@ -190,21 +199,19 @@ class Foraneus
190
199
 
191
200
  # @api private
192
201
  #
193
- # Parses a raw value and assigns it to the corresponding field.
202
+ # Parses a value and assigns it to the corresponding field.
194
203
  #
195
204
  # It also registers errors if the conversion fails.
196
205
  #
197
- # @param [Foraneus] foraneus
198
206
  # @param [String, Symbol] k
199
207
  # @param [String] v
200
- def self.__parse_raw_datum(foraneus, k, v)
208
+ # @param [Foraneus] foraneus
209
+ # @param [Converter] converter
210
+ def self.__parse_raw_datum(k, v, foraneus, converter)
201
211
  field = k.to_s
202
- converter = fields[field]
203
212
 
204
213
  foraneus[k] = v
205
214
 
206
- return unless converter
207
-
208
215
  if v == '' && converter.opts.fetch(:blanks_as_nil, true)
209
216
  v = nil
210
217
  end
@@ -212,7 +219,7 @@ class Foraneus
212
219
  if v.nil? && converter.opts[:required]
213
220
  raise KeyError, "required parameter not found: #{field.inspect}"
214
221
  elsif v.nil?
215
- v = nil
222
+ v = converter.opts[:default]
216
223
  else
217
224
  v = converter.parse(v)
218
225
  end
@@ -101,7 +101,7 @@ describe Foraneus do
101
101
  it { should be_valid }
102
102
  end
103
103
 
104
- context 'when a field is declared as allow blanks = true' do
104
+ context 'when a field is declared as blanks_as_nil = true' do
105
105
  let(:converter) { Foraneus::Converters::String.new(:blanks_as_nil => true) }
106
106
 
107
107
  subject(:form) { form_spec.parse(:delay => '') }
@@ -178,6 +178,38 @@ describe Foraneus do
178
178
  it { should_not be_valid }
179
179
 
180
180
  its(:delay) { should be_nil }
181
+
182
+ its([:delay]) { should be_nil }
183
+ end
184
+ end
185
+
186
+ context 'when default value' do
187
+ let(:converter) { Foraneus::Converters::Integer.new(:default => 1) }
188
+
189
+ subject(:form) { form_spec.parse }
190
+
191
+ it { should be_valid }
192
+
193
+ its(:delay) { should eq(1) }
194
+
195
+ its(:data) { should include(:delay => 1) }
196
+
197
+ its([:delay]) { should be_nil}
198
+
199
+ its([]) { should include(:delay => nil) }
200
+
201
+ its([:errors]) { should_not include(:delay) }
202
+
203
+ context 'when missing required field' do
204
+ let(:converter) { Foraneus::Converters::Integer.new(:default => 1, :required => true) }
205
+
206
+ subject(:form) { form_spec.parse }
207
+
208
+ it { should_not be_valid }
209
+
210
+ its(:delay) { should be_nil }
211
+
212
+ its([:delay]) { should be_nil }
181
213
  end
182
214
  end
183
215
  end
@@ -220,5 +252,17 @@ describe Foraneus do
220
252
 
221
253
  its([]) { should include('delay' => nil) }
222
254
  end
255
+
256
+ context 'when default value' do
257
+ let(:converter) { Foraneus::Converters::Integer.new(:default => 1) }
258
+
259
+ subject(:form) { form_spec.raw }
260
+
261
+ its(:delay) { should be_nil }
262
+
263
+ its([:delay]) { should eq('1') }
264
+
265
+ its([]) { should include(:delay => '1') }
266
+ end
223
267
  end
224
268
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foraneus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gianfranco Zas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-30 00:00:00.000000000 Z
11
+ date: 2014-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec