triad 1.0.0 → 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: 1506f956e5cf2624d48a561a54b55e6a421bd92f5542004eec34df90ebb814a7
4
- data.tar.gz: a090e6814e78240b6081e7e5d6c730751d451c07411d01b9b6149cd84bd00d4e
3
+ metadata.gz: 8d4039aff99f0f7377d3c23e7f634497f2e0af40493a9e4da202b5f73d1746e3
4
+ data.tar.gz: 468e03146649a0fff076569e5d659942f78af0d1aee15e825f3469f1de580eb5
5
5
  SHA512:
6
- metadata.gz: 2d26ec61656145fcedc646b5dafdf0a1cff341cb74e9bee9592d99ed62d1db7e118ec9ed9e791dd85e96cdd7a3192a210a9763476f36d9e3f9cb7f7ee1b74b81
7
- data.tar.gz: 7035ae759c39fd4b1abf78a63b3637d84d69f2dddb0b835e056e49a1a69727e98eb2e37d588f2e24e53fd004e244289d4c3bca562ae689da3e5bb0f23da986b5
6
+ metadata.gz: c9280599c5af2e49ebace1860b3492a0c0dffc0b3a7bc93b0ae335c359f825c35ce602d1030c279e67da2ee89d4261bed26474343d4fb8b385de2527166d3a59
7
+ data.tar.gz: 5c8fcaec38453c0ffa91c1d14952c7d963aa45076bfb1ae0f36542ee873a30852028f3a965b3b0725aa08f13e2e711c5948831bd16138f3b0de7d3ee31d6a7aa
data/Gemfile CHANGED
@@ -1,7 +1,9 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
5
  gem "rake"
6
6
  gem "simplecov"
7
7
  gem "minitest"
8
+ gem "standard"
9
+ gem "reissue"
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013-2016 'Jim Gay'
1
+ Copyright (c) 2013-2025 'Jim Gay'
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # Triad
2
2
 
3
- [![Code Climate](https://codeclimate.com/github/saturnflyer/triad.png)](https://codeclimate.com/github/saturnflyer/triad)
4
- [![Coverage Status](https://coveralls.io/repos/saturnflyer/triad/badge.png)](https://coveralls.io/r/saturnflyer/triad)
5
3
  [![Gem Version](https://badge.fury.io/rb/triad.png)](http://badge.fury.io/rb/triad)
6
4
 
7
5
  A Triad is like a Set, or a collection of three-part arrays.
data/Rakefile CHANGED
@@ -1,12 +1,25 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
- require 'rake/testtask'
3
+ require "rake/testtask"
4
4
 
5
5
  Rake::TestTask.new do |t|
6
- t.libs << 'test'
7
- t.test_files = FileList['test/*_test.rb']
6
+ t.libs << "test"
7
+ t.test_files = FileList["test/*_test.rb"]
8
8
  t.ruby_opts = ["-w"]
9
9
  t.verbose = true
10
10
  end
11
11
 
12
- task :default => :test
12
+ # Configure Reissue for automated versioning and changelog management
13
+ require "reissue/gem"
14
+
15
+ Reissue::Task.create :reissue do |task|
16
+ task.version_file = "lib/triad/version.rb"
17
+ task.changelog_file = "CHANGELOG.md"
18
+ task.version_limit = 2
19
+ task.commit = true
20
+ task.commit_finalize = true
21
+ task.push_finalize = true
22
+ task.fragment = :git
23
+ end
24
+
25
+ task default: :test
data/lib/triad/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Triad
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
data/lib/triad.rb CHANGED
@@ -5,39 +5,42 @@ class Triad
5
5
  include Enumerable
6
6
 
7
7
  class InvalidAddition < StandardError; end
8
+
8
9
  class ItemNotPresent < StandardError; end
9
10
 
10
- # stored as {key => ['Descriptor', value]}
11
+ # stored as {key => {descriptor: 'Descriptor', value: value}}
11
12
  def initialize
12
13
  @storage = Concurrent::Hash.new
14
+ @descriptor_index = Concurrent::Hash.new
15
+ @value_index = Concurrent::Hash.new
13
16
  end
14
- attr_reader :storage
15
- private :storage
17
+ attr_reader :storage, :descriptor_index, :value_index
18
+ private :storage, :descriptor_index, :value_index
16
19
 
17
20
  # Return the keys for a given descriptor or value
18
- def keys(arg=nil)
19
- if arg == nil
21
+ def keys(arg = nil)
22
+ if arg.nil?
20
23
  storage.keys
21
24
  else
22
- with_interest(arg).map{|key, _, _| key }
25
+ with_interest(arg).map { |key, _, _| key }
23
26
  end
24
27
  end
25
28
 
26
29
  # Return the descriptors for a given key or value
27
- def descriptors(arg=nil)
30
+ def descriptors(arg = nil)
28
31
  if arg.nil?
29
- storage.map{|_,(descriptor,_)| descriptor }
32
+ storage.map { |_, data| data[:descriptor] }
30
33
  else
31
- with_interest(arg).map{|_, descriptor, _| descriptor }
34
+ with_interest(arg).map { |_, descriptor, _| descriptor }
32
35
  end
33
36
  end
34
37
 
35
38
  # Return the values for a given key or descriptor
36
- def values(arg=:__no_argument_given__)
39
+ def values(arg = :__no_argument_given__)
37
40
  if arg == :__no_argument_given__
38
- storage.map{|_,(_,value)| value }.uniq
41
+ value_index.keys
39
42
  else
40
- with_interest(arg).map{|_, _, value| value }
43
+ with_interest(arg).map { |_, _, value| value }
41
44
  end
42
45
  end
43
46
 
@@ -50,49 +53,75 @@ class Triad
50
53
 
51
54
  array_descriptor = array.fetch(1)
52
55
  raise InvalidAddition.new("the provided descriptor must be a String") unless array_descriptor.is_a?(String)
53
- array_value = array.fetch(2)
56
+ array_value = array.fetch(2)
54
57
 
55
- storage[array_key] = [array_descriptor, array_value]
58
+ add_to_storage(array_key, array_descriptor, array_value)
56
59
  self
57
60
  end
58
61
 
59
62
  # Alter the descriptor and value in-place for the given key
60
63
  def update(key, descriptor, value)
61
64
  raise InvalidAddition.new("the provided descriptor cannot be nil") if descriptor.nil?
62
- storage[key] = [descriptor, value]
65
+ remove_from_indices(key) if storage.key?(key)
66
+ add_to_storage(key, descriptor, value)
63
67
  end
64
68
 
65
69
  def each
66
- storage.each do |key, (descriptor, value)|
67
- yield key, descriptor, value
70
+ storage.each do |key, data|
71
+ yield key, data[:descriptor], data[:value]
68
72
  end
69
73
  end
70
74
 
71
75
  private
72
76
 
77
+ def add_to_storage(key, descriptor, value)
78
+ storage[key] = { descriptor: descriptor, value: value }
79
+ descriptor_index[descriptor] = (descriptor_index[descriptor] || []) << key
80
+ value_index[value] = (value_index[value] || []) << key
81
+ end
82
+
83
+ def remove_from_indices(key)
84
+ return unless storage.key?(key)
85
+
86
+ data = storage[key]
87
+ descriptor = data[:descriptor]
88
+ value = data[:value]
89
+
90
+ descriptor_index[descriptor]&.delete(key)
91
+ descriptor_index.delete(descriptor) if descriptor_index[descriptor]&.empty?
92
+
93
+ value_index[value]&.delete(key)
94
+ value_index.delete(value) if value_index[value]&.empty?
95
+ end
96
+
73
97
  def key_exists?(key)
74
98
  storage.key?(key)
75
99
  end
76
100
 
77
101
  def descriptor_exists?(descriptor)
78
- storage.values.map{|arr| arr.fetch(0) }.include?(descriptor)
102
+ descriptor_index.key?(descriptor)
79
103
  end
80
104
 
81
105
  def value_exists?(value)
82
- storage.values.map{|arr| arr.fetch(1) }.include?(value)
106
+ value_index.key?(value)
83
107
  end
84
108
 
85
109
  def with_interest(interest)
86
- position = case
87
- when key_exists?(interest) then 0
88
- when descriptor_exists?(interest) then 1
89
- when value_exists?(interest) then 2
90
- else
91
- raise ItemNotPresent.new
92
- end
93
-
94
- storage.select{|key, array|
95
- [key, *array].fetch(position) == interest
96
- }.map{|key, array| [key, *array] }
110
+ if key_exists?(interest)
111
+ data = storage[interest]
112
+ [[interest, data[:descriptor], data[:value]]]
113
+ elsif descriptor_exists?(interest)
114
+ descriptor_index[interest].map do |key|
115
+ data = storage[key]
116
+ [key, data[:descriptor], data[:value]]
117
+ end
118
+ elsif value_exists?(interest)
119
+ value_index[interest].map do |key|
120
+ data = storage[key]
121
+ [key, data[:descriptor], data[:value]]
122
+ end
123
+ else
124
+ raise ItemNotPresent.new
125
+ end
97
126
  end
98
127
  end
data/test/triad_test.rb CHANGED
@@ -1,220 +1,219 @@
1
- require_relative 'test_helper'
1
+ require_relative "test_helper"
2
2
 
3
- describe Triad, '#<<' do
4
- let(:triad){ Triad.new }
3
+ describe Triad, "#<<" do
4
+ let(:triad) { Triad.new }
5
5
 
6
- it 'shovels 3 item arrays' do
7
- assert triad << [:test, 'Test', Object.new]
6
+ it "shovels 3 item arrays" do
7
+ assert triad << [:test, "Test", Object.new]
8
8
  end
9
9
 
10
- it 'rejects arrays with more than 3 items' do
11
- error = assert_raises(Triad::InvalidAddition){
12
- triad << [:test, 'Test', Object.new, 'Other']
10
+ it "rejects arrays with more than 3 items" do
11
+ error = assert_raises(Triad::InvalidAddition) {
12
+ triad << [:test, "Test", Object.new, "Other"]
13
13
  }
14
14
  assert_match(/array length must be 3/, error.message)
15
15
  end
16
16
 
17
- it 'rejects arrays with fewer than 3 items' do
18
- assert_raises(Triad::InvalidAddition){
19
- triad << [:test, 'Test']
17
+ it "rejects arrays with fewer than 3 items" do
18
+ assert_raises(Triad::InvalidAddition) {
19
+ triad << [:test, "Test"]
20
20
  }
21
21
  end
22
22
 
23
- it 'rejects arrays with an existing key' do
24
- triad << [:test, 'Test', Object.new]
25
- error = assert_raises(Triad::InvalidAddition){
26
- triad << [:test, 'More', Object.new]
23
+ it "rejects arrays with an existing key" do
24
+ triad << [:test, "Test", Object.new]
25
+ error = assert_raises(Triad::InvalidAddition) {
26
+ triad << [:test, "More", Object.new]
27
27
  }
28
28
  assert_match(/key already exists/, error.message)
29
29
  end
30
-
31
- it 'accepts strings as values' do
30
+
31
+ it "accepts strings as values" do
32
32
  object = "a string as an value"
33
- triad << [:key, 'Descriptor', object]
33
+ triad << [:key, "Descriptor", object]
34
34
  assert_equal [object], triad.values(:key)
35
35
  end
36
36
 
37
37
  it "rejects keys that are not Symbols" do
38
- error = assert_raises(Triad::InvalidAddition){
38
+ error = assert_raises(Triad::InvalidAddition) {
39
39
  triad << ["key", "Descriptor", Object.new]
40
40
  }
41
41
  assert_match(/must be a Symbol/, error.message)
42
42
  end
43
43
 
44
44
  it "rejects descriptors that are not Strings" do
45
- error = assert_raises(Triad::InvalidAddition){
45
+ error = assert_raises(Triad::InvalidAddition) {
46
46
  triad << [:key, :Descriptor, Object.new]
47
47
  }
48
48
  assert_match(/must be a String/, error.message)
49
49
  end
50
50
  end
51
51
 
52
- describe Triad, '#update' do
53
- let(:triad){ Triad.new }
52
+ describe Triad, "#update" do
53
+ let(:triad) { Triad.new }
54
54
 
55
- it 'updates a descriptor and object for the given key' do
55
+ it "updates a descriptor and object for the given key" do
56
56
  object = Object.new
57
- triad << [:test, 'Test', object]
58
- assert_equal ['Test'], triad.descriptors(:test)
59
- triad.update(:test, 'Updated', Object.new)
60
- assert_equal ['Updated'], triad.descriptors(:test)
57
+ triad << [:test, "Test", object]
58
+ assert_equal ["Test"], triad.descriptors(:test)
59
+ triad.update(:test, "Updated", Object.new)
60
+ assert_equal ["Updated"], triad.descriptors(:test)
61
61
  end
62
62
 
63
63
  it "allows a nil object" do
64
- triad << [:test, 'Test', nil]
65
- assert_equal ['Test'], triad.descriptors(:test)
66
- triad.update(:test, 'Updated', nil)
67
- assert_equal ['Updated'], triad.descriptors(:test)
64
+ triad << [:test, "Test", nil]
65
+ assert_equal ["Test"], triad.descriptors(:test)
66
+ triad.update(:test, "Updated", nil)
67
+ assert_equal ["Updated"], triad.descriptors(:test)
68
68
  end
69
69
 
70
70
  it "does not allow a nil descriptor" do
71
- err = assert_raises(Triad::InvalidAddition){
71
+ err = assert_raises(Triad::InvalidAddition) {
72
72
  triad.update(:test, nil, Object.new)
73
73
  }
74
74
  assert_equal "the provided descriptor cannot be nil", err.message
75
75
  end
76
76
  end
77
77
 
78
- describe Triad, '#keys' do
79
- let(:user){ Object.new }
80
- let(:triad){
78
+ describe Triad, "#keys" do
79
+ let(:user) { Object.new }
80
+ let(:triad) {
81
81
  tri = Triad.new
82
- tri << [:admin, 'Admin', user]
82
+ tri << [:admin, "Admin", user]
83
83
  tri
84
84
  }
85
85
 
86
- it 'returns the key for the given descriptor' do
87
- assert_equal [:admin], triad.keys('Admin')
86
+ it "returns the key for the given descriptor" do
87
+ assert_equal [:admin], triad.keys("Admin")
88
88
  end
89
89
 
90
- it 'returns the key for the given value' do
90
+ it "returns the key for the given value" do
91
91
  assert_equal [:admin], triad.keys(user)
92
92
  end
93
93
 
94
- it 'returns the keys for the given key' do
94
+ it "returns the keys for the given key" do
95
95
  assert_equal [:admin], triad.keys(:admin)
96
96
  end
97
97
 
98
- it 'returns all keys when given no argument' do
99
- triad << [:other, 'Other', user]
98
+ it "returns all keys when given no argument" do
99
+ triad << [:other, "Other", user]
100
100
  assert_equal [:admin, :other], triad.keys
101
101
  end
102
102
 
103
- it 'errors when the given key is not found' do
104
- assert_raises(Triad::ItemNotPresent){
103
+ it "errors when the given key is not found" do
104
+ assert_raises(Triad::ItemNotPresent) {
105
105
  triad.keys(:invalid_key)
106
106
  }
107
107
  end
108
108
 
109
- it 'errors when the given descriptor is not found' do
110
- assert_raises(Triad::ItemNotPresent){
111
- triad.keys('Invalid Descriptor')
109
+ it "errors when the given descriptor is not found" do
110
+ assert_raises(Triad::ItemNotPresent) {
111
+ triad.keys("Invalid Descriptor")
112
112
  }
113
113
  end
114
114
 
115
- it 'errors when the given value is not found' do
116
- assert_raises(Triad::ItemNotPresent){
115
+ it "errors when the given value is not found" do
116
+ assert_raises(Triad::ItemNotPresent) {
117
117
  triad.keys(Object.new)
118
118
  }
119
119
  end
120
120
  end
121
121
 
122
- describe Triad, '#descriptors' do
123
- let(:user){ Object.new }
124
- let(:triad){
122
+ describe Triad, "#descriptors" do
123
+ let(:user) { Object.new }
124
+ let(:triad) {
125
125
  tri = Triad.new
126
- tri << [:admin, 'Admin', user]
126
+ tri << [:admin, "Admin", user]
127
127
  tri
128
128
  }
129
129
 
130
- it 'returns the descriptor for the given key' do
131
- assert_equal ['Admin'], triad.descriptors(:admin)
130
+ it "returns the descriptor for the given key" do
131
+ assert_equal ["Admin"], triad.descriptors(:admin)
132
132
  end
133
133
 
134
- it 'returns the descriptor for the given value' do
135
- assert_equal ['Admin'], triad.descriptors(user)
134
+ it "returns the descriptor for the given value" do
135
+ assert_equal ["Admin"], triad.descriptors(user)
136
136
  end
137
137
 
138
- it 'returns the descriptors for the given descriptor' do
139
- assert_equal ['Admin'], triad.descriptors('Admin')
138
+ it "returns the descriptors for the given descriptor" do
139
+ assert_equal ["Admin"], triad.descriptors("Admin")
140
140
  end
141
141
 
142
- it 'returns all descriptors when given no argument' do
143
- triad << [:other, 'Other', user]
144
- assert_equal ['Admin', 'Other'], triad.descriptors
142
+ it "returns all descriptors when given no argument" do
143
+ triad << [:other, "Other", user]
144
+ assert_equal ["Admin", "Other"], triad.descriptors
145
145
  end
146
146
 
147
- it 'errors when the given descriptor is not found' do
148
- assert_raises(Triad::ItemNotPresent){
149
- triad.descriptors('Not Present')
147
+ it "errors when the given descriptor is not found" do
148
+ assert_raises(Triad::ItemNotPresent) {
149
+ triad.descriptors("Not Present")
150
150
  }
151
151
  end
152
152
 
153
- it 'errors when the given key is not found' do
154
- assert_raises(Triad::ItemNotPresent){
153
+ it "errors when the given key is not found" do
154
+ assert_raises(Triad::ItemNotPresent) {
155
155
  triad.descriptors(:invalid_key)
156
156
  }
157
157
  end
158
158
 
159
- it 'errors when the given value is not found' do
160
- assert_raises(Triad::ItemNotPresent){
159
+ it "errors when the given value is not found" do
160
+ assert_raises(Triad::ItemNotPresent) {
161
161
  triad.descriptors(Object.new)
162
162
  }
163
163
  end
164
164
 
165
- it 'assumes nil is a value' do
166
- triad.update(:admin, 'Admin', nil)
167
- assert_equal ['Admin'], triad.descriptors(:admin)
165
+ it "assumes nil is a value" do
166
+ triad.update(:admin, "Admin", nil)
167
+ assert_equal ["Admin"], triad.descriptors(:admin)
168
168
  end
169
169
  end
170
170
 
171
- describe Triad, '#values' do
172
- let(:user){ Object.new }
173
- let(:triad){
171
+ describe Triad, "#values" do
172
+ let(:user) { Object.new }
173
+ let(:triad) {
174
174
  tri = Triad.new
175
- tri << [:admin, 'Admin', user]
175
+ tri << [:admin, "Admin", user]
176
176
  tri
177
177
  }
178
178
 
179
- it 'returns the value for the given key' do
179
+ it "returns the value for the given key" do
180
180
  assert_equal [user], triad.values(:admin)
181
181
  end
182
182
 
183
- it 'returns the value for the given descriptor' do
184
- assert_equal [user], triad.values('Admin')
183
+ it "returns the value for the given descriptor" do
184
+ assert_equal [user], triad.values("Admin")
185
185
  end
186
186
 
187
- it 'returns all values when given no argument' do
188
- triad << [:other, 'Other', user]
187
+ it "returns all values when given no argument" do
188
+ triad << [:other, "Other", user]
189
189
  assert_equal [user], triad.values
190
190
  end
191
191
 
192
-
193
- it 'errors when the given key is not found' do
194
- assert_raises(Triad::ItemNotPresent){
192
+ it "errors when the given key is not found" do
193
+ assert_raises(Triad::ItemNotPresent) {
195
194
  triad.values(:invalid_key)
196
195
  }
197
196
  end
198
197
 
199
- it 'errors when the given descriptor is not found' do
200
- assert_raises(Triad::ItemNotPresent){
201
- triad.values('Invalid Descriptor')
198
+ it "errors when the given descriptor is not found" do
199
+ assert_raises(Triad::ItemNotPresent) {
200
+ triad.values("Invalid Descriptor")
202
201
  }
203
202
  end
204
203
  end
205
204
 
206
- describe Triad, 'enumeration' do
207
- let(:user){ Object.new }
208
- let(:triad){
205
+ describe Triad, "enumeration" do
206
+ let(:user) { Object.new }
207
+ let(:triad) {
209
208
  tri = Triad.new
210
- tri << [:admin, 'Admin', user]
209
+ tri << [:admin, "Admin", user]
211
210
  tri
212
211
  }
213
- it 'yields each triad as 3 block variables' do
214
- result = ''
212
+ it "yields each triad as 3 block variables" do
213
+ result = ""
215
214
  triad.each do |key, descriptor, value|
216
215
  result << "key: #{key}, descriptor: #{descriptor}, value: #{value.class.name}"
217
216
  end
218
- assert_equal 'key: admin, descriptor: Admin, value: Object', result
217
+ assert_equal "key: admin, descriptor: Admin, value: Object", result
219
218
  end
220
219
  end
data/triad.gemspec CHANGED
@@ -1,21 +1,19 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'triad/version'
3
+ require "triad/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "triad"
8
- spec.version = Triad::VERSION
9
- spec.authors = ["'Jim Gay'"]
10
- spec.email = ["jim@saturnflyer.com"]
11
- spec.description = %q{Triad allows you to access data from keys, descriptors, and values}
12
- spec.summary = %q{Manage a collection with 3 data points}
13
- spec.homepage = "https://github.com/saturnflyer/triad"
14
- spec.license = "MIT"
6
+ spec.name = "triad"
7
+ spec.version = Triad::VERSION
8
+ spec.authors = ["'Jim Gay'"]
9
+ spec.email = ["jim@saturnflyer.com"]
10
+ spec.description = "Triad allows you to access data from keys, descriptors, and values"
11
+ spec.summary = "Manage a collection with 3 data points"
12
+ spec.homepage = "https://github.com/saturnflyer/triad"
13
+ spec.license = "MIT"
15
14
 
16
- spec.files = Dir['lib/**/*'] + %w[ Gemfile LICENSE.txt README.md Rakefile triad.gemspec test/triad_test.rb ]
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.files = Dir["lib/**/*"] + %w[Gemfile LICENSE.txt README.md Rakefile triad.gemspec test/triad_test.rb]
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
17
  spec.require_paths = ["lib"]
20
18
 
21
19
  spec.add_dependency "concurrent-ruby", "> 0.9"
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: triad
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - "'Jim Gay'"
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2022-08-19 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: concurrent-ruby
@@ -43,7 +42,6 @@ homepage: https://github.com/saturnflyer/triad
43
42
  licenses:
44
43
  - MIT
45
44
  metadata: {}
46
- post_install_message:
47
45
  rdoc_options: []
48
46
  require_paths:
49
47
  - lib
@@ -58,9 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
56
  - !ruby/object:Gem::Version
59
57
  version: '0'
60
58
  requirements: []
61
- rubygems_version: 3.3.17
62
- signing_key:
59
+ rubygems_version: 3.7.2
63
60
  specification_version: 4
64
61
  summary: Manage a collection with 3 data points
65
- test_files:
66
- - test/triad_test.rb
62
+ test_files: []