hash_mapper 0.1.3 → 0.2.0

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
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3fcd7f8475d938cf6002450682f5e4bf17865074
4
- data.tar.gz: a16e082eb53d60cf26fc99c67cbecb31c04787b0
3
+ metadata.gz: 4ccb1b38f4a738cf5b7f1a147cc998463f14246e
4
+ data.tar.gz: bb40000c4e4f03cc7cda222bea3f9182189e7faf
5
5
  SHA512:
6
- metadata.gz: 1075ad77863f0b6ec01b6178a1257d5bb676c556dfe02183dfa5bb3ec67e90548871e58943b3bb6e6e5fedf87a77172793e089bb8c80ee9adbcc12f09007358e
7
- data.tar.gz: ce2cdf149dd160c82ad29e441fa17f4eacde912b36fe31ac93f3e3edd74b74776747d94a83b5bdecef5ce5aef380c53e4a001f31e1117147d3e55723843ae4af
6
+ metadata.gz: 71dc27f23fae5c544caa5389fd7a31c1ae0bd04cfa84b007dfc18197f4dbee1349cbd7d677d59e8420505dcd2fa4c981f4c792429580fe05b656f9fad2046dc5
7
+ data.tar.gz: 68946b78bc3dc7dd2d0b7d287649125b63bb0ffb5f357fddac4cbd48fd1c944b1b7f3880813d0cce8d73b05605e49c8e19e47cec72acb6c9513a8cdf2b5ee596
data/README.md CHANGED
@@ -114,6 +114,26 @@ You guessed it. That means that you can actually pass custom blocks to each to()
114
114
  map from('/one'), to('/one'){|value| value.to_i}
115
115
  ```
116
116
 
117
+ #### Default values
118
+
119
+ You want to make sure that a value is present in the output (even if it's not in the input) so that:
120
+
121
+ ```ruby
122
+ {'one' => '1'}
123
+ ```
124
+
125
+ gets translated to
126
+
127
+ ```ruby
128
+ {:one => 1, :two => 2}
129
+ ```
130
+
131
+ Do this:
132
+
133
+ ```ruby
134
+ map from('/two'), to('/two'), default: 2
135
+ ```
136
+
117
137
  #### Custom value filtering
118
138
 
119
139
  You want to pass the final value of a key through a custom filter:
@@ -204,7 +224,7 @@ class ProjectMapper
204
224
  extend HashMapper
205
225
  map from('/project'), to('/project_name')
206
226
  map from('/url'), to('/url')
207
- map from('/author_names'), to('/author'), using(UserMapper)
227
+ map from('/author_names'), to('/author'), using: UserMapper
208
228
  end
209
229
  ```
210
230
 
@@ -231,7 +251,7 @@ end
231
251
  But HashMapper's nested mappers will actually do that for you if a value is an array, so:
232
252
 
233
253
  ```ruby
234
- map from('/employees'), to('employees'), using(UserMapper)
254
+ map from('/employees'), to('employees'), using: UserMapper
235
255
  ```
236
256
  ... Will map each employee using UserMapper.
237
257
 
data/lib/hash_mapper.rb CHANGED
@@ -47,9 +47,9 @@ module HashMapper
47
47
  end
48
48
  end
49
49
 
50
- def map(from, to, using=nil, &filter)
50
+ def map(from, to, options={}, &filter)
51
51
  self.maps = self.maps.dup
52
- self.maps << Map.new(from, to, using)
52
+ self.maps << Map.new(from, to, options)
53
53
  to.filter = filter if block_given? # Useful if just one block given
54
54
  end
55
55
 
@@ -62,7 +62,8 @@ module HashMapper
62
62
  alias :to :from
63
63
 
64
64
  def using(mapper_class)
65
- mapper_class
65
+ warn "[DEPRECATION] `using` is deprecated, instead of `using(#{mapper_class.name})` you should specify `{ using: #{mapper_class.name} }`"
66
+ { using: mapper_class }
66
67
  end
67
68
 
68
69
  def normalize(a_hash)
@@ -113,16 +114,19 @@ module HashMapper
113
114
  #
114
115
  class Map
115
116
 
116
- attr_reader :path_from, :path_to, :delegated_mapper
117
+ attr_reader :path_from, :path_to, :delegated_mapper, :default_value
117
118
 
118
- def initialize(path_from, path_to, delegated_mapper = nil)
119
- @path_from, @path_to, @delegated_mapper = path_from, path_to, delegated_mapper
119
+ def initialize(path_from, path_to, options = {})
120
+ @path_from = path_from
121
+ @path_to = path_to
122
+ @delegated_mapper = options.fetch(:using, nil)
123
+ @default_value = options.fetch(:default, :hash_mapper_no_default)
120
124
  end
121
125
 
122
126
  def process_into(output, input, meth = :normalize)
123
127
  path_1, path_2 = (meth == :normalize ? [path_from, path_to] : [path_to, path_from])
124
128
  value = get_value_from_input(output, input, path_1, meth)
125
- add_value_to_hash!(output, path_2, value) unless value == :hash_mapper_no_value
129
+ set_value_in_output(output, path_2, value)
126
130
  end
127
131
  protected
128
132
 
@@ -139,6 +143,16 @@ module HashMapper
139
143
  delegated_mapper ? delegate_to_nested_mapper(value, meth) : value
140
144
  end
141
145
 
146
+ def set_value_in_output(output, path, value)
147
+ if value == :hash_mapper_no_value
148
+ if default_value == :hash_mapper_no_default
149
+ return
150
+ else
151
+ value = default_value
152
+ end
153
+ end
154
+ add_value_to_hash!(output, path, value)
155
+ end
142
156
 
143
157
  def delegate_to_nested_mapper(value, meth)
144
158
  case value
@@ -1,3 +1,3 @@
1
1
  module HashMapper
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -426,3 +426,24 @@ describe "dealing with strings and symbols" do
426
426
 
427
427
  end
428
428
 
429
+ class DefaultValues
430
+ extend HashMapper
431
+
432
+ map from('/without_default'), to('not_defaulted')
433
+ map from('/with_default'), to('defaulted'), default: 'the_default_value'
434
+ end
435
+
436
+ describe "default values" do
437
+ it "should use a default value whenever a key is not set" do
438
+ DefaultValues.normalize(
439
+ 'without_default' => 'some_value'
440
+ ).should == { not_defaulted: 'some_value', defaulted: 'the_default_value' }
441
+ end
442
+
443
+ it "should not use a default if a key is set (even if the value is falsy)" do
444
+ DefaultValues.normalize({
445
+ 'without_default' => 'some_value',
446
+ 'with_default' => false
447
+ }).should == { not_defaulted: 'some_value', defaulted: false }
448
+ end
449
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash_mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ismael Celis