ofstruct 0.3.0 → 0.3.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: 532001ebb13a0232881e6b2a97c742f761df39e5a9ce99a7bb74da2c9300f400
4
- data.tar.gz: 687b0b422e10f97696d6d0091d761afd94e5a81ec38932f5ce7b80fe7f22fece
3
+ metadata.gz: d651a8d4353c6ce27531f7da77ae5fc04cc77562779587957b5b79f4c1138ead
4
+ data.tar.gz: c4680069d8296d8117d7f07d1dbcefc6c21db09555d6bf7199a888c8d901b9cb
5
5
  SHA512:
6
- metadata.gz: 2590e8f5c16a4f20e6ecc3a872f87e4c2822f4662e26d09f5a9998b6952627fb0267b40257b35fd858f80855937c293e21a9ea320cbd340ca59e173b82632de0
7
- data.tar.gz: 35d64b5a9b08aa459c9d0b00317f53f1c7211eda342bdfcc8c0ca2378cc64d279f716cfb02089454df77b25ff16f2fc0b205fb603d68ccb8e60f2eea0bf1bf58
6
+ metadata.gz: 4c340dc7e9e8485888a4ee55cf7060d27b7b8a97d12acdd886a87ab6c7d1c2dd8e7dd91e5f70536200dd5e89b860e8d1e5c6e6b17780f41f468de20c09937efa
7
+ data.tar.gz: 55a42e5035ff0262ccfb8c8650911b31afdeccc2ed6fb9b4c429e2ca99417945c3f61f122598b29ca06acd002f9abad6e1be40b5f35bc09bd965540608ffe403
data/lib/ofstruct.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class OpenFastStruct
2
4
  def initialize(args = {})
3
5
  @members = {}
@@ -14,24 +16,33 @@ class OpenFastStruct
14
16
 
15
17
  def update(args)
16
18
  ensure_hash!(args)
17
- args.each { |k, v| assign(k, v) }
19
+ args.each { |key, value| assign(key, value) }
18
20
  end
19
21
 
20
22
  def to_h
21
- @members.merge(@members) { |_, v| v.is_a?(self.class) ? v.to_h : v }
23
+ @members.merge(@members) do |_, value|
24
+ case value
25
+ when Array
26
+ value.map(&:to_h)
27
+ when self.class
28
+ value.to_h
29
+ else
30
+ value
31
+ end
32
+ end
22
33
  end
23
34
 
24
35
  def inspect
25
- "#<#{self.class}" + @members.map { |k, v| " :#{k}=#{v.inspect}" }.join + ">"
36
+ "#<#{self.class}#{@members.map { |key, value| " :#{key}=#{value.inspect}" }.join}>"
26
37
  end
27
- alias :to_s :inspect
38
+ alias to_s inspect
28
39
 
29
40
  def to_ary
30
41
  nil
31
42
  end
32
43
 
33
44
  def ==(other)
34
- other.is_a?(self.class) && self.to_h == other.to_h
45
+ other.is_a?(self.class) && to_h == other.to_h
35
46
  end
36
47
 
37
48
  private
@@ -51,10 +62,17 @@ class OpenFastStruct
51
62
  end
52
63
 
53
64
  def assign(key, value)
54
- if value.is_a?(Hash)
55
- @members[key.to_sym] = self.class.new(value)
65
+ @members[key.to_sym] = process(value)
66
+ end
67
+
68
+ def process(data)
69
+ case data
70
+ when Hash
71
+ self.class.new(data)
72
+ when Array
73
+ data.map { |element| process(element) }
56
74
  else
57
- @members[key.to_sym] = value
75
+ data
58
76
  end
59
77
  end
60
78
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ofstruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arturo Herrero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-18 00:00:00.000000000 Z
11
+ date: 2023-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -66,6 +66,48 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.44'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.44'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.18'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.18'
69
111
  description: OpenFastStruct is a data structure, similar to an OpenStruct but faster.
70
112
  email: arturo.herrero@gmail.com
71
113
  executables: []
@@ -75,12 +117,11 @@ files:
75
117
  - LICENSE
76
118
  - README.md
77
119
  - lib/ofstruct.rb
78
- - spec/lib/ofstruct_spec.rb
79
- - spec/spec_helper.rb
80
120
  homepage: https://github.com/arturoherrero/ofstruct
81
121
  licenses:
82
122
  - MIT
83
- metadata: {}
123
+ metadata:
124
+ rubygems_mfa_required: 'true'
84
125
  post_install_message:
85
126
  rdoc_options: []
86
127
  require_paths:
@@ -89,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
130
  requirements:
90
131
  - - ">="
91
132
  - !ruby/object:Gem::Version
92
- version: 2.0.0
133
+ version: '3.0'
93
134
  required_rubygems_version: !ruby/object:Gem::Requirement
94
135
  requirements:
95
136
  - - ">="
@@ -100,6 +141,4 @@ rubygems_version: 3.4.1
100
141
  signing_key:
101
142
  specification_version: 4
102
143
  summary: OpenFastStruct
103
- test_files:
104
- - spec/lib/ofstruct_spec.rb
105
- - spec/spec_helper.rb
144
+ test_files: []
@@ -1,151 +0,0 @@
1
- require "ofstruct"
2
-
3
- RSpec.describe OpenFastStruct do
4
- subject(:ofstruct) { described_class.new }
5
-
6
- it "can be instantiated with no arguments" do
7
- expect(ofstruct).to be_a(described_class)
8
- end
9
-
10
- it "works accessor" do
11
- ofstruct.name = "John"
12
- expect(ofstruct.name).to eq("John")
13
- end
14
-
15
- it "works recursive accessor" do
16
- ofstruct.user.name = "John"
17
- expect(ofstruct.user.name).to eq("John")
18
- end
19
-
20
- it "works with unexisting values" do
21
- expect(ofstruct.name).to be_a(described_class)
22
- end
23
-
24
- it "equals to other with same attributes" do
25
- ofstruct.user.name = "John"
26
- other_ofstruct = described_class.new
27
- other_ofstruct.user.name = "John"
28
- expect(ofstruct).to eq(other_ofstruct)
29
- end
30
-
31
- context "instantiated from arguments" do
32
- subject(:ofstruct) { described_class.new(args) }
33
-
34
- context "without hash" do
35
- let(:args) { double }
36
-
37
- it "raises an exception" do
38
- expect { ofstruct }.to raise_error(ArgumentError)
39
- end
40
- end
41
-
42
- context "with hash" do
43
- let(:symbol_args) { { :name => "John" } }
44
- let(:string_args) { { "name" => "John" } }
45
- let(:nested_args) { { person: { name: "John" } } }
46
-
47
- context "with a nested hash" do
48
- let(:args) { nested_args }
49
-
50
- it "works with reader" do
51
- expect(ofstruct.person.name).to eq("John")
52
- end
53
- end
54
-
55
- context "with symbol keys" do
56
- let(:args) { symbol_args }
57
-
58
- it "works with reader" do
59
- expect(ofstruct.name).to eq("John")
60
- end
61
-
62
- it "works accessor" do
63
- ofstruct.name = "John Smith"
64
- expect(ofstruct.name).to eq("John Smith")
65
- end
66
-
67
- describe "#delete_field" do
68
- it "removes the named key" do
69
- ofstruct.delete_field(:name)
70
- expect(ofstruct.name).to be_a(described_class)
71
- end
72
- end
73
-
74
- describe "#each_pair" do
75
- it "yields all keys with the values" do
76
- expect(ofstruct.each_pair.to_a).to eq([[:name, "John"]])
77
- end
78
-
79
- it "returns an enumerator" do
80
- expect(ofstruct.each_pair).to be_a(Enumerator)
81
- end
82
- end
83
-
84
- describe "#update" do
85
- it "overwrite previous keys" do
86
- ofstruct.update(:name => "John Smith")
87
- expect(ofstruct.name).to eq("John Smith")
88
- end
89
-
90
- it "adds new keys" do
91
- ofstruct.update(:surname => "Smith")
92
- expect(ofstruct.name).to eq("John")
93
- expect(ofstruct.surname).to eq("Smith")
94
- end
95
-
96
- context "without hash" do
97
- it "raises an exception" do
98
- expect { ofstruct.update(double) }.to raise_error(ArgumentError)
99
- end
100
- end
101
- end
102
-
103
- describe "#to_h" do
104
- it "converts to a hash" do
105
- expect(ofstruct.to_h).to eq(args)
106
- end
107
-
108
- it "converts to a hash with chained attributes" do
109
- ofstruct.address.street = "Sunset Boulevar"
110
- ofstruct.address.number = 4
111
- expect(ofstruct.to_h).to eq(
112
- {
113
- :name => "John",
114
- :address => {
115
- :street => "Sunset Boulevar",
116
- :number => 4,
117
- }
118
- }
119
- )
120
- end
121
- end
122
-
123
- describe "#inspect" do
124
- it "returns the human-readable representation" do
125
- expect(ofstruct.inspect).to eq('#<OpenFastStruct :name="John">')
126
- end
127
- end
128
- end
129
-
130
- context "with string keys" do
131
- let(:args) { string_args }
132
-
133
- it "works with reader" do
134
- expect(ofstruct.name).to eq("John")
135
- end
136
-
137
- describe "#to_h" do
138
- it "converts to a hash with keys as symbols" do
139
- expect(ofstruct.to_h).to eq(symbol_args)
140
- end
141
- end
142
-
143
- describe "#inspect" do
144
- it "returns the human-readable representation" do
145
- expect(ofstruct.inspect).to eq('#<OpenFastStruct :name="John">')
146
- end
147
- end
148
- end
149
- end
150
- end
151
- end
data/spec/spec_helper.rb DELETED
@@ -1,18 +0,0 @@
1
- RSpec.configure do |config|
2
- config.expect_with :rspec do |expectations|
3
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
4
- end
5
-
6
- config.mock_with :rspec do |mocks|
7
- mocks.verify_partial_doubles = true
8
- end
9
-
10
- config.disable_monkey_patching!
11
-
12
- if config.files_to_run.one?
13
- config.default_formatter = 'doc'
14
- end
15
-
16
- config.order = :random
17
- Kernel.srand config.seed
18
- end