hash_map 0.4.0 → 0.5.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: 8087bb03fb5521f63c3fc63689b7047610996f04
4
- data.tar.gz: 139b3dbac032b2799a5bc825c0473a1c6f2b6954
3
+ metadata.gz: 6bae76ad044288eb46403cd3ea870146d210bc91
4
+ data.tar.gz: 268a72ffcdc09a0e79a1c7bce05adbeb7f3b3ee2
5
5
  SHA512:
6
- metadata.gz: 4a1713d1a9e4c18474b7f86626b0c8c51a0b12c92619ac4bc1fbae3e75403cc0780de1732c473f230aed2799e9ed70f09f27ee39d0274822c404beb54b28bc39
7
- data.tar.gz: 50292c55159b07a14421df7dfc4720d447f4b2e25b16e5d4b847195ebb32dd9f9da75a244966cbdb6124974245224d3d3578223a76695ad9b931485c31f847cf
6
+ metadata.gz: 6b938e9d58a66274c45b34769ed5de353189b62c0d4b59ade8a6307057c7accadc4b2b64cd0429186c36e133c322c852ab401fc31d58dc5bfc6797c1989ccfe6
7
+ data.tar.gz: 4dc6a6f3ab70adbb9e31592614f5dee586d9911f7e99a9df8e8311c2aeaf2041ffb99a48f2f8219fb07d473beaac4701c5e9eee1ced7de66b23860b584a6a544
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2016-04-26 22:01:05 +0200 using RuboCop version 0.37.2.
3
+ # on 2016-09-13 00:25:45 +0200 using RuboCop version 0.40.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -8,19 +8,28 @@
8
8
 
9
9
  # Offense count: 4
10
10
  # Cop supports --auto-correct.
11
- # Configuration parameters: IgnoreEmptyBlocks.
11
+ # Configuration parameters: AllowUnusedKeywordArguments.
12
12
  Lint/UnusedBlockArgument:
13
13
  Exclude:
14
14
  - 'spec/examples/blocks_spec.rb'
15
15
  - 'spec/hash_map/dsl_spec.rb'
16
16
  - 'spec/hash_map/mapper_spec.rb'
17
17
 
18
- # Offense count: 28
18
+ # Offense count: 1
19
+ Metrics/AbcSize:
20
+ Max: 17
21
+
22
+ # Offense count: 37
19
23
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
20
24
  # URISchemes: http, https
21
25
  Metrics/LineLength:
22
26
  Max: 238
23
27
 
28
+ # Offense count: 1
29
+ # Configuration parameters: CountComments.
30
+ Metrics/MethodLength:
31
+ Max: 12
32
+
24
33
  # Offense count: 1
25
34
  # Configuration parameters: CountComments.
26
35
  Metrics/ModuleLength:
@@ -41,7 +50,15 @@ Style/Alias:
41
50
  Exclude:
42
51
  - 'lib/hash_map/base.rb'
43
52
 
44
- # Offense count: 8
53
+ # Offense count: 1
54
+ # Cop supports --auto-correct.
55
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
56
+ # SupportedStyles: braces, no_braces, context_dependent
57
+ Style/BracesAroundHashParameters:
58
+ Exclude:
59
+ - 'lib/hash_map/matchers.rb'
60
+
61
+ # Offense count: 10
45
62
  Style/Documentation:
46
63
  Exclude:
47
64
  - 'spec/**/*'
@@ -53,6 +70,7 @@ Style/Documentation:
53
70
  - 'lib/hash_map/dsl.rb'
54
71
  - 'lib/hash_map/json_adapter.rb'
55
72
  - 'lib/hash_map/mapper.rb'
73
+ - 'lib/hash_map/matchers.rb'
56
74
 
57
75
  # Offense count: 1
58
76
  # Cop supports --auto-correct.
@@ -94,13 +112,6 @@ Style/MutableConstant:
94
112
  Style/NumericLiterals:
95
113
  MinDigits: 6
96
114
 
97
- # Offense count: 2
98
- # Cop supports --auto-correct.
99
- # Configuration parameters: PreferredDelimiters.
100
- Style/PercentLiteralDelimiters:
101
- Exclude:
102
- - 'hash_map.gemspec'
103
-
104
115
  # Offense count: 3
105
116
  # Cop supports --auto-correct.
106
117
  # Configuration parameters: EnforcedStyle, SupportedStyles.
@@ -110,7 +121,7 @@ Style/SignalException:
110
121
  - 'lib/hash_map/dsl.rb'
111
122
  - 'lib/hash_map/json_adapter.rb'
112
123
 
113
- # Offense count: 4
124
+ # Offense count: 5
114
125
  # Cop supports --auto-correct.
115
126
  # Configuration parameters: EnforcedStyle, SupportedStyles.
116
127
  # SupportedStyles: space, no_space
@@ -138,28 +149,20 @@ Style/SpaceInsideBrackets:
138
149
  Exclude:
139
150
  - 'spec/examples/collections_spec.rb'
140
151
 
141
- # Offense count: 3
152
+ # Offense count: 4
142
153
  # Cop supports --auto-correct.
143
154
  # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SupportedStyles.
144
155
  # SupportedStyles: space, no_space
145
156
  Style/SpaceInsideHashLiteralBraces:
146
157
  Enabled: false
147
158
 
148
- # Offense count: 21
159
+ # Offense count: 35
149
160
  # Cop supports --auto-correct.
150
161
  # Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline.
151
162
  # SupportedStyles: single_quotes, double_quotes
152
163
  Style/StringLiterals:
153
164
  Enabled: false
154
165
 
155
- # Offense count: 1
156
- # Cop supports --auto-correct.
157
- # Configuration parameters: EnforcedStyle, SupportedStyles.
158
- # SupportedStyles: final_newline, final_blank_line
159
- Style/TrailingBlankLines:
160
- Exclude:
161
- - 'lib/hash_map.rb'
162
-
163
166
  # Offense count: 3
164
167
  # Cop supports --auto-correct.
165
168
  # Configuration parameters: EnforcedStyleForMultiline, SupportedStyles.
@@ -169,9 +172,3 @@ Style/TrailingCommaInLiteral:
169
172
  - 'spec/examples/defaults_spec.rb'
170
173
  - 'spec/hash_map/dsl_spec.rb'
171
174
  - 'spec/hash_map/mapper_spec.rb'
172
-
173
- # Offense count: 2
174
- # Cop supports --auto-correct.
175
- Style/UnneededPercentQ:
176
- Exclude:
177
- - 'hash_map.gemspec'
data/README.md CHANGED
@@ -362,6 +362,48 @@ hash.hash_map_with(UserMapper)
362
362
  # => {"name"=>"John", "surname"=>"Doe"}
363
363
  ```
364
364
 
365
+ ### Testing
366
+
367
+ #### RSpec
368
+
369
+ __hash_mapped__
370
+
371
+ ```ruby
372
+ it do
373
+ output = { name: :hello }
374
+ expect(output).to hash_mapped(:name)
375
+ end
376
+ ```
377
+
378
+ `from`
379
+ ```ruby
380
+ it do
381
+ original = { first_name: :hello }
382
+ output = { name: :hello }
383
+ expect(output).to hash_mapped(:name).from(original, :first_name)
384
+ end
385
+
386
+ it do
387
+ original = { user: { first_name: :hello } }
388
+ output = { name: :hello }
389
+ expect(output).to hash_mapped(:name).from(original, :user, :first_name)
390
+ end
391
+
392
+ it do
393
+ original = { user: { first_name: :hello } }
394
+ output = { user: { name: :hello } }
395
+ expect(output).to hash_mapped(:user, :name).from(original, :user, :first_name)
396
+ end
397
+ ```
398
+
399
+ `and_eq`
400
+
401
+ ```ruby
402
+ it do
403
+ output = { user: { name: :hello } }
404
+ expect(output).to hash_mapped(:user, :name).and_eq(:hello)
405
+ end
406
+ ```
365
407
 
366
408
  ### Motivation
367
409
  I got bored of doing this:
@@ -33,23 +33,13 @@ module HashMap
33
33
  private
34
34
 
35
35
  def _transforms_output(output)
36
- if middlewares = self.class.dsl.instance_variable_get(:@transform_output)
37
- middlewares.inject(output) do |out, proccess|
38
- proccess.call(out)
39
- end
40
- else
41
- output
42
- end
36
+ middlewares = self.class.dsl.instance_variable_get(:@transform_output)
37
+ run_middlewares(middlewares, output)
43
38
  end
44
39
 
45
40
  def _transforms_input(input)
46
- if middlewares = self.class.dsl.instance_variable_get(:@transform_input)
47
- middlewares.inject(input) do |out, proccess|
48
- proccess.call(out)
49
- end
50
- else
51
- input
52
- end
41
+ middlewares = self.class.dsl.instance_variable_get(:@transform_input)
42
+ run_middlewares(middlewares, input)
53
43
  end
54
44
 
55
45
  def prepare_input(input)
@@ -60,5 +50,15 @@ module HashMap
60
50
  input
61
51
  end
62
52
  end
53
+
54
+ def run_middlewares(middlewares, input)
55
+ if middlewares
56
+ middlewares.inject(input) do |out, proccess|
57
+ proccess.call(out)
58
+ end
59
+ else
60
+ input
61
+ end
62
+ end
63
63
  end
64
64
  end
@@ -28,7 +28,7 @@ module HashMap
28
28
  nil_to_default(value, struct)
29
29
  end
30
30
 
31
- def after_each_middleware(value, key)
31
+ def after_each_middleware(value, _key)
32
32
  after_each_callbacks.inject(value) do |output, middle|
33
33
  middle.call(output)
34
34
  end
@@ -57,11 +57,11 @@ module HashMap
57
57
  def execute_block(struct)
58
58
  block = struct[:proc]
59
59
  value = if struct[:from_child]
60
- nested = get_value_from_key(struct, :from_child)
61
- hash_map.instance_exec nested, original, &block
62
- else
63
- hash_map.instance_exec original, original, &block
64
- end
60
+ nested = get_value_from_key(struct, :from_child)
61
+ hash_map.instance_exec nested, original, &block
62
+ else
63
+ hash_map.instance_exec original, original, &block
64
+ end
65
65
  after_each_middleware(value, struct[:key].last)
66
66
  end
67
67
 
@@ -0,0 +1,129 @@
1
+ module HashMap
2
+ module Matchers
3
+ def hash_mapped(*original)
4
+ HashMappedMatcher.new(original)
5
+ end
6
+
7
+ class HashMappedMatcher
8
+ attr_reader :key, :mapped_hash, :original_hash, :from_key, :mapped_has_key,
9
+ :description_messages, :failure_messages, :expected, :expected_provided
10
+
11
+ def initialize(key)
12
+ @key = key
13
+ @error = []
14
+ @description_messages = []
15
+ @failure_messages = []
16
+ end
17
+
18
+ def matches?(hash)
19
+ @mapped_hash = hash
20
+ _has_key && _from && equality
21
+ end
22
+
23
+ def description
24
+ description_messages.join(', ')
25
+ end
26
+
27
+ def failure_message
28
+ failure_messages.join(', ')
29
+ end
30
+
31
+ def from(original_hash, *from_key)
32
+ @original_hash = original_hash
33
+ @from_key = from_key
34
+ self
35
+ end
36
+
37
+ def and_eq(expected)
38
+ @expected_provided = true
39
+ @expected = expected
40
+ self
41
+ end
42
+
43
+ private
44
+
45
+ def mapped_has_key?
46
+ mapped_results[:has_key]
47
+ end
48
+
49
+ def mapped_value
50
+ mapped_results[:value]
51
+ end
52
+
53
+ def original_has_key?
54
+ original_results[:has_key]
55
+ end
56
+
57
+ def original_value
58
+ original_results[:value]
59
+ end
60
+
61
+ def mapped_results
62
+ @mapped_results ||= _nested_keys(mapped_hash, key)
63
+ end
64
+
65
+ def original_results
66
+ @original_results ||= _nested_keys(original_hash, from_key)
67
+ end
68
+
69
+ def _has_key
70
+ if mapped_has_key?
71
+ description_messages << "have key #{key_to_message} after been mapped"
72
+ else
73
+ failure_messages << "has no key #{key_to_message} after been mapped"
74
+ false
75
+ end
76
+ end
77
+
78
+ def _from
79
+ return true unless original_hash
80
+ if original_has_key?
81
+ if original_value == mapped_value
82
+ description_messages << "#{key_to_message} and original #{from_key_to_message} are the same"
83
+ else
84
+ failure_messages << "#{key_to_message} and original #{from_key_to_message} are NOT the same"
85
+ false
86
+ end
87
+ else
88
+ failure_messages << "original has no key: #{from_key_to_message}"
89
+ false
90
+ end
91
+ end
92
+
93
+ def from_key_to_message
94
+ keys_to_message from_key
95
+ end
96
+
97
+ def key_to_message
98
+ keys_to_message key
99
+ end
100
+
101
+ def keys_to_message(keys)
102
+ children = keys.map { |k| key_representation(k) }.join(' -> ')
103
+ "`#{children}`"
104
+ end
105
+
106
+ def key_representation(k)
107
+ k.is_a?(Symbol) ? ":#{k}" : "'#{k}'"
108
+ end
109
+
110
+ def equality
111
+ return true unless expected_provided
112
+ if mapped_value == expected
113
+ description_messages << "and eq `#{expected}`"
114
+ else
115
+ failure_messages << "key #{key_to_message} expected to eq `#{expected}`"
116
+ false
117
+ end
118
+ end
119
+
120
+ def _nested_keys(hash, keys)
121
+ keys.inject({ value: hash, has_key: true }) do |out, key|
122
+ return { value: nil, has_key: false } unless out[:value]
123
+ return { value: nil, has_key: false } unless out[:has_key]
124
+ { value: out[:value][key], has_key: out[:value].key?(key) }
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -1,3 +1,3 @@
1
1
  module HashMap
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash_map
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
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: 2016-06-08 00:00:00.000000000 Z
11
+ date: 2016-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,7 @@ files:
94
94
  - lib/hash_map/dsl.rb
95
95
  - lib/hash_map/json_adapter.rb
96
96
  - lib/hash_map/mapper.rb
97
+ - lib/hash_map/matchers.rb
97
98
  - lib/hash_map/plugins.rb
98
99
  - lib/hash_map/version.rb
99
100
  homepage: https://github.com/arturictus/hash_map
@@ -116,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
117
  version: '0'
117
118
  requirements: []
118
119
  rubyforge_project:
119
- rubygems_version: 2.6.3
120
+ rubygems_version: 2.2.3
120
121
  signing_key:
121
122
  specification_version: 4
122
123
  summary: Library to map easily hashes.