hash_map 0.6.0 → 0.6.1
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 +5 -5
- data/.travis.yml +6 -0
- data/Gemfile +1 -0
- data/README.md +20 -0
- data/hash_map.gemspec +3 -3
- data/lib/hash_map.rb +25 -0
- data/lib/hash_map/after_each_context.rb +31 -0
- data/lib/hash_map/base.rb +1 -1
- data/lib/hash_map/dsl.rb +9 -4
- data/lib/hash_map/mapper.rb +5 -4
- data/lib/hash_map/matchers.rb +13 -1
- data/lib/hash_map/plugins.rb +14 -2
- data/lib/hash_map/version.rb +1 -1
- metadata +14 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dc971280a4ffad89cb9b4f93132e673eae4412558bb5bde8e3f3748873c67f7f
|
4
|
+
data.tar.gz: '060278780641e8248af95dcd7cacd7d222f7a4bdc2f5b5f522b030c35a0433fa'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44801fbd00a2c195e8583b977f8145d2552df02a361aab725d4677d7e5e4bbdfb551daba17d501fadb5995f354d89a05100d95002c78aa344746b2a05df2da0f
|
7
|
+
data.tar.gz: 3a4850f7da85c482f3d912913367b6c22389496fb11364c788402a00c97dfe6c96429a78fd84fc573bbb555fe0e7ead0666d6228551f03a2ad2f3f91b8a941f0
|
data/.travis.yml
CHANGED
@@ -8,6 +8,8 @@ rvm:
|
|
8
8
|
- 2.1.6
|
9
9
|
- 2.2
|
10
10
|
- 2.3.0
|
11
|
+
- 2.4.4
|
12
|
+
- 2.5.1
|
11
13
|
- ruby-head
|
12
14
|
- jruby-19mode
|
13
15
|
- jruby-9.0.1.0
|
@@ -18,6 +20,10 @@ env:
|
|
18
20
|
- JRUBY_OPTS="--debug"
|
19
21
|
matrix:
|
20
22
|
allow_failures:
|
23
|
+
- rvm: 1.9.3
|
24
|
+
- rvm: 2.0.0
|
25
|
+
- rvm: 2.1
|
26
|
+
- rvm: 2.1.6
|
21
27
|
- rvm: ruby-head
|
22
28
|
- rvm: rbx-3
|
23
29
|
- rvm: jruby-19mode
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -365,6 +365,26 @@ AfterEach.call(booleans)
|
|
365
365
|
#=> {"name"=>true, "age"=>false}
|
366
366
|
```
|
367
367
|
|
368
|
+
### `only_provided_keys`
|
369
|
+
|
370
|
+
```ruby
|
371
|
+
class RegularMapper < HashMap::Base
|
372
|
+
properties :name, :lastname, :phone
|
373
|
+
from_child :address do
|
374
|
+
to_child :address do
|
375
|
+
properties :street, :number
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
class OnlyProvidedKeysMapper < RegularMapper
|
380
|
+
only_provided_keys
|
381
|
+
end
|
382
|
+
|
383
|
+
input = { name: "john", address: {street: "Batu Mejan" }, phone: nil }
|
384
|
+
RegularMapper.call(input) # => {"name"=>"john", "lastname"=>nil, "phone"=>nil, "address"=>{"street"=>"Batu Mejan", "number"=>nil}}
|
385
|
+
OnlyProvidedKeysMapper.call(input) # => {"name"=>"john", phone: nil, "address"=>{"street"=>"Batu Mejan"}}
|
386
|
+
```
|
387
|
+
|
368
388
|
### JSON Adapter
|
369
389
|
```ruby
|
370
390
|
class UserMapper < HashMap::Base
|
data/hash_map.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_development_dependency "bundler"
|
23
|
-
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency "bundler"
|
23
|
+
spec.add_development_dependency "rake"
|
24
24
|
spec.add_development_dependency "rspec"
|
25
|
-
spec.add_dependency "fusu", "~> 0.2"
|
25
|
+
spec.add_dependency "fusu", "~> 0.2.1"
|
26
26
|
end
|
data/lib/hash_map.rb
CHANGED
@@ -4,8 +4,33 @@ module HashMap
|
|
4
4
|
def self.root
|
5
5
|
File.expand_path '../..', __FILE__
|
6
6
|
end
|
7
|
+
|
8
|
+
class KeyNotProvided
|
9
|
+
def to_s
|
10
|
+
'nil'
|
11
|
+
end
|
12
|
+
def to_json
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
def as_json(arg = nil)
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.deep_reject(hash, &block)
|
21
|
+
hash.each_with_object(Fusu::HashWithIndifferentAccess.new) do |(k, v), memo|
|
22
|
+
unless block.call(k, v)
|
23
|
+
if v.is_a?(Hash)
|
24
|
+
memo[k] = deep_reject(v, &block)
|
25
|
+
else
|
26
|
+
memo[k] = v
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
7
31
|
end
|
8
32
|
require 'hash_map/dsl'
|
33
|
+
require 'hash_map/after_each_context'
|
9
34
|
require 'hash_map/mapper'
|
10
35
|
require 'hash_map/base'
|
11
36
|
require 'hash_map/json_adapter'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module HashMap
|
2
|
+
class AfterEachContext
|
3
|
+
attr_reader :original, :struct, :value
|
4
|
+
def initialize(original, struct, value)
|
5
|
+
@original = original
|
6
|
+
@struct = struct
|
7
|
+
@value = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def provided?
|
11
|
+
has_key?
|
12
|
+
end
|
13
|
+
|
14
|
+
def block?
|
15
|
+
!!struct[:proc]
|
16
|
+
end
|
17
|
+
|
18
|
+
def has_key?
|
19
|
+
return true if block?
|
20
|
+
found = true
|
21
|
+
struct[:from].reduce(original) do |prv, nxt|
|
22
|
+
unless prv.respond_to?(:key?) && prv.key?(nxt)
|
23
|
+
found = false
|
24
|
+
break
|
25
|
+
end
|
26
|
+
prv.send(:[], nxt)
|
27
|
+
end
|
28
|
+
found
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/hash_map/base.rb
CHANGED
data/lib/hash_map/dsl.rb
CHANGED
@@ -17,7 +17,7 @@ module HashMap
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def _set_attributes_from_inheritance(attrs)
|
20
|
-
dsl._set_attributes(attrs.
|
20
|
+
dsl._set_attributes(attrs.deep_dup)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -28,23 +28,28 @@ module HashMap
|
|
28
28
|
|
29
29
|
def initialize
|
30
30
|
@attributes = []
|
31
|
+
@after_each = Set.new
|
32
|
+
@transform_output = Set.new
|
33
|
+
@transform_input = Set.new
|
31
34
|
end
|
32
35
|
|
33
36
|
def after_each(*middlewares)
|
34
|
-
@after_each ||= []
|
35
37
|
@after_each += middlewares
|
36
38
|
end
|
37
39
|
|
38
40
|
def transforms_output(*middlewares)
|
39
|
-
@transform_output ||= []
|
40
41
|
@transform_output += middlewares
|
41
42
|
end
|
42
43
|
|
43
44
|
def transforms_input(*middlewares)
|
44
|
-
@transform_input ||= []
|
45
45
|
@transform_input += middlewares
|
46
46
|
end
|
47
47
|
|
48
|
+
def only_provided_keys
|
49
|
+
@transform_output << RemoveUnprovideds
|
50
|
+
@after_each << MarkUnprovided
|
51
|
+
end
|
52
|
+
|
48
53
|
def _set_attributes(attrs)
|
49
54
|
@attributes = attrs
|
50
55
|
end
|
data/lib/hash_map/mapper.rb
CHANGED
@@ -28,9 +28,10 @@ module HashMap
|
|
28
28
|
nil_to_default(value, struct)
|
29
29
|
end
|
30
30
|
|
31
|
-
def after_each_middleware(value,
|
31
|
+
def after_each_middleware(value, struct)
|
32
|
+
contx = AfterEachContext.new(original, struct, value)
|
32
33
|
after_each_callbacks.inject(value) do |output, middle|
|
33
|
-
middle.call(output)
|
34
|
+
middle.call(output, contx)
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
@@ -51,7 +52,7 @@ module HashMap
|
|
51
52
|
break unless output.respond_to?(:[])
|
52
53
|
output.send(:[], k)
|
53
54
|
end
|
54
|
-
after_each_middleware(value, struct
|
55
|
+
after_each_middleware(value, struct)
|
55
56
|
end
|
56
57
|
|
57
58
|
def execute_block(struct)
|
@@ -62,7 +63,7 @@ module HashMap
|
|
62
63
|
else
|
63
64
|
hash_map.instance_exec original, original, &block
|
64
65
|
end
|
65
|
-
after_each_middleware(value, struct
|
66
|
+
after_each_middleware(value, struct)
|
66
67
|
end
|
67
68
|
|
68
69
|
def build_keys(ary, value)
|
data/lib/hash_map/matchers.rb
CHANGED
@@ -40,6 +40,10 @@ module HashMap
|
|
40
40
|
self
|
41
41
|
end
|
42
42
|
|
43
|
+
def failure_message_when_negated
|
44
|
+
"expect to not #{description}"
|
45
|
+
end
|
46
|
+
|
43
47
|
private
|
44
48
|
|
45
49
|
def mapped_has_key?
|
@@ -109,7 +113,7 @@ module HashMap
|
|
109
113
|
|
110
114
|
def equality
|
111
115
|
return true unless expected_provided
|
112
|
-
if mapped_value
|
116
|
+
if matches_equality?(mapped_value, expected)
|
113
117
|
description_messages << "and eq `#{expected}`"
|
114
118
|
else
|
115
119
|
failure_messages << "key #{key_to_message} expected to eq `#{expected}`"
|
@@ -117,6 +121,14 @@ module HashMap
|
|
117
121
|
end
|
118
122
|
end
|
119
123
|
|
124
|
+
def matches_equality?(value, expected)
|
125
|
+
if expected.is_a?(Proc)
|
126
|
+
expected.call(value)
|
127
|
+
else
|
128
|
+
value == expected
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
120
132
|
def _nested_keys(hash, keys)
|
121
133
|
keys.inject({ value: hash, has_key: true }) do |out, key|
|
122
134
|
return { value: nil, has_key: false } unless out[:value]
|
data/lib/hash_map/plugins.rb
CHANGED
@@ -1,14 +1,26 @@
|
|
1
1
|
module HashMap
|
2
|
-
BlankToNil = lambda do |v|
|
2
|
+
BlankToNil = lambda do |v, ctx|
|
3
3
|
Fusu.blank?(v) ? nil : v
|
4
4
|
end
|
5
5
|
|
6
|
-
StringToBoolean = lambda do |v|
|
6
|
+
StringToBoolean = lambda do |v, ctx|
|
7
7
|
return false if v == 'false'
|
8
8
|
return true if v == 'true'
|
9
9
|
v
|
10
10
|
end
|
11
11
|
|
12
|
+
MarkUnprovided = lambda do |v, ctx|
|
13
|
+
if !ctx.provided?
|
14
|
+
KeyNotProvided.new
|
15
|
+
else
|
16
|
+
v
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
RemoveUnprovideds = lambda do |o|
|
21
|
+
HashMap.deep_reject(o){ |k, v| v.is_a?(HashMap::KeyNotProvided) }
|
22
|
+
end
|
23
|
+
|
12
24
|
UnderscoreKeys = lambda do |output|
|
13
25
|
Fusu::Hash.deep_transform_keys(output){ |k| Fusu::String.underscore(k).to_sym }
|
14
26
|
end
|
data/lib/hash_map/version.rb
CHANGED
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hash_map
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artur Pañach
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.2.1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.2.1
|
69
69
|
description: Nice DSL to convert hash structure to different one.
|
70
70
|
email:
|
71
71
|
- arturictus@gmail.com
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- bin/setup
|
89
89
|
- hash_map.gemspec
|
90
90
|
- lib/hash_map.rb
|
91
|
+
- lib/hash_map/after_each_context.rb
|
91
92
|
- lib/hash_map/base.rb
|
92
93
|
- lib/hash_map/dsl.rb
|
93
94
|
- lib/hash_map/json_adapter.rb
|
@@ -115,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
116
|
version: '0'
|
116
117
|
requirements: []
|
117
118
|
rubyforge_project:
|
118
|
-
rubygems_version: 2.
|
119
|
+
rubygems_version: 2.7.6
|
119
120
|
signing_key:
|
120
121
|
specification_version: 4
|
121
122
|
summary: Library to map easily hashes.
|