hash_mapper 0.1.3 → 0.2.0

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: 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