finest-builder 0.0.4 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b0f3df268427f9e1a393a8caf84442dd9c928e6355fe6bcd8c6057e43dd35e6
4
- data.tar.gz: 45f85f5fe8938a51e58178032c2d0bc7f1ab1a02e0133370fe3ff3439bc420f1
3
+ metadata.gz: 0af65dd478cbb0858b84206d732cca843766b8a904ee9e6b429fcf90cb519a14
4
+ data.tar.gz: 64da89a7032bee0a4210cfdcff433194c63418829481a63c65212198e418bf33
5
5
  SHA512:
6
- metadata.gz: 6598c52de94933ebcfecc67db8796ff957fc93e8c380f7355d3d0e7dfa441235993908211510aba32af0ec8d4fe504e095050b59fca0f0340779c193209bb1b5
7
- data.tar.gz: c6d48a2efc27b554c04bd282c45a54f113399669d2765b72212b64913db9f5efa47e1cf721849689dd0bfd1223cbe91be891de10bd8c2364d05795cf441e1ac0
6
+ metadata.gz: a1c02d4e3848ce69b88ead6515f774fc3595b7e6a7787c1bbee719987e946ae95bb373b38e56ffdad890981b80a69336ef589087b0c0a8fd4d6334d3c02fe8d6
7
+ data.tar.gz: 2927353a289ac0cb2208990eb4957dceab8106ef3b46654e6d3b515eecd65f617216640824d14c0a301305d75e42db13a7554077e0d0ed263ead25161e489582
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Finest::Builder ![Travis](https://travis-ci.org/eddygarcas/finest-builder.svg) [![Gem Version](https://badge.fury.io/rb/finest-builder.svg)](https://badge.fury.io/rb/finest-builder)
1
+ # Finest::Builder ![Travis](https://travis-ci.com/eddygarcas/finest-builder.svg) [![Gem Version](https://badge.fury.io/rb/finest-builder.svg)](https://badge.fury.io/rb/finest-builder)
2
2
 
3
3
  ## Installation
4
4
 
@@ -26,7 +26,7 @@ Once initialized just use the accessors as any other instance.
26
26
  class Issue
27
27
  include Finest::Struct
28
28
 
29
- def initialize(json = nil)
29
+ def initialize(json = {}, _keys = [])
30
30
  super json
31
31
  end
32
32
  end
@@ -43,7 +43,7 @@ In case not using column names but an array of method names, new accessors would
43
43
  include Finest::Helper
44
44
  end
45
45
 
46
- issue = Issue.new.build_by_keys({id: 1234,text: "hocus pocus"},Issue.column_names) # => Issue.column_names = id:
46
+ issue = Issue.new.build_by_keys({id: 1234,text: "hocus pocus"}, Issue.column_names) # => Issue.column_names = id:
47
47
  issue.as_json # => {id: 1234}
48
48
  issue.to_h # => nil
49
49
 
@@ -58,7 +58,7 @@ In case not using column names but an array of method names, new accessors would
58
58
  Call *build_by_keys* method once the model has been initialized passing a json message,
59
59
  it would *yield* itself as a block in case you want to perform further actions.
60
60
  ```ruby
61
- build_by_keys(json = {},keys = nil)
61
+ build_by_keys(**args)
62
62
  ```
63
63
  This method would also create an instance variable called *@to_h* contains a pair-value hash as a result.
64
64
  *@to_h* instance variable won't be available if the class inherits from *ActiveRecord::Base*
@@ -1,29 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'lib/finest/builder/version'
2
4
 
3
5
  Gem::Specification.new do |spec|
4
- spec.name = "finest-builder"
6
+ spec.name = 'finest-builder'
5
7
  spec.version = Finest::Builder::VERSION
6
- spec.authors = ["Eduard Garcia Castello"]
7
- spec.email = ["eduard@rzilient.club"]
8
+ spec.authors = ['Eduard Garcia Castello']
9
+ spec.email = %w[edugarcas@gmail.com eduard@rzilient.club]
8
10
 
9
- spec.summary = %q{Builder modules to create either class ghost methods from a given json or an open struct.}
11
+ spec.summary = %q{Builder modules to create either class ghost methods from a given JSON or a OpenStruct}
10
12
  #spec.description = %q{TODO: Write a longer description or delete this line.}
11
- spec.homepage = "https://github.com/eddygarcas/finest-builder"
12
- spec.license = "MIT"
13
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
+ spec.homepage = 'https://github.com/eddygarcas/finest-builder'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
14
16
 
15
- spec.metadata["allowed_push_host"] = "https://rubygems.org/"
17
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
16
18
 
17
- spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = "https://github.com/eddygarcas/finest-builder"
19
- spec.metadata["changelog_uri"] = "https://github.com/eddygarcas/finest-builder"
19
+ spec.metadata['homepage_uri'] = spec.homepage
20
+ spec.metadata['source_code_uri'] = 'https://github.com/eddygarcas/finest-builder'
21
+ spec.metadata['changelog_uri'] = 'https://github.com/eddygarcas/finest-builder'
20
22
 
21
23
  # Specify which files should be added to the gem when it is released.
22
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
26
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
27
  end
26
- spec.bindir = "exe"
28
+ spec.bindir = 'exe'
27
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
30
+ spec.require_paths = ['lib']
29
31
  end
@@ -1,12 +1,16 @@
1
- require "finest/builder/version"
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'finest/builder/version'
4
+
5
+ # Add snake case in String
3
6
  class String
4
7
  def snake_case
5
- length > 2 ? gsub(/(\w)[A-Z]/) { |e| "#{e[0]}_#{e[1].downcase}" }.downcase : downcase
8
+ length > 7 ? strip.gsub(/(\w[A-Z]|\s\S)/) { |e| "#{e[0].strip}_#{e[1].strip.downcase}" }.downcase : strip.downcase
6
9
  end
7
10
  end
8
11
 
9
12
  module Finest
13
+ # Finest Builder
10
14
  module Helper
11
15
 
12
16
  # Parses a given json structure looking for specific keys inside the structure if passed
@@ -25,28 +29,29 @@ module Finest
25
29
  # e.client.to_h[:id]
26
30
  # e.client.id
27
31
  #
28
- def build_by_keys(json = {}, keys = nil)
29
- k = keys || json&.keys
30
- raise ArgumentError "keys argument is not an array" unless k&.respond_to?(:each)
32
+ def build_by_keys(json = {}, keys = [])
33
+ keys = keys.empty? ? json.keys : keys
34
+ raise ArgumentError unless keys&.respond_to?(:each)
35
+
31
36
  accessor_builder('to_h', {}) unless self.class.method_defined?(:as_json)
32
37
  json.transform_keys!(&:to_s)
33
- k&.reject! { |ky| ky.end_with?('=') }
34
- k&.each do |key|
35
- self.send("#{key.to_s.snake_case}=", nested_hash_value(json, key.to_s))
36
- @to_h&.merge!({ key.to_s.snake_case.to_sym => self.send("#{key.to_s.snake_case}") })
38
+ keys&.reject! { |key| key.end_with?('=') }
39
+ keys&.each do |key|
40
+ send("#{key.to_s.snake_case}=", nested_hash_value(json, key.to_s))
41
+ @to_h&.merge!({ key.to_s.snake_case.to_sym => send(key.to_s.snake_case.to_s) })
37
42
  end
38
43
  yield self if block_given?
39
44
  self
40
45
  end
41
46
 
42
47
  # Builds an instance variable as well as its class method accessors from a key value pair.
43
- def accessor_builder(k, v)
44
- self.instance_variable_set("@#{k}", v)
45
- self.class.send(:define_method, "#{k}", proc { self.instance_variable_get("@#{k}") })
46
- self.class.send(:define_method, "#{k}=", proc { |v| self.instance_variable_set("@#{k}", v) })
48
+ def accessor_builder(key, val)
49
+ instance_variable_set("@#{key}", val)
50
+ self.class.send(:define_method, key.to_s, proc { instance_variable_get("@#{key}") })
51
+ self.class.send(:define_method, "#{key}=", proc { |val| instance_variable_set("@#{key}", val) })
47
52
  end
48
53
 
49
- #Goes through a complex Hash nest and gets the value of a passed key.
54
+ # Goes through a complex Hash nest and gets the value of a passed key.
50
55
  # First wil check whether the object has the key? method,
51
56
  # which will mean it's a Hash and also if the Hash the method parameter key
52
57
  # if obj.respond_to?(:key?) && obj.key?(key)
@@ -78,43 +83,51 @@ module Finest
78
83
  accessor_builder(name.to_s.gsub(/=$/, ''), args[0]) if name.to_s =~ /=$/
79
84
  end
80
85
 
86
+ def respond_to_missing?; end
87
+
81
88
  def attribute_from_inner_key(elem, attr, in_key = nil)
82
89
  { attr.to_sym => nested_hash_value(elem, in_key&.present? ? in_key : attr.to_s) }
83
90
  end
84
91
 
85
92
  end
86
93
 
94
+ # Finest Struct
87
95
  module Struct
88
96
  class Error < StandardError; end
89
97
 
90
98
  include Helper
91
99
 
92
- def initialize(json = nil)
100
+ def initialize(json = {}, keys = [])
93
101
  accessor_builder('to_h', {})
94
- json&.each do |k, v|
95
- self.send("#{k}=", v)
102
+ json.each do |k, v|
103
+ send("#{k}=", v)
96
104
  end
97
105
  end
98
106
 
99
107
  def method_missing(name, *args)
100
108
  attribute = name.to_s.start_with?(/\d/) ? "_#{name.to_s}" : name.to_s
101
109
  if attribute =~ /=$/
102
- if args[0].respond_to?(:key?) || args[0].is_a?(Hash)
103
- @to_h[attribute.chop] = self.class.new(args[0])
104
- else
105
- @to_h[attribute.chop] = args[0]
106
- end
110
+ @to_h[attribute.chop] =
111
+ if args[0].respond_to?(:key?) || args[0].is_a?(Hash)
112
+ self.class.new(args[0])
113
+ else
114
+ args[0]
115
+ end
107
116
  else
108
117
  @to_h[attribute]
109
118
  end
110
119
  end
120
+
121
+ def respond_to_missing?; end
122
+
111
123
  end
112
124
 
125
+ # Finest Builder
113
126
  module Builder
114
127
  class Error < StandardError; end
115
128
 
116
129
  include Helper
117
- alias_method :initialize, :build_by_keys
130
+ alias initialize build_by_keys
118
131
  end
119
132
 
120
133
  end
@@ -1,5 +1,5 @@
1
1
  module Finest
2
2
  module Builder
3
- VERSION = "0.0.4"
3
+ VERSION = "1.0.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finest-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduard Garcia Castello
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-29 00:00:00.000000000 Z
11
+ date: 2021-08-17 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description:
13
+ description:
14
14
  email:
15
+ - edugarcas@gmail.com
15
16
  - eduard@rzilient.club
16
17
  executables: []
17
18
  extensions: []
@@ -37,7 +38,7 @@ metadata:
37
38
  homepage_uri: https://github.com/eddygarcas/finest-builder
38
39
  source_code_uri: https://github.com/eddygarcas/finest-builder
39
40
  changelog_uri: https://github.com/eddygarcas/finest-builder
40
- post_install_message:
41
+ post_install_message:
41
42
  rdoc_options: []
42
43
  require_paths:
43
44
  - lib
@@ -52,9 +53,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
53
  - !ruby/object:Gem::Version
53
54
  version: '0'
54
55
  requirements: []
55
- rubygems_version: 3.1.4
56
- signing_key:
56
+ rubygems_version: 3.1.6
57
+ signing_key:
57
58
  specification_version: 4
58
- summary: Builder modules to create either class ghost methods from a given json or
59
- an open struct.
59
+ summary: Builder modules to create either class ghost methods from a given JSON or
60
+ a OpenStruct
60
61
  test_files: []