arborist 0.3.0 → 0.4.0
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
- 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
|