hashcraft 1.0.0.pre.alpha.6 → 1.0.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
  SHA256:
3
- metadata.gz: c70ff2e1bf5cecc91ae33eba7b1fb5810371ab3f67a4f077e02c0dc8a3b6fac8
4
- data.tar.gz: b116b485b82e3cacc55e7a217d3682a06334a970c105eef95db01f054bf44655
3
+ metadata.gz: 38c94cd212c01aa72103257b3d053e3dd9beeb190641fcb82df4ac1896db27ba
4
+ data.tar.gz: 21de2c24f3a98e759b68e4783b29d9c8e11f45cc3e71b71bd779e0319ba52986
5
5
  SHA512:
6
- metadata.gz: a03980f411dd97dd6744780fa01a74891f618703faaa3b06c24cd2f088ab387a4127ab17d9c9b0f02c7c746fd0701ee66743d4debee5e4c29f9c8704d03f2cca
7
- data.tar.gz: e90a7ea856b01fd8298e30a2eef2c1ad81d0337c819792a0df8108145419caa1fe19502502c0a3df17f1e24b792c435b4e7983030dc61cb2d4f310cbb7a639e3
6
+ metadata.gz: 5ab0f421744e572638f75ccf04508471f7df8131f105b8e55ae806b90255340f8b45193f72c94dfb84ee1b6037e836e8d29050c8963417d41484c2f83efe97b5
7
+ data.tar.gz: 3c2e2f61c4eeea3af9fdc95d493461bd727e9b49134c60a8577b5a7c149ae3a4da1796c05f3db6257afed23b2abd29bf1ef146359dc3d5726185ec73b7c6a221
@@ -1,3 +1,7 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
3
+ NewCops: enable
4
+
1
5
  Layout/LineLength:
2
6
  Max: 100
3
7
  Exclude:
@@ -15,9 +19,6 @@ Metrics/BlockLength:
15
19
  Metrics/MethodLength:
16
20
  Max: 30
17
21
 
18
- AllCops:
19
- TargetRubyVersion: 2.5
20
-
21
22
  Metrics/AbcSize:
22
23
  Max: 16
23
24
 
@@ -1,4 +1,4 @@
1
- # 1.0.0 TBD
1
+ # 1.0.0 July 15th, 2020
2
2
 
3
3
  Initial, feature-complete implementation.
4
4
 
data/README.md CHANGED
@@ -276,7 +276,7 @@ config = Grid.new do
276
276
  end.to_h
277
277
  ````
278
278
 
279
- Assuming our en.yml looks like the above example and our locale is set to:en then the resulting `config` value will now be:
279
+ Assuming our en.yml looks like the above example and our locale is set to :en then the resulting `config` value will now be:
280
280
 
281
281
  ````ruby
282
282
  {
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.add_development_dependency('pry', '~>0')
33
33
  s.add_development_dependency('rake', '~> 13')
34
34
  s.add_development_dependency('rspec')
35
- s.add_development_dependency('rubocop', '~>0.79.0')
36
- s.add_development_dependency('simplecov', '~>0.17.0')
35
+ s.add_development_dependency('rubocop', '~>0.88.0')
36
+ s.add_development_dependency('simplecov', '~>0.18.5')
37
37
  s.add_development_dependency('simplecov-console', '~>0.6.0')
38
38
  end
@@ -8,6 +8,7 @@
8
8
  #
9
9
 
10
10
  require_relative 'dsl'
11
+ require_relative 'transformers'
11
12
 
12
13
  module Hashcraft
13
14
  # Super-class for craftable objects.
@@ -59,11 +60,7 @@ module Hashcraft
59
60
  end
60
61
 
61
62
  def evaluate_values!(data, key, values)
62
- data[key] ||= []
63
-
64
- values.each do |value|
65
- data[key] << (value.is_a?(Hashcraft::Base) ? value.to_h : value)
66
- end
63
+ data[key] = values.map { |value| value.is_a?(Hashcraft::Base) ? value.to_h : value }
67
64
 
68
65
  self
69
66
  end
@@ -78,7 +75,7 @@ module Hashcraft
78
75
  return self unless option.eager?
79
76
 
80
77
  key = hash_key(option)
81
- value = value_transformer_to_use.transform(option.default.dup, option)
78
+ value = Transformers.instance.transform(value_transformer_to_use, option.default.dup, option)
82
79
 
83
80
  data[key] = value
84
81
 
@@ -88,7 +85,7 @@ module Hashcraft
88
85
  def value!(option, value, &block)
89
86
  key = hash_key(option)
90
87
  value = option.craft_value(value, &block)
91
- value = value_transformer_to_use.transform(value, option)
88
+ value = Transformers.instance.transform(value_transformer_to_use, value, option)
92
89
 
93
90
  option.value!(data, key, value)
94
91
 
@@ -96,7 +93,7 @@ module Hashcraft
96
93
  end
97
94
 
98
95
  def hash_key(option)
99
- key_transformer_to_use.transform(option.hash_key, option)
96
+ Transformers.instance.transform(key_transformer_to_use, option.hash_key, option)
100
97
  end
101
98
  end
102
99
  end
@@ -8,7 +8,6 @@
8
8
  #
9
9
 
10
10
  require_relative 'option'
11
- require_relative 'transformer_registry'
12
11
 
13
12
  module Hashcraft
14
13
  # The class API used to define options for a craftable class. Each class stores its own
@@ -22,32 +21,32 @@ module Hashcraft
22
21
  # It will follow the typical inheritance chain and find the closest
23
22
  # transformer to use (child-first).
24
23
  def key_transformer(name)
25
- tap { @local_key_transformer = TransformerRegistry.resolve(name) }
24
+ tap { @local_key_transformer = name }
26
25
  end
27
26
 
28
27
  # DSL Method used to declare what the sub-class should use as a transformer for all values.
29
28
  # It will follow the typical inheritance chain and find the closest
30
29
  # transformer to use (child-first).
31
30
  def value_transformer(name)
32
- tap { @local_value_transformer = TransformerRegistry.resolve(name) }
31
+ tap { @local_value_transformer = name }
33
32
  end
34
33
 
35
34
  def key_transformer_to_use # :nodoc:
36
35
  return @key_transformer_to_use if @key_transformer_to_use
37
36
 
38
- @closest_key_transformer =
37
+ @key_transformer_to_use =
39
38
  ancestors.select { |a| a < Base }
40
39
  .find(&:local_key_transformer)
41
- &.local_key_transformer || Transformers::PassThru.instance
40
+ &.local_key_transformer
42
41
  end
43
42
 
44
43
  def value_transformer_to_use # :nodoc:
45
44
  return @value_transformer_to_use if @value_transformer_to_use
46
45
 
47
- @closest_value_transformer =
46
+ @value_transformer_to_use =
48
47
  ancestors.select { |a| a < Base }
49
48
  .find(&:local_value_transformer)
50
- &.local_value_transformer || Transformers::PassThru.instance
49
+ &.local_value_transformer
51
50
  end
52
51
 
53
52
  def find_option(name) # :nodoc:
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ # Singleton that knows how to register and retrieve mutator instances.
12
+ # Entries can either be instances that respond to value! or procs that accept three arguments.
13
+ class Mutators < Generic::Registry # :nodoc:
14
+ FUNCTIONS = {
15
+ always_false: ->(data, key, _value) { data[key] = false },
16
+ always_true: ->(data, key, _value) { data[key] = true },
17
+ array: ->(data, key, value) { (data[key] ||= []) << value },
18
+ flat_array: lambda do |data, key, value|
19
+ data[key] ||= []
20
+
21
+ if value.is_a?(::Array)
22
+ data[key] += value
23
+ else
24
+ data[key] << value
25
+ end
26
+ end,
27
+ hash: ->(data, key, value) { (data[key] ||= {}).merge!(value || {}) },
28
+ property: ->(data, key, value) { data[key] = value },
29
+ }.freeze
30
+
31
+ private_constant :FUNCTIONS
32
+
33
+ def initialize
34
+ # append on the default case
35
+ super(FUNCTIONS.merge('': FUNCTIONS[:property]))
36
+ end
37
+
38
+ def value!(name, data, key, value)
39
+ object = resolve(name)
40
+ method = object.is_a?(Proc) ? :call : :value!
41
+
42
+ object.send(method, data, key, value)
43
+ end
44
+ end
45
+ end
@@ -7,7 +7,7 @@
7
7
  # LICENSE file in the root directory of this source tree.
8
8
  #
9
9
 
10
- require_relative 'mutator_registry'
10
+ require_relative 'mutators'
11
11
 
12
12
  module Hashcraft
13
13
  # Defines a method and corresponding attribute for a craftable class.
@@ -29,14 +29,14 @@ module Hashcraft
29
29
  @eager = opts[:eager] || false
30
30
  @internal_meta = symbolize_keys(opts[:meta] || {})
31
31
  @key = opts[:key].to_s
32
- @mutator = MutatorRegistry.resolve(opts[:mutator])
32
+ @mutator = opts[:mutator]
33
33
  @name = name.to_s
34
34
 
35
35
  freeze
36
36
  end
37
37
 
38
38
  def value!(data, key, value) # :nodoc:
39
- mutator.value!(data, key, value)
39
+ Mutators.instance.value!(mutator, data, key, value)
40
40
  end
41
41
 
42
42
  # Options are sent into transformers as arguments. Leverage the meta key for an option
@@ -59,7 +59,7 @@ module Hashcraft
59
59
  attr_reader :internal_meta
60
60
 
61
61
  def symbolize_keys(hash)
62
- hash.map { |k, v| [k.to_sym, v] }.to_h
62
+ hash.transform_keys(&:to_sym)
63
63
  end
64
64
  end
65
65
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ # Singleton that knows how to register and retrieve transformer instances.
12
+ # Entries can either be instances that respond to transform or procs that accept two arguments.
13
+ class Transformers < Generic::Registry # :nodoc:
14
+ FUNCTIONS = {
15
+ camel_case: lambda do |value, _option|
16
+ return value.to_s if value.to_s.empty?
17
+
18
+ name = value.to_s.split('_').collect(&:capitalize).join
19
+
20
+ name[0, 1].downcase + name[1..-1]
21
+ end,
22
+ pascal_case: ->(value, _option) { value.to_s.split('_').collect(&:capitalize).join },
23
+ pass_thru: ->(value, _option) { value }
24
+ }.freeze
25
+
26
+ private_constant :FUNCTIONS
27
+
28
+ def initialize
29
+ # append on the default case
30
+ super(FUNCTIONS.merge('': FUNCTIONS[:pass_thru]))
31
+ end
32
+
33
+ def transform(name, value, option)
34
+ object = resolve(name)
35
+ method = object.is_a?(Proc) ? :call : :transform
36
+
37
+ object.send(method, value, option)
38
+ end
39
+ end
40
+ end
@@ -8,5 +8,5 @@
8
8
  #
9
9
 
10
10
  module Hashcraft
11
- VERSION = '1.0.0-alpha.6'
11
+ VERSION = '1.0.0'
12
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashcraft
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.alpha.6
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ruggio
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-08 00:00:00.000000000 Z
11
+ date: 2020-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: guard-rspec
@@ -72,28 +72,28 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.79.0
75
+ version: 0.88.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.79.0
82
+ version: 0.88.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: simplecov
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.17.0
89
+ version: 0.18.5
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.17.0
96
+ version: 0.18.5
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: simplecov-console
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -136,18 +136,9 @@ files:
136
136
  - lib/hashcraft/generic.rb
137
137
  - lib/hashcraft/generic/dictionary.rb
138
138
  - lib/hashcraft/generic/registry.rb
139
- - lib/hashcraft/mutator_registry.rb
140
- - lib/hashcraft/mutators/always_false.rb
141
- - lib/hashcraft/mutators/always_true.rb
142
- - lib/hashcraft/mutators/array.rb
143
- - lib/hashcraft/mutators/flat_array.rb
144
- - lib/hashcraft/mutators/hash.rb
145
- - lib/hashcraft/mutators/property.rb
139
+ - lib/hashcraft/mutators.rb
146
140
  - lib/hashcraft/option.rb
147
- - lib/hashcraft/transformer_registry.rb
148
- - lib/hashcraft/transformers/camel_case.rb
149
- - lib/hashcraft/transformers/pascal_case.rb
150
- - lib/hashcraft/transformers/pass_thru.rb
141
+ - lib/hashcraft/transformers.rb
151
142
  - lib/hashcraft/version.rb
152
143
  homepage: https://github.com/bluemarblepayroll/hashcraft
153
144
  licenses:
@@ -169,9 +160,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
169
160
  version: '2.5'
170
161
  required_rubygems_version: !ruby/object:Gem::Requirement
171
162
  requirements:
172
- - - ">"
163
+ - - ">="
173
164
  - !ruby/object:Gem::Version
174
- version: 1.3.1
165
+ version: '0'
175
166
  requirements: []
176
167
  rubygems_version: 3.0.3
177
168
  signing_key:
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- require_relative 'mutators/always_false'
11
- require_relative 'mutators/always_true'
12
- require_relative 'mutators/array'
13
- require_relative 'mutators/flat_array'
14
- require_relative 'mutators/hash'
15
- require_relative 'mutators/property'
16
-
17
- module Hashcraft
18
- # Singleton that knows how to register and retrieve mutator instances.
19
- class MutatorRegistry < Generic::Registry # :nodoc:
20
- def initialize
21
- super(
22
- '' => Mutators::Property.instance,
23
- 'always_false' => Mutators::AlwaysFalse.instance,
24
- 'always_true' => Mutators::AlwaysTrue.instance,
25
- 'array' => Mutators::Array.instance,
26
- 'flat_array' => Mutators::FlatArray.instance,
27
- 'hash' => Mutators::Hash.instance,
28
- 'property' => Mutators::Property.instance
29
- )
30
- end
31
- end
32
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Mutators # :nodoc: all
12
- # Set to false, no matter what.
13
- class AlwaysFalse
14
- include Singleton
15
-
16
- def value!(data, key, _value)
17
- tap { data[key] = false }
18
- end
19
- end
20
- end
21
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Mutators # :nodoc: all
12
- # Set to true, no matter what.
13
- class AlwaysTrue
14
- include Singleton
15
-
16
- def value!(data, key, _value)
17
- tap { data[key] = true }
18
- end
19
- end
20
- end
21
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Mutators # :nodoc: all
12
- # When a hash's key is an array then this mutator can be used to push a new value on the
13
- # respective array.
14
- class Array
15
- include Singleton
16
-
17
- def value!(data, key, value)
18
- data[key] ||= []
19
-
20
- data[key] << value
21
-
22
- self
23
- end
24
- end
25
- end
26
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Mutators # :nodoc: all
12
- # If the value is an array then concat, if it is not an array then push.
13
- class FlatArray
14
- include Singleton
15
-
16
- def value!(data, key, value)
17
- data[key] ||= []
18
-
19
- # Prefixed Array with double colons to not get confused with our Array mutator class.
20
- if value.is_a?(::Array)
21
- data[key] += value
22
- else
23
- data[key] << value
24
- end
25
-
26
- self
27
- end
28
- end
29
- end
30
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Mutators # :nodoc: all
12
- # When a hash's key a Hash then this mutator can be used to merge a new value on the
13
- # respective hash.
14
- class Hash
15
- include Singleton
16
-
17
- def value!(data, key, value)
18
- data[key] ||= {}
19
- data[key].merge!(value || {})
20
-
21
- self
22
- end
23
- end
24
- end
25
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Mutators # :nodoc: all
12
- # When a hash key can be simply assigned to (like a property) then this mutator can be used to
13
- # simply do the assignment.
14
- class Property
15
- include Singleton
16
-
17
- def value!(data, key, value)
18
- tap { data[key] = value }
19
- end
20
- end
21
- end
22
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- require_relative 'transformers/camel_case'
11
- require_relative 'transformers/pascal_case'
12
- require_relative 'transformers/pass_thru'
13
-
14
- module Hashcraft
15
- # Singleton that knows how to register and retrieve transformer instances.
16
- class TransformerRegistry < Generic::Registry # :nodoc:
17
- def initialize
18
- super(
19
- '' => Transformers::PassThru.instance,
20
- 'camel_case' => Transformers::CamelCase.instance,
21
- 'pascal_case' => Transformers::PascalCase.instance,
22
- 'pass_thru' => Transformers::PassThru.instance
23
- )
24
- end
25
- end
26
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Transformers # :nodoc: all
12
- # Transform snake-cased to camel-cased string. Example:
13
- # date_of_birth => dateOfBirth
14
- # DATE_OF_BIRTH => dateOfBirth
15
- class CamelCase
16
- include Singleton
17
-
18
- def transform(value, _option)
19
- return '' if value.to_s.empty?
20
-
21
- name = value.to_s.split('_').collect(&:capitalize).join
22
-
23
- name[0, 1].downcase + name[1..-1]
24
- end
25
- end
26
- end
27
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Transformers # :nodoc: all
12
- # Transform snake-cased to pascal-cased string. Example:
13
- # date_of_birth => DateOfBirth
14
- # DATE_OF_BIRTH => DateOfBirth
15
- class PascalCase
16
- include Singleton
17
-
18
- def transform(value, _option)
19
- return '' if value.to_s.empty?
20
-
21
- value.to_s.split('_').collect(&:capitalize).join
22
- end
23
- end
24
- end
25
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- module Hashcraft
11
- module Transformers # :nodoc: all
12
- # Default transformer, simply returns the value passed in.
13
- class PassThru
14
- include Singleton
15
-
16
- def transform(value, _option)
17
- value
18
- end
19
- end
20
- end
21
- end