arborist 0.1.0 → 0.2.0.pre20170519125456

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,15 +7,10 @@ require 'arborist/monitor_runner'
7
7
 
8
8
  describe Arborist::MonitorRunner do
9
9
 
10
- let( :zmq_loop ) { instance_double(ZMQ::Loop) }
11
10
  let( :req_socket ) { instance_double(ZMQ::Socket::Req) }
12
- let( :pollitem ) { instance_double(ZMQ::Pollitem) }
13
11
 
14
- let( :runner ) do
15
- obj = described_class.new
16
- obj.reactor = zmq_loop
17
- obj
18
- end
12
+ let( :reactor ) { instance_double(CZTop::Reactor) }
13
+ let( :runner ) { described_class.new }
19
14
 
20
15
  let( :monitor_class ) { Class.new(Arborist::Monitor) }
21
16
 
@@ -24,6 +19,26 @@ describe Arborist::MonitorRunner do
24
19
  let( :mon3 ) { monitor_class.new("testing monitor3", :testing) }
25
20
  let( :monitors ) {[ mon1, mon2, mon3 ]}
26
21
 
22
+ let( :node_tree ) {{
23
+ 'router' => {
24
+ 'addresses' => ['10.2.1.2', '1.2.3.4']
25
+ },
26
+ 'server' => {
27
+ 'addresses' => ['10.2.1.118']
28
+ }
29
+ }}
30
+ let( :ping_monitor_data ) {{
31
+ 'router' => {'ping' => { 'rtt' => 22 }},
32
+ 'server' => {'ping' => { 'rtt' => 8 }},
33
+ }}
34
+
35
+
36
+ before( :each ) do
37
+ allow( CZTop::Reactor ).to receive( :new ).and_return( reactor )
38
+ allow( reactor ).to receive( :register )
39
+ allow( reactor ).to receive( :unregister )
40
+ end
41
+
27
42
 
28
43
  it "can load monitors from an enumerator that yields Arborist::Monitors" do
29
44
  runner.load_monitors([ mon1, mon2, mon3 ])
@@ -33,27 +48,11 @@ describe Arborist::MonitorRunner do
33
48
 
34
49
  describe "a runner with loaded monitors" do
35
50
 
36
- before( :each ) do
37
- allow( zmq_loop ).to receive( :register ).with( an_instance_of(ZMQ::Pollitem) )
38
- end
39
-
40
-
41
51
  it "registers its monitors to run on an interval and starts the ZMQ loop when run" do
42
52
  runner.monitors.replace([ mon1 ])
43
53
 
44
- interval_timer = instance_double( ZMQ::Timer )
45
- expect( ZMQ::Timer ).to receive( :new ) do |i_delay, i_repeat, &i_block|
46
- expect( i_delay ).to eq( mon1.interval )
47
- expect( i_repeat ).to eq( 0 )
48
-
49
- expect( runner.handler ).to receive( :run_monitor ).with( mon1 )
50
-
51
- i_block.call
52
- interval_timer
53
- end
54
-
55
- expect( zmq_loop ).to receive( :register_timer ).with( interval_timer )
56
- expect( zmq_loop ).to receive( :start )
54
+ expect( reactor ).to receive( :add_periodic_timer ).with( mon1.interval )
55
+ expect( reactor ).to receive( :start_polling )
57
56
 
58
57
  runner.run
59
58
  end
@@ -62,87 +61,46 @@ describe Arborist::MonitorRunner do
62
61
  it "delays registration of its interval timer if a monitor has a splay" do
63
62
  runner.monitors.replace([ mon2 ])
64
63
 
65
- interval_timer = instance_double( ZMQ::Timer )
66
- expect( ZMQ::Timer ).to receive( :new ).with( mon2.interval, 0 ).
67
- and_return( interval_timer )
68
-
69
- timer = instance_double( ZMQ::Timer )
70
- expect( ZMQ::Timer ).to receive( :new ) do |delay, repeat, &block|
71
- expect( delay ).to be >= 0
72
- expect( delay ).to be <= mon2.splay
73
- expect( repeat ).to eq( 1 )
74
-
75
- block.call
76
- timer
77
- end
78
-
79
- expect( zmq_loop ).to receive( :register_timer ).with( interval_timer )
80
- expect( zmq_loop ).to receive( :register_timer ).with( timer )
81
- expect( zmq_loop ).to receive( :start )
64
+ expect( reactor ).to receive( :add_oneshot_timer ).
65
+ with( a_value_between(0, mon2.splay) ).and_yield
66
+ expect( reactor ).to receive( :add_periodic_timer ).with( mon2.interval )
67
+ expect( reactor ).to receive( :start_polling )
82
68
 
83
69
  runner.run
84
70
  end
85
71
 
86
- end
87
-
88
-
89
- describe Arborist::MonitorRunner::Handler do
90
-
91
- let( :tree_api_handler ) { Arborist::Manager::TreeAPI.new(:pollable, :manager) }
92
-
93
- let( :handler ) { described_class.new( zmq_loop ) }
94
-
95
- let( :node_tree ) {{
96
- 'router' => {
97
- 'addresses' => ['10.2.1.2', '1.2.3.4']
98
- },
99
- 'server' => {
100
- 'addresses' => ['10.2.1.118']
101
- }
102
- }}
103
- let( :ping_monitor_data ) {{
104
- 'router' => {'ping' => { 'rtt' => 22 }},
105
- 'server' => {'ping' => { 'rtt' => 8 }},
106
- }}
107
-
108
72
 
109
73
  it "can run a monitor using async ZMQ IO" do
110
- expect( zmq_loop ).to receive( :register ).with( handler.pollitem )
111
74
 
112
75
  # Queue up the monitor requests and register the socket as wanting to write
113
76
  mon1.exec do |nodes|
114
77
  ping_monitor_data
115
78
  end
116
- expect {
117
- handler.run_monitor( mon1 )
118
- }.to change { handler.registered? }.from( false ).to( true )
119
79
 
120
80
  # Fetch
121
- request = handler.client.make_fetch_request(
81
+ request = runner.client.make_fetch_request(
122
82
  mon1.positive_criteria,
123
83
  include_down: false,
124
84
  properties: mon1.node_properties
125
85
  )
126
- response = tree_api_handler.successful_response( node_tree )
86
+ response = Arborist::TreeAPI.successful_response( node_tree )
127
87
 
128
- expect( handler.client.tree_api ).to receive( :send ).with( request )
129
- expect( handler.client.tree_api ).to receive( :recv ).and_return( response )
88
+ expect( runner.client.tree_api ).to receive( :send ).with( request )
89
+ expect( runner.client.tree_api ).to receive( :recv ).and_return( response )
130
90
 
131
- expect {
132
- handler.on_writable
133
- }.to_not change { handler.registered? }
91
+ runner.reactor.poll_once
134
92
 
135
93
  # Update
136
- request = handler.client.make_update_request( ping_monitor_data )
137
- response = tree_api_handler.successful_response( nil )
138
- expect( handler.client.tree_api ).to receive( :send ).with( request )
139
- expect( handler.client.tree_api ).to receive( :recv ).and_return( response )
94
+ request = runner.client.make_update_request( ping_monitor_data )
95
+ response = Arborist::TreeAPI.successful_response( nil )
96
+ expect( runner.client.tree_api ).to receive( :send ).with( request )
97
+ expect( runner.client.tree_api ).to receive( :recv ).and_return( response )
140
98
 
141
99
  # Unregister
142
- expect( zmq_loop ).to receive( :remove ).with( handler.pollitem )
100
+ expect( zmq_loop ).to receive( :remove ).with( runner.pollitem )
143
101
  expect {
144
- handler.on_writable
145
- }.to change { handler.registered? }.from( true ).to( false )
102
+ runner.on_writable
103
+ }.to change { runner.registered? }.from( true ).to( false )
146
104
 
147
105
  end
148
106
 
@@ -159,23 +117,25 @@ describe Arborist::MonitorRunner do
159
117
  nodes = { 'test1' => {}, 'test2' => {} }
160
118
  monitor_results = { 'test1' => {ping: {rtt: 1}}, 'test2' => {ping: {rtt: 8}} }
161
119
 
162
- expect( handler ).to receive( :fetch ).
120
+ expect( runner ).to receive( :fetch ).
163
121
  with( {type: 'host'}, false, [:addresses], {} ).
164
122
  and_yield( nodes )
165
123
 
166
124
  expect( monitor ).to receive( :run ).with( nodes ).
167
125
  and_return( monitor_results )
168
126
 
169
- expect( handler ).to receive( :update ).
127
+ expect( runner ).to receive( :update ).
170
128
  with({
171
129
  "test1"=>{:ping=>{:rtt=>1}, "_monitor_key"=>:test},
172
130
  "test2"=>{:ping=>{:rtt=>8}, "_monitor_key"=>:test}
173
131
  })
174
132
 
175
- handler.run_monitor( monitor )
133
+ runner.run_monitor( monitor )
176
134
  end
177
135
 
178
136
  end
179
137
 
138
+
139
+
180
140
  end
181
141
 
@@ -2,57 +2,120 @@
2
2
 
3
3
  require_relative '../spec_helper'
4
4
 
5
+ require 'rspec/wait'
6
+ require 'cztop'
7
+ require 'cztop/reactor'
8
+
5
9
  require 'arborist/observer_runner'
6
10
 
7
11
 
8
12
  describe Arborist::ObserverRunner do
9
13
 
14
+ before( :each ) do
15
+ $emails = []
16
+ $texts = []
17
+ end
10
18
 
11
- let( :zmq_loop ) { instance_double(ZMQ::Loop) }
12
- let( :req_socket ) { instance_double(ZMQ::Socket::Req) }
13
- let( :sub_socket ) { instance_double(ZMQ::Socket::Sub) }
14
- let( :pollitem ) { instance_double(ZMQ::Pollitem) }
15
-
16
- let( :runner ) do
17
- obj = described_class.new
18
- obj.reactor = zmq_loop
19
- obj
19
+ after( :each ) do
20
+ $emails.clear
21
+ $texts.clear
20
22
  end
21
23
 
22
- let( :observer_class ) { Class.new(Arborist::Observer) }
23
24
 
24
- let( :observer1 ) { observer_class.new("testing observer1") }
25
- let( :observer2 ) { observer_class.new("testing observer2") }
26
- let( :observer3 ) { observer_class.new("testing observer3") }
25
+ let( :observer1 ) do
26
+ Arborist::Observer "Email on ack/disabled/enabled" do
27
+ subscribe to: 'node.acked'
28
+ subscribe to: 'node.disabled'
29
+ subscribe to: 'node.enabled'
30
+
31
+ action do |event|
32
+ $emails << event
33
+ end
34
+
35
+ end
36
+ end
37
+ let( :observer2 ) do
38
+ Arborist::Observer "SMS on nodes down" do
39
+ subscribe to: 'node.down'
40
+ action do |event|
41
+ $texts << event
42
+ end
43
+ end
44
+ end
45
+ let( :observer3 ) do
46
+ Arborist::Observer 'Email on disk full' do
47
+ subscribe to: 'node.down',
48
+ where: { type: 'resource', category: 'disk' }
49
+ action do |event|
50
+ $emails << event
51
+ end
52
+ end
53
+ end
54
+
27
55
  let( :observers ) {[ observer1, observer2, observer3 ]}
28
56
 
29
57
 
30
58
  it "can load observers from an enumerator that yields Arborist::Observers" do
59
+ runner = described_class.new
31
60
  runner.load_observers([ observer1, observer2, observer3 ])
32
61
  expect( runner.observers ).to include( observer1, observer2, observer3 )
33
62
  end
34
63
 
35
64
 
36
- describe "a runner with loaded observers" do
65
+ describe "a runner with loaded observers", :testing_manager do
37
66
 
38
67
  before( :each ) do
39
- allow( zmq_loop ).to receive( :register ).with( an_instance_of(ZMQ::Pollitem) )
68
+ @manager_thread = Thread.new do
69
+ @manager = make_testing_manager()
70
+ Thread.current.abort_on_exception = true
71
+ @manager.run
72
+ Loggability[ Arborist ].info "Stopped the test manager"
73
+ end
74
+
75
+ count = 0
76
+ until (@manager && @manager.running?) || count > 30
77
+ sleep 0.1
78
+ count += 1
79
+ end
80
+ raise "Manager didn't start up" unless @manager.running?
40
81
  end
41
82
 
83
+ after( :each ) do
84
+ @manager.simulate_signal( :TERM )
85
+ @manager_thread.join
86
+
87
+ count = 0
88
+ while @manager.running? || count > 30
89
+ sleep 0.1
90
+ Loggability[ Arborist ].info "Manager still running"
91
+ count += 1
92
+ end
93
+ raise "Manager didn't stop" if @manager.running?
94
+ end
42
95
 
43
- xit "subscribes to events for each of its observers and starts the ZMQ loop when run" do
44
- expect( Arborist.zmq_context ).to receive( :socket ).
45
- with( :REQ ).and_return( req_socket )
46
- expect( Arborist.zmq_context ).to receive( :socket ).
47
- with( :SUB ).and_return( sub_socket )
48
96
 
49
- expect( req_socket ).to receive( :subscribe ).with( )
97
+ let( :runner ) do
98
+ runner = described_class.new
99
+ runner.load_observers( observers )
100
+ runner
50
101
  end
51
102
 
52
- end
53
103
 
104
+ it "subscribes for each of its observers and listens for events when run" do
105
+ thr = Thread.new { runner.run }
106
+ wait( 3 ).for { runner }.to be_running
107
+
108
+ expect( @manager.subscriptions.length ).to eq( runner.subscriptions.length )
54
109
 
55
- describe Arborist::ObserverRunner::Handler
110
+ runner.simulate_signal( :TERM )
111
+ thr.join( 2 )
112
+ thr.kill
113
+ end
114
+
115
+
116
+ it "runs the observers when subscribed events are sent"
117
+
118
+ end
56
119
 
57
120
  end
58
121
 
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env rspec -cfd
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ require 'arborist/tree_api'
6
+
7
+ describe Arborist::TreeAPI, :testing_manager do
8
+
9
+ it "can encode a valid Tree API header and body into a message"
10
+ it "raises an exception if the header to encode isn't a Hash"
11
+
12
+ it "can build a valid Tree API request message"
13
+
14
+
15
+ it "can build a valid success response message"
16
+ it "can build a valid error response message"
17
+
18
+
19
+ it "can decode a header and payload from a valid request message"
20
+
21
+ describe "raises an exception when decoding a request message" do
22
+
23
+ it "from a different protocol version"
24
+ it "that doesn't contain a valid MessagePack payload'"
25
+
26
+ end
27
+
28
+
29
+ end
30
+
@@ -164,10 +164,5 @@ describe Arborist do
164
164
  expect( described_class.observer_runner_for(loader) ).to be_a( Arborist::ObserverRunner )
165
165
  end
166
166
 
167
-
168
- it "has a ZMQ context" do
169
- expect( described_class.zmq_context ).to be_a( ZMQ::Context )
170
- end
171
-
172
167
  end
173
168
 
data/spec/spec_helper.rb CHANGED
@@ -73,19 +73,6 @@ module Arborist::TestHelpers
73
73
  end
74
74
 
75
75
 
76
- def pack_message( verb, *data )
77
- body = data.pop
78
- header = data.pop || {}
79
- header.merge!( action: verb, version: 1 )
80
-
81
- return MessagePack.pack([ header, body ])
82
- end
83
-
84
-
85
- def unpack_message( msg )
86
- return MessagePack.unpack( msg )
87
- end
88
-
89
76
 
90
77
  #
91
78
  # Fixture Functions
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arborist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0.pre20170519125456
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -9,34 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain:
12
- - |
13
- -----BEGIN CERTIFICATE-----
14
- MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
15
- GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
16
- HhcNMTYwODIwMTgxNzQyWhcNMTcwODIwMTgxNzQyWjA+MQwwCgYDVQQDDANnZWQx
17
- GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
18
- ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
19
- 83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
20
- ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
21
- TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
22
- 4MAX2qqKX/FKXqmFO+AGsbwYTEds1mksBF3fGsFgsQWxftG8GfZQ9+Cyu2+l1eOw
23
- cZ+lPcg834G9DrqW2zhqUoLr1MTly4pqxYGb7XoDhoR7dd1kFE2a067+DzWC/ADt
24
- +QkcqWUm5oh1fN0eqr7NsZlVJDulFgdiiYPQiIN7UNsii4Wc9aZqBoGcYfBeQNPZ
25
- soo/6za/bWajOKUmDhpqvaiRv9EDpVLzuj53uDoukMMwxCMfgb04+ckQ0t2G7wqc
26
- /D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
27
- BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
28
- MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
29
- YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQAPJzKiT0zBU7kpqe0aS2qb
30
- FI0PJ4y5I8buU4IZGUD5NEt/N7pZNfOyBxkrZkXhS44Fp+xwBH5ebLbq/WY78Bqd
31
- db0z6ZgW4LMYMpWFfbXsRbd9TU2f52L8oMAhxOvF7Of5qJMVWuFQ8FPagk2iHrdH
32
- inYLQagqAF6goWTXgAJCdPd6SNeeSNqA6vlY7CV1Jh5kfNJJ6xu/CVij1GzCLu/5
33
- DMOr26DBv+qLJRRC/2h34uX71q5QgeOyxvMg+7V3u/Q06DXyQ2VgeeqiwDFFpEH0
34
- PFkdPO6ZqbTRcLfNH7mFgCBJjsfSjJrn0sPBlYyOXgCoByfZnZyrIMH/UY+lgQqS
35
- 6Von1VDsfQm0eJh5zYZD64ZF86phSR7mUX3mXItwH04HrZwkWpvgd871DZVR3i1n
36
- w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
37
- p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
38
- -----END CERTIFICATE-----
39
- date: 2017-01-02 00:00:00.000000000 Z
12
+ - certs/ged.pem
13
+ date: 2017-05-19 00:00:00.000000000 Z
40
14
  dependencies:
41
15
  - !ruby/object:Gem::Dependency
42
16
  name: schedulability
@@ -114,28 +88,42 @@ dependencies:
114
88
  requirements:
115
89
  - - "~>"
116
90
  - !ruby/object:Gem::Version
117
- version: '0.6'
91
+ version: '1.0'
118
92
  type: :runtime
119
93
  prerelease: false
120
94
  version_requirements: !ruby/object:Gem::Requirement
121
95
  requirements:
122
96
  - - "~>"
123
97
  - !ruby/object:Gem::Version
124
- version: '0.6'
98
+ version: '1.0'
125
99
  - !ruby/object:Gem::Dependency
126
- name: rbczmq
100
+ name: cztop
127
101
  requirement: !ruby/object:Gem::Requirement
128
102
  requirements:
129
103
  - - "~>"
130
104
  - !ruby/object:Gem::Version
131
- version: '1.7'
105
+ version: '0.11'
132
106
  type: :runtime
133
107
  prerelease: false
134
108
  version_requirements: !ruby/object:Gem::Requirement
135
109
  requirements:
136
110
  - - "~>"
137
111
  - !ruby/object:Gem::Version
138
- version: '1.7'
112
+ version: '0.11'
113
+ - !ruby/object:Gem::Dependency
114
+ name: cztop-reactor
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.3'
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '0.3'
139
127
  - !ruby/object:Gem::Dependency
140
128
  name: gli
141
129
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +172,14 @@ dependencies:
184
172
  requirements:
185
173
  - - "~>"
186
174
  - !ruby/object:Gem::Version
187
- version: '0.8'
175
+ version: '0.9'
188
176
  type: :development
189
177
  prerelease: false
190
178
  version_requirements: !ruby/object:Gem::Requirement
191
179
  requirements:
192
180
  - - "~>"
193
181
  - !ruby/object:Gem::Version
194
- version: '0.8'
182
+ version: '0.9'
195
183
  - !ruby/object:Gem::Dependency
196
184
  name: hoe-highline
197
185
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +208,20 @@ dependencies:
220
208
  - - "~>"
221
209
  - !ruby/object:Gem::Version
222
210
  version: '3.2'
211
+ - !ruby/object:Gem::Dependency
212
+ name: rspec-wait
213
+ requirement: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - "~>"
216
+ - !ruby/object:Gem::Version
217
+ version: '0.0'
218
+ type: :development
219
+ prerelease: false
220
+ version_requirements: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - "~>"
223
+ - !ruby/object:Gem::Version
224
+ version: '0.0'
223
225
  - !ruby/object:Gem::Dependency
224
226
  name: simplecov
225
227
  requirement: !ruby/object:Gem::Requirement
@@ -268,14 +270,14 @@ dependencies:
268
270
  requirements:
269
271
  - - "~>"
270
272
  - !ruby/object:Gem::Version
271
- version: '3.15'
273
+ version: '3.16'
272
274
  type: :development
273
275
  prerelease: false
274
276
  version_requirements: !ruby/object:Gem::Requirement
275
277
  requirements:
276
278
  - - "~>"
277
279
  - !ruby/object:Gem::Version
278
- version: '3.15'
280
+ version: '3.16'
279
281
  description: |-
280
282
  Arborist is a monitoring toolkit that follows the UNIX philosophy
281
283
  of small parts and loose coupling for stability, reliability, and
@@ -333,12 +335,11 @@ files:
333
335
  - lib/arborist/event/node_unknown.rb
334
336
  - lib/arborist/event/node_up.rb
335
337
  - lib/arborist/event/node_update.rb
338
+ - lib/arborist/event_api.rb
336
339
  - lib/arborist/exceptions.rb
337
340
  - lib/arborist/loader.rb
338
341
  - lib/arborist/loader/file.rb
339
342
  - lib/arborist/manager.rb
340
- - lib/arborist/manager/event_publisher.rb
341
- - lib/arborist/manager/tree_api.rb
342
343
  - lib/arborist/mixins.rb
343
344
  - lib/arborist/monitor.rb
344
345
  - lib/arborist/monitor/socket.rb
@@ -354,15 +355,15 @@ files:
354
355
  - lib/arborist/observer/summarize.rb
355
356
  - lib/arborist/observer_runner.rb
356
357
  - lib/arborist/subscription.rb
358
+ - lib/arborist/tree_api.rb
357
359
  - spec/arborist/client_spec.rb
358
360
  - spec/arborist/dependency_spec.rb
359
361
  - spec/arborist/event/node_delta_spec.rb
360
362
  - spec/arborist/event/node_down_spec.rb
361
363
  - spec/arborist/event/node_spec.rb
362
364
  - spec/arborist/event/node_update_spec.rb
365
+ - spec/arborist/event_api_spec.rb
363
366
  - spec/arborist/event_spec.rb
364
- - spec/arborist/manager/event_publisher_spec.rb
365
- - spec/arborist/manager/tree_api_spec.rb
366
367
  - spec/arborist/manager_spec.rb
367
368
  - spec/arborist/mixins_spec.rb
368
369
  - spec/arborist/monitor/socket_spec.rb
@@ -379,6 +380,7 @@ files:
379
380
  - spec/arborist/observer_runner_spec.rb
380
381
  - spec/arborist/observer_spec.rb
381
382
  - spec/arborist/subscription_spec.rb
383
+ - spec/arborist/tree_api_spec.rb
382
384
  - spec/arborist_spec.rb
383
385
  - spec/data/monitors/pings.rb
384
386
  - spec/data/monitors/port_checks.rb
@@ -408,12 +410,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
408
410
  version: 2.3.1
409
411
  required_rubygems_version: !ruby/object:Gem::Requirement
410
412
  requirements:
411
- - - ">="
413
+ - - ">"
412
414
  - !ruby/object:Gem::Version
413
- version: '0'
415
+ version: 1.3.1
414
416
  requirements: []
415
417
  rubyforge_project:
416
- rubygems_version: 2.6.8
418
+ rubygems_version: 2.6.12
417
419
  signing_key:
418
420
  specification_version: 4
419
421
  summary: Arborist is a monitoring toolkit that follows the UNIX philosophy of small