lazy_mapper 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/lazy_mapper.gemspec +1 -1
- data/lib/lazy_mapper.rb +28 -17
- data/spec/lazy_mapper_spec.rb +19 -12
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 702528c73dfd2a707526f0e792472df55077dd97bf4cf034f6187b97f885ff41
|
4
|
+
data.tar.gz: c2b4708374ca625b5e81a6645cf279854241721705bfafdfee3f258f27f2ab8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0540ab08d1cdcaac33e99876987df7d64ed6f4a31c4bac7f03581cf2d7ec64ee45ac35c9692614c6b78b8ca85952803fc5eab7f61818f790f784490b7c804271
|
7
|
+
data.tar.gz: e22803584b494a25427b059fa32ae059091ab614b72ef2293581dd81486a05b6193372f32b4b576262f7b8f876c74d9b41e1660cce43355472fcf5f1fbcbce31
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.6.1
|
data/lazy_mapper.gemspec
CHANGED
data/lib/lazy_mapper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bigdecimal'
|
2
4
|
require 'bigdecimal/util'
|
3
5
|
require 'time'
|
@@ -53,7 +55,7 @@ class LazyMapper
|
|
53
55
|
Integer => 0,
|
54
56
|
Numeric => 0,
|
55
57
|
Float => 0.0,
|
56
|
-
BigDecimal => BigDecimal
|
58
|
+
BigDecimal => BigDecimal(0),
|
57
59
|
Array => []
|
58
60
|
}.freeze
|
59
61
|
|
@@ -154,6 +156,7 @@ class LazyMapper
|
|
154
156
|
def self.from unmapped_data, mappers: {}
|
155
157
|
return nil if unmapped_data.nil?
|
156
158
|
fail TypeError, "#{ unmapped_data.inspect } is not a Hash" unless unmapped_data.respond_to? :to_h
|
159
|
+
|
157
160
|
instance = new
|
158
161
|
instance.send :unmapped_data=, unmapped_data.to_h
|
159
162
|
instance.send :mappers=, mappers
|
@@ -162,7 +165,7 @@ class LazyMapper
|
|
162
165
|
|
163
166
|
def self.from_json *args, &block # :nodoc:
|
164
167
|
warn "#{ self }.from_json is deprecated. Use #{ self }.from instead."
|
165
|
-
from
|
168
|
+
from(*args, &block)
|
166
169
|
end
|
167
170
|
|
168
171
|
#
|
@@ -304,27 +307,28 @@ class LazyMapper
|
|
304
307
|
end
|
305
308
|
|
306
309
|
def to_h
|
307
|
-
attributes.each_with_object({}) {|(key, _value), h|
|
310
|
+
attributes.each_with_object({}) { |(key, _value), h|
|
308
311
|
h[key] = self.send key
|
309
312
|
}
|
310
313
|
end
|
311
314
|
|
312
315
|
def inspect
|
313
316
|
@__under_inspection__ ||= 0
|
314
|
-
return "<#{ self.class.name } ... >" if @__under_inspection__
|
317
|
+
return "<#{ self.class.name } ... >" if @__under_inspection__.positive?
|
318
|
+
|
315
319
|
@__under_inspection__ += 1
|
316
320
|
present_attributes = attributes.keys.each_with_object({}) { |name, memo|
|
317
|
-
|
318
|
-
|
321
|
+
ivar = IVAR[name]
|
322
|
+
next unless self.instance_variable_defined? ivar
|
323
|
+
|
324
|
+
memo[name] = self.instance_variable_get ivar
|
319
325
|
}
|
320
|
-
|
326
|
+
|
321
327
|
res = "<#{ self.class.name } #{ present_attributes.map { |k, v| k.to_s + ': ' + v.inspect }.join(', ') } >"
|
322
328
|
@__under_inspection__ -= 1
|
323
329
|
res
|
324
330
|
end
|
325
331
|
|
326
|
-
protected
|
327
|
-
|
328
332
|
#
|
329
333
|
# Defines how to map an attribute name
|
330
334
|
# to the corresponding name in the unmapped
|
@@ -358,19 +362,25 @@ class LazyMapper
|
|
358
362
|
end
|
359
363
|
|
360
364
|
def mapped_value(name, unmapped_value, type, map: mapping_for(name, type), default: default_value(type))
|
361
|
-
if unmapped_value.nil?
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
result = map.arity > 1 ? map.call(unmapped_value, self) : map.call(unmapped_value)
|
367
|
-
result
|
365
|
+
return default.dup if unmapped_value.nil? # Duplicate to prevent accidental sharing between instances
|
366
|
+
|
367
|
+
if map.nil?
|
368
|
+
fail ArgumentError, "missing mapper for #{ name } (#{ type }). "\
|
369
|
+
"Unmapped value: #{ unmapped_value.inspect }"
|
368
370
|
end
|
371
|
+
|
372
|
+
return map.call(unmapped_value, self) if map.arity > 1
|
373
|
+
|
374
|
+
map.call(unmapped_value)
|
369
375
|
end
|
370
376
|
|
371
377
|
def check_type! value, type, allow_nil:
|
372
378
|
permitted_types = allow_nil ? Array(type) + [ NilClass ] : Array(type)
|
373
|
-
|
379
|
+
return if permitted_types.any? value.method(:is_a?)
|
380
|
+
|
381
|
+
fail TypeError.new "#{ self.class.name }: "\
|
382
|
+
"#{ value.inspect } is a #{ value.class } "\
|
383
|
+
"but was supposed to be a #{ humanize_list permitted_types, conjunction: ' or ' }"
|
374
384
|
end
|
375
385
|
|
376
386
|
# [1,2,3] -> "1, 2 and 3"
|
@@ -379,6 +389,7 @@ class LazyMapper
|
|
379
389
|
def humanize_list list, separator: ', ', conjunction: ' and '
|
380
390
|
*all_but_last, last = list
|
381
391
|
return last if all_but_last.empty?
|
392
|
+
|
382
393
|
[ all_but_last.join(separator), last ].join conjunction
|
383
394
|
end
|
384
395
|
|
data/spec/lazy_mapper_spec.rb
CHANGED
@@ -64,6 +64,12 @@ describe LazyMapper do
|
|
64
64
|
expect(mapper).to have_received(:map).exactly(1).times.with('42')
|
65
65
|
end
|
66
66
|
|
67
|
+
it 'only shows already mapped values, when inspected' do
|
68
|
+
stub_const 'MyModel', klass
|
69
|
+
instance.created_at
|
70
|
+
expect(instance.inspect).to eq '<MyModel created_at: #<Date: 2015-07-27 ((2457231j,0s,0n),+0s,2299161j)> >'
|
71
|
+
end
|
72
|
+
|
67
73
|
context 'if the mapped value is nil' do
|
68
74
|
let(:map) { -> x { mapper.map(x); nil } }
|
69
75
|
|
@@ -101,6 +107,7 @@ describe LazyMapper do
|
|
101
107
|
it 'avoids infinit recursion, when inspected' do
|
102
108
|
stub_const('Bar', klass_bar)
|
103
109
|
stub_const('Foo', klass_foo)
|
110
|
+
foo.bar.foo
|
104
111
|
expect(foo.inspect).to eq('<Foo bar: <Bar foo: <Foo ... > > >')
|
105
112
|
end
|
106
113
|
end
|
@@ -163,10 +170,10 @@ describe LazyMapper do
|
|
163
170
|
end
|
164
171
|
|
165
172
|
instance = klass.from({ 'foo' => '123 456', 'bar' => 'abc def' },
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
173
|
+
mappers: {
|
174
|
+
foo: ->(f) { type.new(*f.split(' ').reverse) },
|
175
|
+
type => ->(t) { type.new(*t.split(' ')) }
|
176
|
+
})
|
170
177
|
|
171
178
|
expect(instance.foo).to eq type.new('456', '123')
|
172
179
|
expect(instance.bar).to eq type.new('abc', 'def')
|
@@ -290,15 +297,15 @@ describe LazyMapper do
|
|
290
297
|
|
291
298
|
it 'still includes every attribute when converted to Hash' do
|
292
299
|
expect(instance.to_h).to eq(
|
293
|
-
title:
|
294
|
-
count:
|
295
|
-
rate:
|
296
|
-
tags:
|
297
|
-
widget:
|
298
|
-
things:
|
299
|
-
green?:
|
300
|
+
title: '',
|
301
|
+
count: 0,
|
302
|
+
rate: 0.0,
|
303
|
+
tags: [],
|
304
|
+
widget: nil,
|
305
|
+
things: ['something'],
|
306
|
+
green?: false,
|
300
307
|
flowers?: false,
|
301
|
-
cars:
|
308
|
+
cars: []
|
302
309
|
)
|
303
310
|
end
|
304
311
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lazy_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Lett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -46,6 +46,7 @@ extra_rdoc_files: []
|
|
46
46
|
files:
|
47
47
|
- ".gitignore"
|
48
48
|
- ".rubocop.yml"
|
49
|
+
- ".ruby-version"
|
49
50
|
- Gemfile
|
50
51
|
- LICENCE
|
51
52
|
- README.md
|
@@ -72,8 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
73
|
- !ruby/object:Gem::Version
|
73
74
|
version: '0'
|
74
75
|
requirements: []
|
75
|
-
|
76
|
-
rubygems_version: 2.7.3
|
76
|
+
rubygems_version: 3.0.1
|
77
77
|
signing_key:
|
78
78
|
specification_version: 4
|
79
79
|
summary: A lazy object mapper
|