deco_lite 0.1.1 → 0.2.2

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: f9b6003b4b875144ddc599d65ace8b397b3bb010cacc95aebf3360b71a7ccda9
4
- data.tar.gz: 82e1860ba9e6f5762e6bc52233160fae55e4f0a715ec3bb8a555ec3b3d24ac23
3
+ metadata.gz: 6e8cab024f00d573f418f6da7931159d211392b7e67994b6e5d736fa87e6858d
4
+ data.tar.gz: 75d52762639bda61821152dd7ee071c0c29571de02835d9ca2309dc3f645a380
5
5
  SHA512:
6
- metadata.gz: c2f7ddce5f5d6bc1367ae5da30e2043cc60b443c93f4df0f4caac435c415b0dfeeffdff424460810cb0a9996f00e3fee4e9d0138bbac4d8515138613c5b9a0a5
7
- data.tar.gz: 492a9602f01f7615049039e0dccc80debce0cbc1ec57d5927e72ca6b6f4f320fb5526b8f2384c81b4a3c12e70a278d4dcc4978c73b3ff56436d628390480e850
6
+ metadata.gz: 073e6f539cae726483f065c873ab6b21c11a0f29cb497998c66ad85c9f1775c4c973f675c4138c07d2b7158455cf819555ca3b550ea38c7e6b3811dfb2bf9780
7
+ data.tar.gz: f69bc6b7d1052172c9603c1b2a0b49cd13ee863217c2303b49dbafe86dd68e0b5def92184948b80efd8760b6735878ff0ddad2ecdbb5b01135c7cbc3241b4ee5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ### 0.2.2
2
+ * Fix bug requiring support codez in lib/deco_lite.rb.
3
+
4
+ ### 0.2.1
5
+ * changes
6
+ * Add mad_flatter gem runtime dependency.
7
+ * Refactor to let mad_flatter handle the Hash flattening.
8
+
1
9
  ### 0.1.1
2
10
  * changes
3
11
  * Update gems and especially rake gem version to squash CVE-2020-8130, see https://github.com/advisories/GHSA-jppv-gw3r-w3q8.
data/Gemfile.lock CHANGED
@@ -1,10 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- deco_lite (0.1.1)
4
+ deco_lite (0.2.2)
5
5
  activemodel (~> 7.0, >= 7.0.3.1)
6
6
  activesupport (~> 7.0, >= 7.0.3.1)
7
7
  immutable_struct_ex (~> 0.2.0)
8
+ mad_flatter (~> 1.0.0.pre.beta)
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
@@ -24,20 +25,23 @@ GEM
24
25
  docile (1.4.0)
25
26
  i18n (1.12.0)
26
27
  concurrent-ruby (~> 1.0)
27
- immutable_struct_ex (0.2.1)
28
+ immutable_struct_ex (0.2.2)
28
29
  json (2.6.2)
29
30
  kwalify (0.7.2)
31
+ mad_flatter (1.0.1.pre.beta)
32
+ activesupport (~> 7.0, >= 7.0.3.1)
33
+ immutable_struct_ex (~> 0.2.0)
30
34
  method_source (1.0.0)
31
- minitest (5.16.2)
35
+ minitest (5.16.3)
32
36
  parallel (1.22.1)
33
37
  parser (3.1.2.1)
34
38
  ast (~> 2.4.1)
35
- pry (0.13.1)
39
+ pry (0.14.1)
36
40
  coderay (~> 1.1)
37
41
  method_source (~> 1.0)
38
- pry-byebug (3.9.0)
42
+ pry-byebug (3.10.1)
39
43
  byebug (~> 11.0)
40
- pry (~> 0.13.0)
44
+ pry (>= 0.13, < 0.15)
41
45
  rainbow (3.1.1)
42
46
  rake (13.0.6)
43
47
  reek (6.1.1)
@@ -46,19 +50,19 @@ GEM
46
50
  rainbow (>= 2.0, < 4.0)
47
51
  regexp_parser (2.5.0)
48
52
  rexml (3.2.5)
49
- rspec (3.10.0)
50
- rspec-core (~> 3.10.0)
51
- rspec-expectations (~> 3.10.0)
52
- rspec-mocks (~> 3.10.0)
53
- rspec-core (3.10.2)
54
- rspec-support (~> 3.10.0)
55
- rspec-expectations (3.10.2)
53
+ rspec (3.11.0)
54
+ rspec-core (~> 3.11.0)
55
+ rspec-expectations (~> 3.11.0)
56
+ rspec-mocks (~> 3.11.0)
57
+ rspec-core (3.11.0)
58
+ rspec-support (~> 3.11.0)
59
+ rspec-expectations (3.11.0)
56
60
  diff-lcs (>= 1.2.0, < 2.0)
57
- rspec-support (~> 3.10.0)
58
- rspec-mocks (3.10.3)
61
+ rspec-support (~> 3.11.0)
62
+ rspec-mocks (3.11.1)
59
63
  diff-lcs (>= 1.2.0, < 2.0)
60
- rspec-support (~> 3.10.0)
61
- rspec-support (3.10.3)
64
+ rspec-support (~> 3.11.0)
65
+ rspec-support (3.11.0)
62
66
  rubocop (1.35.0)
63
67
  json (~> 2.3)
64
68
  parallel (~> 1.10)
data/deco_lite.gemspec CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.add_runtime_dependency 'activemodel', '~> 7.0', '>= 7.0.3.1'
37
37
  spec.add_runtime_dependency 'activesupport', '~> 7.0', '>= 7.0.3.1'
38
38
  spec.add_runtime_dependency 'immutable_struct_ex', '~> 0.2.0'
39
+ spec.add_runtime_dependency 'mad_flatter', '~> 1.0.0.pre.beta'
39
40
  spec.add_development_dependency 'bundler', '~> 2.2', '>= 2.2.17'
40
41
  spec.add_development_dependency 'pry-byebug', '~> 3.9'
41
42
  spec.add_development_dependency 'reek', '~> 6.1', '>= 6.1.1'
@@ -1,24 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'mad_flatter'
3
4
  require_relative 'field_assignable'
4
- require_relative 'field_informable'
5
5
 
6
6
  module DecoLite
7
7
  # Provides methods to load and return information about a given hash.
8
8
  module HashLoadable
9
9
  include FieldAssignable
10
- include FieldInformable
11
10
 
12
11
  private
13
12
 
14
- def load_hash(hash:, options:)
13
+ def load_hash(hash:, deco_lite_options:)
15
14
  raise ArgumentError, "Argument hash is not a Hash (#{hash.class})" unless hash.is_a? Hash
16
15
 
17
- return if hash.blank?
16
+ return {} if hash.blank?
18
17
 
19
- field_info = get_field_info(hash: hash, namespace: options.namespace)
20
- set_field_values(hash: hash, field_info: field_info, options: options)
21
- merge_field_info! field_info: field_info
18
+ load_service_options = merge_with_load_service_options deco_lite_options: deco_lite_options
19
+ load_service.execute(hash: hash, options: load_service_options).tap do |h|
20
+ h.each_pair do |field_name, value|
21
+ create_field_accessor field_name: field_name, options: deco_lite_options
22
+ field_names << field_name
23
+ set_field_value(field_name: field_name, value: value, options: deco_lite_options)
24
+ end
25
+ end
26
+ end
27
+
28
+ def load_service
29
+ @load_service ||= MadFlatter::Service.new
30
+ end
31
+
32
+ def merge_with_load_service_options(deco_lite_options:)
33
+ load_service.options.to_h.merge \
34
+ deco_lite_options.to_h.slice(*MadFlatter::OptionsDefaultable::DEFAULT_OPTIONS.keys)
22
35
  end
23
36
  end
24
37
  end
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_model'
4
+ require_relative 'field_creatable'
4
5
  require_relative 'field_requireable'
5
- require_relative 'hashable'
6
6
  require_relative 'hash_loadable'
7
+ require_relative 'hashable'
7
8
  require_relative 'model_nameable'
8
9
  require_relative 'optionable'
9
10
 
@@ -12,16 +13,17 @@ module DecoLite
12
13
  # dynamic models that can be used as decorators.
13
14
  class Model
14
15
  include ActiveModel::Model
16
+ include FieldCreatable
15
17
  include FieldRequireable
16
- include Hashable
17
18
  include HashLoadable
19
+ include Hashable
18
20
  include ModelNameable
19
21
  include Optionable
20
22
 
21
23
  validate :validate_required_fields
22
24
 
23
25
  def initialize(options: {})
24
- @field_info = {}
26
+ @field_names = []
25
27
  # Accept whatever options are sent, but make sure
26
28
  # we have defaults set up. #options_with_defaults
27
29
  # will merge options into OptionsDefaultable::DEFAULT_OPTIONS
@@ -37,9 +39,16 @@ module DecoLite
37
39
  # options while loading, but also provide option customization
38
40
  # of options when needed.
39
41
  options = Options.with_defaults(options, defaults: self.options)
40
- load_hash(hash: hash, options: options)
42
+
43
+ load_hash(hash: hash, deco_lite_options: options)
41
44
 
42
45
  self
43
46
  end
47
+
48
+ attr_reader :field_names
49
+
50
+ private
51
+
52
+ attr_writer :field_names
44
53
  end
45
54
  end
@@ -22,7 +22,7 @@ module DecoLite
22
22
  end
23
23
 
24
24
  def namespace?
25
- namespace || false
25
+ namespace.present? || false
26
26
  end
27
27
  end
28
28
  validate_options! options: immutable_struct_ex.to_h
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Defines the version of this gem.
4
4
  module DecoLite
5
- VERSION = '0.1.1'
5
+ VERSION = '0.2.2'
6
6
  end
data/lib/deco_lite.rb CHANGED
@@ -1,5 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Dir[File.join('.', 'lib/deco_lite/**/*.rb')].each do |f|
4
- require f
5
- end
3
+ require_relative 'deco_lite/field_assignable'
4
+ require_relative 'deco_lite/field_conflictable'
5
+ require_relative 'deco_lite/field_creatable'
6
+ require_relative 'deco_lite/field_requireable'
7
+ require_relative 'deco_lite/field_retrievable'
8
+ require_relative 'deco_lite/fields_optionable'
9
+ require_relative 'deco_lite/hash_loadable'
10
+ require_relative 'deco_lite/hashable'
11
+ require_relative 'deco_lite/model'
12
+ require_relative 'deco_lite/model_nameable'
13
+ require_relative 'deco_lite/namespace_optionable'
14
+ require_relative 'deco_lite/optionable'
15
+ require_relative 'deco_lite/options'
16
+ require_relative 'deco_lite/options_defaultable'
17
+ require_relative 'deco_lite/options_validatable'
18
+ require_relative 'deco_lite/version'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deco_lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gene M. Angelo, Jr.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-14 00:00:00.000000000 Z
11
+ date: 2022-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -64,6 +64,20 @@ dependencies:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
66
  version: 0.2.0
67
+ - !ruby/object:Gem::Dependency
68
+ name: mad_flatter
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 1.0.0.pre.beta
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 1.0.0.pre.beta
67
81
  - !ruby/object:Gem::Dependency
68
82
  name: bundler
69
83
  requirement: !ruby/object:Gem::Requirement
@@ -247,7 +261,6 @@ files:
247
261
  - lib/deco_lite/field_assignable.rb
248
262
  - lib/deco_lite/field_conflictable.rb
249
263
  - lib/deco_lite/field_creatable.rb
250
- - lib/deco_lite/field_informable.rb
251
264
  - lib/deco_lite/field_requireable.rb
252
265
  - lib/deco_lite/field_retrievable.rb
253
266
  - lib/deco_lite/fields_optionable.rb
@@ -1,82 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DecoLite
4
- # Creates and returns a hash given the parameters that are used to
5
- # dynamically create fields and assign values to a model.
6
- module FieldInformable
7
- # This method simply navigates the payload hash received and creates qualified
8
- # hash key names that can be used to verify/map to our field names in this model.
9
- # This can be used to qualify nested hash fields and saves us some headaches
10
- # if there are nested field names with the same name:
11
- #
12
- # given:
13
- #
14
- # hash = {
15
- # first_name: 'first_name',
16
- # ...
17
- # address: {
18
- # street: '',
19
- # ...
20
- # }
21
- # }
22
- #
23
- # get_field_info(hash: hash) #=>
24
- #
25
- # {
26
- # :first_name=>{:field_name=>:first_name, :dig=>[]},
27
- # ...
28
- # :address_street=>{:field_name=>:street, :dig=>[:address]},
29
- # ...
30
- # }
31
- #
32
- # The generated, qualified field names expected to map to our model, because we named
33
- # them as such.
34
- #
35
- # :field_name is the actual, unqualified field name found in the payload hash sent.
36
- # :dig is the hash key by which :field_name can be found in the payload hash if need be -
37
- # retained across recursive calls.
38
- def get_field_info(hash:, namespace: nil, dig: [], field_info: {})
39
- hash.each do |key, value|
40
- if value.is_a? Hash
41
- get_field_info hash: value,
42
- namespace: namespace,
43
- dig: dig << key,
44
- field_info: field_info
45
- dig.pop
46
- else
47
- set_field_info!(field_info: field_info,
48
- key: key,
49
- namespace: namespace,
50
- dig: dig)
51
- end
52
- end
53
-
54
- field_info
55
- end
56
-
57
- def set_field_info!(field_info:, key:, namespace:, dig:)
58
- field_key = [namespace, *dig, key].compact.join('_').to_sym
59
-
60
- field_info[field_key] = {
61
- field_name: key,
62
- dig: dig.dup
63
- }
64
- end
65
-
66
- def merge_field_info!(field_info:)
67
- @field_info.merge!(field_info)
68
- end
69
-
70
- def field_names
71
- field_info&.keys || []
72
- end
73
-
74
- attr_reader :field_info
75
-
76
- private
77
-
78
- attr_writer :field_info
79
-
80
- module_function :get_field_info, :set_field_info!, :merge_field_info!
81
- end
82
- end