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.
@@ -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
 
@@ -60,5 +60,15 @@ describe Arborist::Event do
60
60
 
61
61
  end
62
62
 
63
+
64
+ describe "meta/informational predicate" do
65
+
66
+ it "returns false" do
67
+ event = described_class.new( 'chunky' => 'meat' )
68
+ expect( event ).to_not be_informational
69
+ end
70
+
71
+ end
72
+
63
73
  end
64
74
 
@@ -685,7 +685,7 @@ describe Arborist::Manager do
685
685
  msg.send_to( sock )
686
686
  resmsg = sock.receive
687
687
 
688
- hdr, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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
- hdr, body = Arborist::TreeAPI.decode( resmsg )
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
- hdr, body = Arborist::TreeAPI.decode( resmsg )
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
- hdr, body = Arborist::TreeAPI.decode( resmsg )
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
- hdr, body = Arborist::TreeAPI.decode( resmsg )
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
- hdr, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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, body = Arborist::TreeAPI.decode( resmsg )
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
@@ -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 = Class.new( described_class ) do
120
- def self::name; "TestSubNode"; end
121
- def self::plugin_name; "testsub"; end
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 = Class.new( described_class ) do
137
- def self::name; "TestSubNode"; end
138
- def self::plugin_name; "testsub"; end
139
- def args( new_args=nil )
140
- @args = new_args if new_args
141
- return @args
142
- end
143
- def modify( attributes )
144
- attributes = stringify_keys( attributes )
145
- super
146
- self.args( attributes['args'] )
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
- cls = Class.new( described_class ) do
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.3.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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
28
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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-08-29 00:00:00.000000000 Z
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.1'
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.1'
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.9'
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.9'
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.16'
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.16'
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