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 +4 -4
- data/Gemfile +3 -1
- data/LICENSE.txt +1 -1
- data/README.md +0 -2
- data/Rakefile +17 -4
- data/lib/triad/version.rb +1 -1
- data/lib/triad.rb +59 -30
- data/test/triad_test.rb +93 -94
- data/triad.gemspec +12 -14
- metadata +4 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d4039aff99f0f7377d3c23e7f634497f2e0af40493a9e4da202b5f73d1746e3
|
4
|
+
data.tar.gz: 468e03146649a0fff076569e5d659942f78af0d1aee15e825f3469f1de580eb5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9280599c5af2e49ebace1860b3492a0c0dffc0b3a7bc93b0ae335c359f825c35ce602d1030c279e67da2ee89d4261bed26474343d4fb8b385de2527166d3a59
|
7
|
+
data.tar.gz: 5c8fcaec38453c0ffa91c1d14952c7d963aa45076bfb1ae0f36542ee873a30852028f3a965b3b0725aa08f13e2e711c5948831bd16138f3b0de7d3ee31d6a7aa
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# Triad
|
2
2
|
|
3
|
-
[](https://codeclimate.com/github/saturnflyer/triad)
|
4
|
-
[](https://coveralls.io/r/saturnflyer/triad)
|
5
3
|
[](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
|
3
|
+
require "rake/testtask"
|
4
4
|
|
5
5
|
Rake::TestTask.new do |t|
|
6
|
-
t.libs <<
|
7
|
-
t.test_files = FileList[
|
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
|
-
|
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
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 =>
|
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
|
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{|_,
|
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
|
39
|
+
def values(arg = :__no_argument_given__)
|
37
40
|
if arg == :__no_argument_given__
|
38
|
-
|
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 =
|
56
|
+
array_value = array.fetch(2)
|
54
57
|
|
55
|
-
|
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
|
-
|
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,
|
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
|
-
|
102
|
+
descriptor_index.key?(descriptor)
|
79
103
|
end
|
80
104
|
|
81
105
|
def value_exists?(value)
|
82
|
-
|
106
|
+
value_index.key?(value)
|
83
107
|
end
|
84
108
|
|
85
109
|
def with_interest(interest)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
[
|
96
|
-
|
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
|
1
|
+
require_relative "test_helper"
|
2
2
|
|
3
|
-
describe Triad,
|
4
|
-
let(:triad){ Triad.new }
|
3
|
+
describe Triad, "#<<" do
|
4
|
+
let(:triad) { Triad.new }
|
5
5
|
|
6
|
-
it
|
7
|
-
assert triad << [:test,
|
6
|
+
it "shovels 3 item arrays" do
|
7
|
+
assert triad << [:test, "Test", Object.new]
|
8
8
|
end
|
9
9
|
|
10
|
-
it
|
11
|
-
error = assert_raises(Triad::InvalidAddition){
|
12
|
-
triad << [:test,
|
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
|
18
|
-
assert_raises(Triad::InvalidAddition){
|
19
|
-
triad << [: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
|
24
|
-
triad << [:test,
|
25
|
-
error = assert_raises(Triad::InvalidAddition){
|
26
|
-
triad << [:test,
|
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
|
30
|
+
|
31
|
+
it "accepts strings as values" do
|
32
32
|
object = "a string as an value"
|
33
|
-
triad << [:key,
|
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,
|
53
|
-
let(:triad){ Triad.new }
|
52
|
+
describe Triad, "#update" do
|
53
|
+
let(:triad) { Triad.new }
|
54
54
|
|
55
|
-
it
|
55
|
+
it "updates a descriptor and object for the given key" do
|
56
56
|
object = Object.new
|
57
|
-
triad << [:test,
|
58
|
-
assert_equal [
|
59
|
-
triad.update(:test,
|
60
|
-
assert_equal [
|
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,
|
65
|
-
assert_equal [
|
66
|
-
triad.update(:test,
|
67
|
-
assert_equal [
|
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,
|
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,
|
82
|
+
tri << [:admin, "Admin", user]
|
83
83
|
tri
|
84
84
|
}
|
85
85
|
|
86
|
-
it
|
87
|
-
assert_equal [:admin], triad.keys(
|
86
|
+
it "returns the key for the given descriptor" do
|
87
|
+
assert_equal [:admin], triad.keys("Admin")
|
88
88
|
end
|
89
89
|
|
90
|
-
it
|
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
|
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
|
99
|
-
triad << [:other,
|
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
|
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
|
110
|
-
assert_raises(Triad::ItemNotPresent){
|
111
|
-
triad.keys(
|
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
|
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,
|
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,
|
126
|
+
tri << [:admin, "Admin", user]
|
127
127
|
tri
|
128
128
|
}
|
129
129
|
|
130
|
-
it
|
131
|
-
assert_equal [
|
130
|
+
it "returns the descriptor for the given key" do
|
131
|
+
assert_equal ["Admin"], triad.descriptors(:admin)
|
132
132
|
end
|
133
133
|
|
134
|
-
it
|
135
|
-
assert_equal [
|
134
|
+
it "returns the descriptor for the given value" do
|
135
|
+
assert_equal ["Admin"], triad.descriptors(user)
|
136
136
|
end
|
137
137
|
|
138
|
-
it
|
139
|
-
assert_equal [
|
138
|
+
it "returns the descriptors for the given descriptor" do
|
139
|
+
assert_equal ["Admin"], triad.descriptors("Admin")
|
140
140
|
end
|
141
141
|
|
142
|
-
it
|
143
|
-
triad << [:other,
|
144
|
-
assert_equal [
|
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
|
148
|
-
assert_raises(Triad::ItemNotPresent){
|
149
|
-
triad.descriptors(
|
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
|
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
|
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
|
166
|
-
triad.update(:admin,
|
167
|
-
assert_equal [
|
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,
|
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,
|
175
|
+
tri << [:admin, "Admin", user]
|
176
176
|
tri
|
177
177
|
}
|
178
178
|
|
179
|
-
it
|
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
|
184
|
-
assert_equal [user], triad.values(
|
183
|
+
it "returns the value for the given descriptor" do
|
184
|
+
assert_equal [user], triad.values("Admin")
|
185
185
|
end
|
186
186
|
|
187
|
-
it
|
188
|
-
triad << [:other,
|
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
|
-
|
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
|
200
|
-
assert_raises(Triad::ItemNotPresent){
|
201
|
-
triad.values(
|
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,
|
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,
|
209
|
+
tri << [:admin, "Admin", user]
|
211
210
|
tri
|
212
211
|
}
|
213
|
-
it
|
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
|
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
|
-
|
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
|
3
|
+
require "triad/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
11
|
-
spec.description
|
12
|
-
spec.summary
|
13
|
-
spec.homepage
|
14
|
-
spec.license
|
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
|
17
|
-
spec.executables
|
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.
|
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:
|
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.
|
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: []
|