deco_lite 0.1.1 → 0.2.2

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
  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