arborist 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ChangeLog +1646 -1569
- data/History.md +14 -0
- data/Rakefile +1 -1
- data/lib/arborist.rb +2 -2
- data/lib/arborist/client.rb +3 -3
- data/lib/arborist/command/summary.rb +1 -1
- data/lib/arborist/event.rb +8 -0
- data/lib/arborist/event/node.rb +4 -3
- data/lib/arborist/event/node_delta.rb +7 -0
- data/lib/arborist/event/node_update.rb +7 -0
- data/lib/arborist/monitor/socket.rb +1 -1
- data/lib/arborist/monitor_runner.rb +2 -4
- data/lib/arborist/node.rb +124 -28
- data/lib/arborist/node/root.rb +1 -1
- data/lib/arborist/observer/action.rb +15 -2
- data/spec/arborist/event/node_spec.rb +3 -1
- data/spec/arborist/event_spec.rb +10 -0
- data/spec/arborist/manager_spec.rb +20 -22
- data/spec/arborist/mixins_spec.rb +3 -1
- data/spec/arborist/node_spec.rb +76 -16
- data/spec/arborist/observer/action_spec.rb +25 -0
- metadata +27 -32
- metadata.gz.sig +0 -0
@@ -27,8 +27,10 @@ describe Arborist::Event::Node do
|
|
27
27
|
|
28
28
|
|
29
29
|
it "serializes with useful metadata attached" do
|
30
|
-
expect( event.to_h ).to include( :identifier, :parent, :nodetype )
|
30
|
+
expect( event.to_h ).to include( :identifier, :parent, :nodetype, :flapping )
|
31
31
|
expect( event.to_h[:nodetype] ).to eq( 'testnode' )
|
32
|
+
expect( event.to_h[:parent] ).to eq( 'bar' )
|
33
|
+
expect( event.to_h[:flapping] ).to eq( false )
|
32
34
|
end
|
33
35
|
|
34
36
|
|
data/spec/arborist/event_spec.rb
CHANGED
@@ -685,7 +685,7 @@ describe Arborist::Manager do
|
|
685
685
|
msg.send_to( sock )
|
686
686
|
resmsg = sock.receive
|
687
687
|
|
688
|
-
hdr,
|
688
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
689
689
|
expect( hdr ).to include( 'success' => true )
|
690
690
|
end
|
691
691
|
|
@@ -694,7 +694,7 @@ describe Arborist::Manager do
|
|
694
694
|
msg.send_to( sock )
|
695
695
|
resmsg = sock.receive
|
696
696
|
|
697
|
-
hdr,
|
697
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
698
698
|
expect( hdr ).to include( 'success' => false )
|
699
699
|
expect( hdr['reason'] ).to match( /respond to #each/ )
|
700
700
|
end
|
@@ -715,8 +715,6 @@ describe Arborist::Manager do
|
|
715
715
|
)
|
716
716
|
hdr, body = Arborist::TreeAPI.decode( resmsg )
|
717
717
|
|
718
|
-
sub_id = manager.subscriptions.keys.first
|
719
|
-
|
720
718
|
expect( hdr ).to include( 'success' => true )
|
721
719
|
expect( body ).to be_a( Hash )
|
722
720
|
expect( body ).to include( 'id' )
|
@@ -753,7 +751,7 @@ describe Arborist::Manager do
|
|
753
751
|
}.to change { manager.subscriptions.length }.by( 1 ).and(
|
754
752
|
change { manager.root.subscriptions.length }.by( 1 )
|
755
753
|
)
|
756
|
-
|
754
|
+
_hdr, body = Arborist::TreeAPI.decode( resmsg )
|
757
755
|
node = manager.subscriptions[ body['id'] ]
|
758
756
|
sub = node.subscriptions[ body['id'] ]
|
759
757
|
|
@@ -773,7 +771,7 @@ describe Arborist::Manager do
|
|
773
771
|
}.to change { manager.subscriptions.length }.by( 1 ).and(
|
774
772
|
change { manager.root.subscriptions.length }.by( 1 )
|
775
773
|
)
|
776
|
-
|
774
|
+
_hdr, body = Arborist::TreeAPI.decode( resmsg )
|
777
775
|
expect( body ).to be_a( Hash ).and( include('id') )
|
778
776
|
node = manager.subscriptions[ body['id'] ]
|
779
777
|
sub = node.subscriptions[ body['id'] ]
|
@@ -795,7 +793,7 @@ describe Arborist::Manager do
|
|
795
793
|
}.to change { manager.subscriptions.length }.by( 1 ).and(
|
796
794
|
change { manager.root.subscriptions.length }.by( 1 )
|
797
795
|
)
|
798
|
-
|
796
|
+
_hdr, body = Arborist::TreeAPI.decode( resmsg )
|
799
797
|
expect( body ).to be_a( Hash ).and( include('id') )
|
800
798
|
node = manager.subscriptions[ body['id'] ]
|
801
799
|
sub = node.subscriptions[ body['id'] ]
|
@@ -824,7 +822,7 @@ describe Arborist::Manager do
|
|
824
822
|
}.to change { manager.subscriptions.length }.by( -1 ).and(
|
825
823
|
change { manager.root.subscriptions.length }.by( -1 )
|
826
824
|
)
|
827
|
-
|
825
|
+
_hdr, body = Arborist::TreeAPI.decode( resmsg )
|
828
826
|
|
829
827
|
expect( body ).to include( 'event_type' => 'node.delta', 'criteria' => {'type' => 'host'} )
|
830
828
|
end
|
@@ -838,7 +836,7 @@ describe Arborist::Manager do
|
|
838
836
|
msg.send_to( sock )
|
839
837
|
resmsg = sock.receive
|
840
838
|
}.to_not change { manager.subscriptions.length }
|
841
|
-
|
839
|
+
_hdr, body = Arborist::TreeAPI.decode( resmsg )
|
842
840
|
|
843
841
|
expect( body ).to be_nil
|
844
842
|
end
|
@@ -891,7 +889,7 @@ describe Arborist::Manager do
|
|
891
889
|
msg.send_to( sock )
|
892
890
|
resmsg = sock.receive
|
893
891
|
|
894
|
-
hdr,
|
892
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
895
893
|
expect( hdr ).to include( 'success' => false )
|
896
894
|
expect( hdr['reason'] ).to match( /no identifier/i )
|
897
895
|
end
|
@@ -1000,7 +998,7 @@ describe Arborist::Manager do
|
|
1000
998
|
msg.send_to( sock )
|
1001
999
|
resmsg = sock.receive
|
1002
1000
|
|
1003
|
-
hdr,
|
1001
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1004
1002
|
expect( hdr ).to include( 'success' => false )
|
1005
1003
|
expect( hdr['reason'] ).to match( /no host given/i )
|
1006
1004
|
end
|
@@ -1016,7 +1014,7 @@ describe Arborist::Manager do
|
|
1016
1014
|
msg.send_to( sock )
|
1017
1015
|
resmsg = sock.receive
|
1018
1016
|
|
1019
|
-
hdr,
|
1017
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1020
1018
|
expect( hdr ).to include( 'success' => false )
|
1021
1019
|
expect( hdr['reason'] ).to match( /exists/i )
|
1022
1020
|
end
|
@@ -1038,7 +1036,7 @@ describe Arborist::Manager do
|
|
1038
1036
|
msg.send_to( sock )
|
1039
1037
|
resmsg = sock.receive
|
1040
1038
|
|
1041
|
-
hdr,
|
1039
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1042
1040
|
expect( hdr ).to include( 'success' => true )
|
1043
1041
|
|
1044
1042
|
node = manager.nodes[ 'sidonie' ]
|
@@ -1061,7 +1059,7 @@ describe Arborist::Manager do
|
|
1061
1059
|
msg.send_to( sock )
|
1062
1060
|
resmsg = sock.receive
|
1063
1061
|
|
1064
|
-
hdr,
|
1062
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1065
1063
|
expect( hdr ).to include( 'success' => true )
|
1066
1064
|
|
1067
1065
|
expect( manager.nodes['sidonie'] ).to be_an( Arborist::Node )
|
@@ -1081,7 +1079,7 @@ describe Arborist::Manager do
|
|
1081
1079
|
msg.send_to( sock )
|
1082
1080
|
resmsg = sock.receive
|
1083
1081
|
|
1084
|
-
hdr,
|
1082
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1085
1083
|
expect( hdr ).to include( 'success' => false )
|
1086
1084
|
expect( manager.nodes['_'].identifier ).to eq( '_' )
|
1087
1085
|
end
|
@@ -1099,7 +1097,7 @@ describe Arborist::Manager do
|
|
1099
1097
|
msg.send_to( sock )
|
1100
1098
|
resmsg = sock.receive
|
1101
1099
|
|
1102
|
-
hdr,
|
1100
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1103
1101
|
expect( hdr ).to include( 'success' => false )
|
1104
1102
|
end
|
1105
1103
|
|
@@ -1121,7 +1119,7 @@ describe Arborist::Manager do
|
|
1121
1119
|
msg.send_to( sock )
|
1122
1120
|
resmsg = sock.receive
|
1123
1121
|
|
1124
|
-
hdr,
|
1122
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1125
1123
|
expect( hdr ).to include( 'success' => true )
|
1126
1124
|
|
1127
1125
|
new_parent = manager.nodes[ 'yevaud' ]
|
@@ -1178,7 +1176,7 @@ describe Arborist::Manager do
|
|
1178
1176
|
msg.send_to( sock )
|
1179
1177
|
resmsg = sock.receive
|
1180
1178
|
|
1181
|
-
hdr,
|
1179
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1182
1180
|
expect( hdr ).to include( 'success' => false )
|
1183
1181
|
expect( hdr['reason'] ).to match( /no such node/i )
|
1184
1182
|
end
|
@@ -1189,7 +1187,7 @@ describe Arborist::Manager do
|
|
1189
1187
|
msg.send_to( sock )
|
1190
1188
|
resmsg = sock.receive
|
1191
1189
|
|
1192
|
-
hdr,
|
1190
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1193
1191
|
expect( hdr ).to include( 'success' => false )
|
1194
1192
|
expect( hdr['reason'] ).to match( /no identifier/i )
|
1195
1193
|
end
|
@@ -1203,7 +1201,7 @@ describe Arborist::Manager do
|
|
1203
1201
|
msg.send_to( sock )
|
1204
1202
|
resmsg = sock.receive
|
1205
1203
|
|
1206
|
-
hdr,
|
1204
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1207
1205
|
expect( hdr ).to include( 'success' => false )
|
1208
1206
|
expect( hdr['reason'] ).to match( /missing required ack sender/i )
|
1209
1207
|
end
|
@@ -1245,7 +1243,7 @@ describe Arborist::Manager do
|
|
1245
1243
|
msg.send_to( sock )
|
1246
1244
|
resmsg = sock.receive
|
1247
1245
|
|
1248
|
-
hdr,
|
1246
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1249
1247
|
expect( hdr ).to include( 'success' => false )
|
1250
1248
|
expect( hdr['reason'] ).to match( /no such/i )
|
1251
1249
|
end
|
@@ -1256,7 +1254,7 @@ describe Arborist::Manager do
|
|
1256
1254
|
msg.send_to( sock )
|
1257
1255
|
resmsg = sock.receive
|
1258
1256
|
|
1259
|
-
hdr,
|
1257
|
+
hdr, _body = Arborist::TreeAPI.decode( resmsg )
|
1260
1258
|
expect( hdr ).to include( 'success' => false )
|
1261
1259
|
expect( hdr['reason'] ).to match( /no identifier/i )
|
1262
1260
|
end
|
@@ -12,7 +12,9 @@ describe Arborist, "mixins" do
|
|
12
12
|
describe Arborist::MethodUtilities, 'used to extend a class' do
|
13
13
|
|
14
14
|
let!( :extended_class ) do
|
15
|
-
klass = Class.new
|
15
|
+
klass = Class.new do
|
16
|
+
def initialize; @foo = nil; end
|
17
|
+
end
|
16
18
|
klass.extend( Arborist::MethodUtilities )
|
17
19
|
klass
|
18
20
|
end
|
data/spec/arborist/node_spec.rb
CHANGED
@@ -27,6 +27,16 @@ describe Arborist::Node do
|
|
27
27
|
let( :identifier2 ) { 'the_other_identifier' }
|
28
28
|
|
29
29
|
|
30
|
+
### Suppress $VERBOSE warnings for the duration of a block
|
31
|
+
def with_warnings_suppressed
|
32
|
+
oldwarn = $VERBOSE
|
33
|
+
$VERBOSE = nil
|
34
|
+
yield
|
35
|
+
ensure
|
36
|
+
$VERBOSE = oldwarn
|
37
|
+
end
|
38
|
+
|
39
|
+
|
30
40
|
shared_examples_for "a reachable node" do
|
31
41
|
|
32
42
|
it "is still 'reachable'" do
|
@@ -114,11 +124,12 @@ describe Arborist::Node do
|
|
114
124
|
expect( subnode_class.parent_types ).to include( concrete_class )
|
115
125
|
end
|
116
126
|
|
117
|
-
|
118
127
|
it "can be constructed via a factory method on instances of their parent type" do
|
119
|
-
subnode_class =
|
120
|
-
|
121
|
-
|
128
|
+
subnode_class = with_warnings_suppressed do
|
129
|
+
Class.new( described_class ) do
|
130
|
+
def self::name; "TestSubNode"; end
|
131
|
+
def self::plugin_name; "testsub"; end
|
132
|
+
end
|
122
133
|
end
|
123
134
|
described_class.derivatives['testsub'] = subnode_class
|
124
135
|
|
@@ -133,17 +144,19 @@ describe Arborist::Node do
|
|
133
144
|
|
134
145
|
|
135
146
|
it "can pre-process the factory method arguments" do
|
136
|
-
subnode_class =
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
+
subnode_class = with_warnings_suppressed do
|
148
|
+
Class.new( described_class ) do
|
149
|
+
def self::name; "TestSubNode"; end
|
150
|
+
def self::plugin_name; "testsub"; end
|
151
|
+
def args( new_args=nil )
|
152
|
+
@args = new_args if new_args
|
153
|
+
return @args
|
154
|
+
end
|
155
|
+
def modify( attributes )
|
156
|
+
attributes = stringify_keys( attributes )
|
157
|
+
super
|
158
|
+
self.args( attributes['args'] )
|
159
|
+
end
|
147
160
|
end
|
148
161
|
end
|
149
162
|
described_class.derivatives['testsub'] = subnode_class
|
@@ -253,6 +266,36 @@ describe Arborist::Node do
|
|
253
266
|
end
|
254
267
|
|
255
268
|
|
269
|
+
it "stores a history of its status" do
|
270
|
+
node.status_history_size( 3 )
|
271
|
+
|
272
|
+
node.update( {} )
|
273
|
+
node.update( {} )
|
274
|
+
node.update( { warning: 'whoopsie' } )
|
275
|
+
node.update( {} )
|
276
|
+
|
277
|
+
expect( node.status_history ).to eq( ['up', 'warn', 'up'] )
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
it "knows if its status is transitioning frequently" do
|
282
|
+
node.status_history_size( 10 )
|
283
|
+
node.flap_threshold( 3 )
|
284
|
+
|
285
|
+
7.times{ node.update( {} ) }
|
286
|
+
node.update( { error: 'boooM!' } )
|
287
|
+
node.update( { warning: 'whoopsie' } )
|
288
|
+
node.update( {} )
|
289
|
+
|
290
|
+
expect( node ).to be_flapping
|
291
|
+
|
292
|
+
node.flap_threshold( 4 )
|
293
|
+
node.update( {} )
|
294
|
+
|
295
|
+
expect( node ).to_not be_flapping
|
296
|
+
end
|
297
|
+
|
298
|
+
|
256
299
|
it "groups errors from separate monitors by their key" do
|
257
300
|
expect( node ).to be_unknown
|
258
301
|
|
@@ -374,6 +417,17 @@ describe Arborist::Node do
|
|
374
417
|
}.to change { node.status }.from( 'up' ).to( 'quieted' )
|
375
418
|
end
|
376
419
|
|
420
|
+
|
421
|
+
it "records its transition to quieted in its status history" do
|
422
|
+
node.status_history_size( 3 )
|
423
|
+
down_event = Arborist::Event.create( :node_down, parent_node )
|
424
|
+
|
425
|
+
expect( node.status ).to eq( 'up' )
|
426
|
+
node.handle_event( down_event )
|
427
|
+
expect( node.status ).to eq( 'quieted' )
|
428
|
+
|
429
|
+
expect( node.status_history ).to eq( ['quieted'] )
|
430
|
+
end
|
377
431
|
end
|
378
432
|
|
379
433
|
|
@@ -795,12 +849,16 @@ describe Arborist::Node do
|
|
795
849
|
)
|
796
850
|
old_node.last_contacted = Time.now - 28
|
797
851
|
old_node.dependencies.mark_down( 'svchost-postgres' )
|
852
|
+
old_node.status_history << 'up'
|
853
|
+
old_node.flapping = true
|
798
854
|
|
799
855
|
node.restore( old_node )
|
800
856
|
|
801
857
|
expect( node.status ).to eq( old_node.status )
|
802
858
|
expect( node.status_changed ).to eq( old_node.status_changed )
|
803
859
|
expect( node.status_last_changed ).to eq( old_node.status_last_changed )
|
860
|
+
expect( node.status_history ).to eq( old_node.status_history )
|
861
|
+
expect( node.flapping? ).to eq( old_node.flapping? )
|
804
862
|
expect( node.errors ).to eq( old_node.errors )
|
805
863
|
expect( node.ack ).to eq( old_node.ack )
|
806
864
|
expect( node.properties ).to include( old_node.properties )
|
@@ -873,6 +931,8 @@ describe Arborist::Node do
|
|
873
931
|
expect( result[:errors] ).to be_empty
|
874
932
|
expect( result[:dependencies] ).to be_a( Hash )
|
875
933
|
expect( result[:quieted_reasons] ).to be_a( Hash )
|
934
|
+
expect( result[:status_history] ).to eq( node.status_history )
|
935
|
+
expect( result[:flapping] ).to eq( node.flapping? )
|
876
936
|
|
877
937
|
expect( result[:children] ).to be_empty
|
878
938
|
end
|
@@ -1147,7 +1207,7 @@ describe Arborist::Node do
|
|
1147
1207
|
describe "matching" do
|
1148
1208
|
|
1149
1209
|
let( :concrete_class ) do
|
1150
|
-
|
1210
|
+
Class.new( described_class ) do
|
1151
1211
|
def self::name; "TestNode"; end
|
1152
1212
|
end
|
1153
1213
|
end
|
@@ -77,6 +77,31 @@ describe Arborist::Observer::Action do
|
|
77
77
|
|
78
78
|
end
|
79
79
|
|
80
|
+
context "ignoring flapping nodes" do
|
81
|
+
|
82
|
+
before( :each ) do
|
83
|
+
@call_count = 0
|
84
|
+
@last_call_arguments = nil
|
85
|
+
end
|
86
|
+
|
87
|
+
let( :action ) do
|
88
|
+
described_class.new( ignore_flapping: true ) do |args|
|
89
|
+
@call_count += 1
|
90
|
+
@last_call_arguments = args
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
let( :flapping_event ) { { 'flapping' => true } }
|
95
|
+
|
96
|
+
it "calls its block if the event is generated by a node that is not flapping" do
|
97
|
+
expect { action.handle_event(event) }.to change { @call_count }.by( 1 )
|
98
|
+
end
|
99
|
+
|
100
|
+
it "doesn't call its block if the event is generated by a flapping node" do
|
101
|
+
expect { action.handle_event(flapping_event) }.to_not change { @call_count }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
80
105
|
|
81
106
|
# within: 0, after: 1, during: nil
|
82
107
|
|
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.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -11,32 +11,27 @@ bindir: bin
|
|
11
11
|
cert_chain:
|
12
12
|
- |
|
13
13
|
-----BEGIN CERTIFICATE-----
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
MaTVMjsHqJUwU2xVfhGtxGAWAer5S1HGYHkbio6mGVtiie0uWjmnzi7ppIlMr48a
|
34
|
-
7BNTsoZ+/JRk3iQWmmNsyFT7xfqBKye7cH11BX8V8P4MeGB5YWlMI+Myj5DZY3fQ
|
35
|
-
st2AGD4rb1l0ia7PfubcBThSIdz61eCb8gRi/RiZZwb3/7+eyEncLJzt2Ob9fGSF
|
36
|
-
X0qdrKi+2aZZ0NGuFj9AItBsVmAvkBGIpX4TEKQp5haEbPpmaqO5nIIhV26PXmyT
|
37
|
-
OMKv6pWsoS81vw5KAGBmfX8nht/Py90DQrbRvakATGI=
|
14
|
+
MIIDbDCCAlSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA+MQ8wDQYDVQQDDAZtYWhs
|
15
|
+
b24xFzAVBgoJkiaJk/IsZAEZFgdtYXJ0aW5pMRIwEAYKCZImiZPyLGQBGRYCbnUw
|
16
|
+
HhcNMTcxMTIyMjIyMTAyWhcNMTgxMTIyMjIyMTAyWjA+MQ8wDQYDVQQDDAZtYWhs
|
17
|
+
b24xFzAVBgoJkiaJk/IsZAEZFgdtYXJ0aW5pMRIwEAYKCZImiZPyLGQBGRYCbnUw
|
18
|
+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpXGN0YbMVpYv4EoiCxpQw
|
19
|
+
sxKdyhlkvpvENUkpEhbpnEuMKXgUfRHO4T/vBZf0h8eYgwnrHCRhAeIqesFKfoj9
|
20
|
+
mpEJk5JUuADOAz18aT+v24UqAtJdiwBJLuqhslSNB6CFXZv3OOMny9bjoJegz0hI
|
21
|
+
Fht9ppCuNmxJNd+L3zAX8lD01RUWNRC+8L5QLCjViJtjFDDCFfh9NCirs+XnTCzo
|
22
|
+
AJgFbsZIzFJtSiXUtFgscKr4Ik8ruhRbPbYbmx9rf6W74aTMPxggq/d3gj0Eh32y
|
23
|
+
WsXsQ5giVnmkbsRkBNu3QyZ8Xr5+7mvy5AWyqXKOrcW7lnYaob6Z9x/MGXGNeD6j
|
24
|
+
AgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBRY8ea6
|
25
|
+
+6kAaW7ukKph2/4MTAD8/TAcBgNVHREEFTATgRFtYWhsb25AbWFydGluaS5udTAc
|
26
|
+
BgNVHRIEFTATgRFtYWhsb25AbWFydGluaS5udTANBgkqhkiG9w0BAQUFAAOCAQEA
|
27
|
+
00FljTeSNaYUqJ59yLRA+i43wVNiO4ETQQu6fYQCPns12Sm90spOJb3SmTDkJ7CY
|
28
|
+
dixOQg5A3Et1LVS+Z/YfH1TAbb50oTWbZbTW2JknHS0hohq3UF1pvbkk1niZ26er
|
29
|
+
skJ352MUfcyaUkQyMmCjL/BpkDutYH5OCGh+FmK8+mH7SoC9Nr48WwH2prVdHs3y
|
30
|
+
OMWFgB33sXdj1XqOd2Rw1WPgAeMeDqWeIrRMpUhNZOwroaA1MAr60f9NIYxua/vx
|
31
|
+
n0YyneERGuHPSRZFgo72tGOqLpAlWnhPxRNqnayZmsg3hPPI87B6MTUI2UQ7VUdh
|
32
|
+
UrSf3b+cPoC8PNfjp8zsdw==
|
38
33
|
-----END CERTIFICATE-----
|
39
|
-
date: 2018-
|
34
|
+
date: 2018-11-21 00:00:00.000000000 Z
|
40
35
|
dependencies:
|
41
36
|
- !ruby/object:Gem::Dependency
|
42
37
|
name: schedulability
|
@@ -44,14 +39,14 @@ dependencies:
|
|
44
39
|
requirements:
|
45
40
|
- - "~>"
|
46
41
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
42
|
+
version: '0.4'
|
48
43
|
type: :runtime
|
49
44
|
prerelease: false
|
50
45
|
version_requirements: !ruby/object:Gem::Requirement
|
51
46
|
requirements:
|
52
47
|
- - "~>"
|
53
48
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
49
|
+
version: '0.4'
|
55
50
|
- !ruby/object:Gem::Dependency
|
56
51
|
name: loggability
|
57
52
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,14 +221,14 @@ dependencies:
|
|
226
221
|
requirements:
|
227
222
|
- - "~>"
|
228
223
|
- !ruby/object:Gem::Version
|
229
|
-
version: '0.
|
224
|
+
version: '0.10'
|
230
225
|
type: :development
|
231
226
|
prerelease: false
|
232
227
|
version_requirements: !ruby/object:Gem::Requirement
|
233
228
|
requirements:
|
234
229
|
- - "~>"
|
235
230
|
- !ruby/object:Gem::Version
|
236
|
-
version: '0.
|
231
|
+
version: '0.10'
|
237
232
|
- !ruby/object:Gem::Dependency
|
238
233
|
name: hoe-highline
|
239
234
|
requirement: !ruby/object:Gem::Requirement
|
@@ -338,14 +333,14 @@ dependencies:
|
|
338
333
|
requirements:
|
339
334
|
- - "~>"
|
340
335
|
- !ruby/object:Gem::Version
|
341
|
-
version: '3.
|
336
|
+
version: '3.17'
|
342
337
|
type: :development
|
343
338
|
prerelease: false
|
344
339
|
version_requirements: !ruby/object:Gem::Requirement
|
345
340
|
requirements:
|
346
341
|
- - "~>"
|
347
342
|
- !ruby/object:Gem::Version
|
348
|
-
version: '3.
|
343
|
+
version: '3.17'
|
349
344
|
description: |-
|
350
345
|
Arborist is a monitoring toolkit that follows the UNIX philosophy
|
351
346
|
of small parts and loose coupling for stability, reliability, and
|