pulse-meter-rails 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ /.idea
data/README.md CHANGED
@@ -86,6 +86,10 @@ Default layout can be easily exteneded in initializer by standart pulse-meter [D
86
86
  end
87
87
  end
88
88
 
89
+ ## Data isolation
90
+
91
+ To avoid collisions between multiple rails applications with monitoring enabled use separate Redis DB for each of them
92
+
89
93
  ## Contributing
90
94
 
91
95
  1. Fork it
@@ -36,9 +36,9 @@ module PulseToolbox
36
36
  PulseMeter.redis = redis
37
37
  @@pid = Process.pid
38
38
  @@redis_config = {
39
- :host => redis.client.host,
40
- :port => redis.client.port,
41
- :db => redis.client.db
39
+ host: redis.client.host,
40
+ port: redis.client.port,
41
+ db: redis.client.db
42
42
  }
43
43
  end
44
44
 
@@ -49,9 +49,9 @@ module PulseToolbox
49
49
 
50
50
  def reconnect
51
51
  PulseMeter.redis = Redis.new(
52
- :host => @@redis_config[:host],
53
- :port => @@redis_config[:port],
54
- :db => @@redis_config[:db]
52
+ host: @@redis_config[:host],
53
+ port: @@redis_config[:port],
54
+ db: @@redis_config[:db]
55
55
  )
56
56
  end
57
57
 
@@ -5,13 +5,11 @@ module PulseToolbox
5
5
  # Registeres an initializer which creates sensors and subscribes to
6
6
  # process_action.action_controller notification
7
7
  class Initializer < ::Rails::Railtie
8
- initializer "register_request_sensors", :after => :load_config_initializers do
8
+ initializer "register_request_sensors", after: :load_config_initializers do
9
9
  if PulseToolbox.redis
10
10
  ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, start, finish, id, payload|
11
11
  total_time = (finish - start) * 1000
12
- view_time = payload[:view_runtime]
13
- db_time = payload[:db_runtime]
14
- PulseToolbox::Sensor::Manager.log_request(total_time, view_time, db_time)
12
+ PulseToolbox::Sensor::Manager.log_request(total_time, payload)
15
13
  end
16
14
  else
17
15
  Rails.logger.error("PulseToolbox.redis is not defined. Sensors cannot be created")
@@ -28,64 +28,129 @@ module PulseToolbox
28
28
  self.monitoring_layout = PulseMeter::Visualize::DSL::Layout.new
29
29
 
30
30
  self.default_options = {
31
- :ttl => 1.day,
32
- :interval => 1.minute,
33
- :raw_data_ttl => 1.hour,
34
- :reduce_delay => 2.minutes
31
+ ttl: 7.days,
32
+ interval: 1.minute,
33
+ raw_data_ttl: 1.hour,
34
+ reduce_delay: 2.minutes
35
35
  }.freeze
36
36
 
37
37
  self.sensors_config = {
38
- :max => {
39
- :title => "Max times",
40
- :sensors => {
41
- :db_time => {
42
- :sensor_type => 'timelined/max',
43
- :color => '#0000FF',
44
- :args => {
45
- :annotation => "DB"
38
+ max: {
39
+ title: "Max times",
40
+ values: "Time, ms",
41
+ sensors: {
42
+ db_time: {
43
+ sensor_type: 'timelined/max',
44
+ color: '#0000FF',
45
+ args: {
46
+ annotation: "DB"
46
47
  }
47
48
  },
48
- :view_time => {
49
- :sensor_type => 'timelined/max',
50
- :color => '#00FF00',
51
- :args => {
52
- :annotation => "View"
49
+ view_time: {
50
+ sensor_type: 'timelined/max',
51
+ color: '#00FF00',
52
+ args: {
53
+ annotation: "View"
53
54
  }
54
55
  },
55
- :total_time => {
56
- :sensor_type => 'timelined/max',
57
- :color => '#FF0000',
58
- :args => {
59
- :annotation => "Total"
56
+ total_time: {
57
+ sensor_type: 'timelined/max',
58
+ color: '#FF0000',
59
+ args: {
60
+ annotation: "Total"
60
61
  }
61
62
  }
62
63
  }
63
64
  },
64
- :p95 => {
65
- :title => "95% percentile times",
66
- :sensors => {
67
- :db_time => {
68
- :sensor_type => 'timelined/percentile',
69
- :color => '#0000FF',
70
- :args => {
71
- :annotation => "DB",
72
- :p => 0.95
65
+ p95: {
66
+ title: "95% percentile times",
67
+ values: "Time, ms",
68
+ sensors: {
69
+ db_time: {
70
+ sensor_type: 'timelined/percentile',
71
+ color: '#0000FF',
72
+ args: {
73
+ annotation: "DB",
74
+ p: 0.95
73
75
  }
74
76
  },
75
- :view_time => {
76
- :sensor_type => 'timelined/percentile',
77
- :color => '#00FF00',
78
- :args => {
79
- :annotation => "View",
80
- :p => 0.95
77
+ view_time: {
78
+ sensor_type: 'timelined/percentile',
79
+ color: '#00FF00',
80
+ args: {
81
+ annotation: "View",
82
+ p: 0.95
81
83
  }
82
84
  },
83
- :total_time => {
84
- :sensor_type => 'timelined/percentile',
85
- :color => '#FF0000',
86
- :args => {
87
- :annotation => "Total",
88
- :p => 0.95
85
+ total_time: {
86
+ sensor_type: 'timelined/percentile',
87
+ color: '#FF0000',
88
+ args: {
89
+ annotation: "Total",
90
+ p: 0.95
91
+ }
92
+ }
93
+ }
94
+ },
95
+ p99: {
96
+ title: "99% percentile times",
97
+ values: "Time, ms",
98
+ sensors: {
99
+ db_time: {
100
+ sensor_type: 'timelined/percentile',
101
+ color: '#0000FF',
102
+ args: {
103
+ annotation: "DB",
104
+ p: 0.99
105
+ }
106
+ },
107
+ view_time: {
108
+ sensor_type: 'timelined/percentile',
109
+ color: '#00FF00',
110
+ args: {
111
+ annotation: "View",
112
+ p: 0.99
113
+ }
114
+ },
115
+ total_time: {
116
+ sensor_type: 'timelined/percentile',
117
+ color: '#FF0000',
118
+ args: {
119
+ annotation: "Total",
120
+ p: 0.99
121
+ }
122
+ }
123
+ }
124
+ },
125
+ status: {
126
+ title: 'Request count',
127
+ values: "Count",
128
+ sensors: {
129
+ total: {
130
+ sensor_type: 'timelined/counter',
131
+ color: '#FF0000',
132
+ args: {
133
+ annotation: "Total",
134
+ }
135
+ },
136
+ count: {
137
+ sensor_type: 'timelined/hashed_counter',
138
+ color: '#008800',
139
+ args: {
140
+ annotation: "Status"
141
+ }
142
+ }
143
+ }
144
+ },
145
+ action: {
146
+ title: 'Request count by action',
147
+ values: "Count",
148
+ sensors: {
149
+ count: {
150
+ sensor_type: 'timelined/hashed_counter',
151
+ color: '#008800',
152
+ args: {
153
+ annotation: "Action"
89
154
  }
90
155
  }
91
156
  }
@@ -107,22 +172,38 @@ module PulseToolbox
107
172
  # @param total_time [Float] total request time
108
173
  # @param view_time [Float] view time of request
109
174
  # @param db_time [Float] db time of request
110
- def log_request(total_time, view_time, db_time)
111
- [
112
- [:max_db_time, db_time],
113
- [:p95_db_time, db_time],
114
- [:max_view_time, view_time],
115
- [:p95_view_time, view_time],
116
- [:max_total_time, total_time],
117
- [:p95_total_time, total_time]
118
- ].each {|name, value = e| event(name, value)}
175
+ def log_request(total_time, payload)
176
+ view_time = payload[:view_runtime]
177
+ db_time = payload[:db_runtime]
178
+
179
+ lazy_configurator
180
+ PulseToolbox.redis.multi do
181
+ {
182
+ max_db_time: db_time,
183
+ max_view_time: view_time,
184
+ max_total_time: total_time,
185
+
186
+ p95_db_time: db_time,
187
+ p95_view_time: view_time,
188
+ p95_total_time: total_time,
189
+
190
+ p99_db_time: db_time,
191
+ p99_view_time: view_time,
192
+ p99_total_time: total_time,
193
+
194
+ status_count: {payload[:status].to_s => 1},
195
+ status_total: 1,
196
+
197
+ action_count: {"#{payload[:controller]}##{payload[:action]}" => 1}
198
+ }.each_pair {|name, value| event(name, value)}
199
+ end
119
200
  end
120
201
 
121
202
  # Sends value to sensor by name
122
203
  # @param sensor [Symbol] sensor name
123
204
  # @param value [Float] event value
124
205
  def event(sensor, value)
125
- lazy_configurator.sensor(sensor).event(value.to_i)
206
+ lazy_configurator.sensor(sensor).event(value)
126
207
  end
127
208
 
128
209
  # Adds group to config
@@ -14,9 +14,11 @@ module PulseToolbox
14
14
  # Executes block for each group
15
15
  # @yieldparam group [Symbol] group name
16
16
  # @yieldparam title [String] group title
17
+ # @yieldparam value_title [String] group sensor value meaning
17
18
  def each_group_with_title
18
- sensors_config.each_key do |group|
19
- yield(group, sensors_config[group][:title] || group)
19
+ sensors_config.each_key do |group_name|
20
+ group = sensors_config[group_name]
21
+ yield(group_name, group[:title] || group_name, group[:values] || '')
20
22
  end
21
23
  end
22
24
 
@@ -20,8 +20,14 @@ module PulseToolbox::Server
20
20
  })
21
21
 
22
22
  l.page "Requests" do |p|
23
+
24
+ p.highchart_options({
25
+ chart: {
26
+ height: 300
27
+ }
28
+ })
23
29
 
24
- PulseToolbox::Sensor::Manager.each_group_with_title do |group, title|
30
+ PulseToolbox::Sensor::Manager.each_group_with_title do |group, title, values_label|
25
31
  p.spline title do |w|
26
32
  PulseToolbox::Sensor::Manager.each_sensor_in_group(group) do |s|
27
33
  w.sensor s.name, :color => s.color
@@ -31,8 +37,8 @@ module PulseToolbox::Server
31
37
  w.redraw_interval 10
32
38
 
33
39
  w.show_last_point true
34
- w.values_label "Time"
35
- w.width 10
40
+ w.values_label values_label
41
+ w.width 5
36
42
  end
37
43
  end
38
44
 
@@ -1,3 +1,3 @@
1
1
  module PulseToolbox
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -1,16 +1,16 @@
1
1
  PulseToolbox.redis = Redis.new
2
2
 
3
3
  PulseMeter::Sensor::Timelined::Counter.new(:custom_sensor,
4
- :ttl => 1.hour,
5
- :interval => 1.minute,
6
- :raw_data_ttl => 10.minutes,
7
- :reduce_delay => 2.minutes
4
+ ttl: 1.hour,
5
+ interval: 1.minute,
6
+ raw_data_ttl: 10.minutes,
7
+ reduce_delay: 2.minutes
8
8
  )
9
9
 
10
10
  PulseToolbox::Sensor::Manager.layout do |l|
11
11
  l.page "Custom" do |p|
12
12
  p.spline "Custom sensor" do |w|
13
- w.sensor :custom_sensor, :color => "#0000FF"
13
+ w.sensor :custom_sensor, color: "#0000FF"
14
14
 
15
15
  w.timespan 60 * 60 * 3
16
16
  w.redraw_interval 10
@@ -47,7 +47,7 @@ describe PulseToolbox do
47
47
 
48
48
  describe ".reconnect" do
49
49
  before do
50
- described_class.redis = Redis.new :db => 2
50
+ described_class.redis = Redis.new(db: 2)
51
51
  end
52
52
 
53
53
  it "recreates redis client" do
@@ -29,7 +29,13 @@ describe PulseToolbox::Sensor::Manager do
29
29
  it "sends event to all created sensors" do
30
30
  described_class.create_sensors
31
31
  described_class.each_sensor {|s| s.should_receive(:event)}
32
- described_class.log_request(3, 2, 1)
32
+ described_class.log_request(3, {
33
+ view_runtime: 2,
34
+ db_runtime: 1,
35
+ action: "foo",
36
+ controller: 'BarController',
37
+ status: 200
38
+ })
33
39
  end
34
40
  end
35
41
 
@@ -83,14 +89,14 @@ describe PulseToolbox::Sensor::Manager do
83
89
  let(:name) {:new_sensor}
84
90
  let(:options) {
85
91
  {
86
- :sensor_type => 'timelined/max',
87
- :color => '#0000FF',
88
- :args => {
89
- :ttl => 10.days,
90
- :interval => 10.minutes,
91
- :raw_data_ttl => 10.hours,
92
- :reduce_delay => 20.minutes,
93
- :annotation => "Annotation"
92
+ sensor_type: 'timelined/max',
93
+ color: '#0000FF',
94
+ args: {
95
+ ttl: 10.days,
96
+ interval: 10.minutes,
97
+ raw_data_ttl: 10.hours,
98
+ reduce_delay: 20.minutes,
99
+ annotation: "Annotation"
94
100
  }
95
101
  }
96
102
  }
@@ -5,18 +5,18 @@ describe PulseToolbox::Sensor::Mixins::Iterators do
5
5
  extend PulseToolbox::Sensor::Mixins::Iterators
6
6
  class_attribute :sensors_config
7
7
  self.sensors_config = {
8
- :g1 => {
9
- :title => "G1",
10
- :sensors => {
11
- :s11 => "sensor11",
12
- :s12 => "sensor12"
8
+ g1: {
9
+ title: "G1",
10
+ sensors: {
11
+ s11: "sensor11",
12
+ s12: "sensor12"
13
13
  }
14
14
  },
15
- :g2 => {
16
- :title => "G2",
17
- :sensors => {
18
- :s21 => "sensor21",
19
- :s22 => "sensor22"
15
+ g2: {
16
+ title: "G2",
17
+ sensors: {
18
+ s21: "sensor21",
19
+ s22: "sensor22"
20
20
  }
21
21
  }
22
22
  }
@@ -10,22 +10,26 @@ end
10
10
  describe "/monitoring/pages/:id/widgets" do
11
11
  let(:custom_tab) {1}
12
12
  let(:monitoring_tab) {2}
13
- def visit_tab(tab_id)
13
+
14
+ before(:each) do
14
15
  PulseToolbox::Sensor::Manager.create_sensors
15
- custom = PulseMeter::Sensor::Timelined::Counter.new(:custom_sensor,
16
- :ttl => 1.hour,
17
- :interval => 1.minute,
18
- :raw_data_ttl => 10.minutes,
19
- :reduce_delay => 2.minutes,
20
- :annotation => "custom_sensor"
16
+ PulseMeter::Sensor::Timelined::Counter.new(:custom_sensor,
17
+ ttl: 1.hour,
18
+ interval: 1.minute,
19
+ raw_data_ttl: 10.minutes,
20
+ reduce_delay: 2.minutes,
21
+ annotation: "custom_sensor"
21
22
  )
23
+ end
24
+
25
+ def widgets_on_tab(tab_id)
22
26
  visit "/monitoring/pages/#{tab_id}/widgets"
23
- @widgets = JSON.parse(page.source)
27
+ JSON.parse(page.source)
24
28
  end
25
29
 
26
- def all_annotations
30
+ def sensor_names_on_tab(tab_id)
27
31
  found_annotations = []
28
- @widgets.each do |w|
32
+ widgets_on_tab(tab_id).each do |w|
29
33
  w["series"].each do |s|
30
34
  found_annotations << s["name"]
31
35
  end
@@ -34,21 +38,31 @@ describe "/monitoring/pages/:id/widgets" do
34
38
  end
35
39
 
36
40
  it "returns some groups of widgets" do
37
- visit_tab(monitoring_tab)
38
41
  groups = []
39
42
  PulseToolbox::Sensor::Manager.each_group {|g| groups << g}
40
- @widgets.count.should == groups.count
43
+ widgets_on_tab(monitoring_tab).count.should == groups.count
41
44
  end
42
45
 
43
46
  it "contains all sensors from PulseToolbox::Sensor::Manager config" do
44
- visit_tab(monitoring_tab)
45
- annotations = PulseToolbox::Sensor::Manager.sensors.map(&:annotation)
47
+ PulseToolbox::Sensor::Manager.log_request(3, {
48
+ view_runtime: 2,
49
+ db_runtime: 1,
50
+ action: "foo",
51
+ controller: 'BarController',
52
+ status: 200,
53
+ })
54
+
55
+ annotations = PulseToolbox::Sensor::Manager.sensors.reject{|s|
56
+ s.is_a?(PulseMeter::Sensor::Timelined::HashedCounter)
57
+ }.map(&:annotation)
58
+
59
+ annotations << "Status: 200"
60
+ annotations << "Action: BarController#foo"
46
61
 
47
- annotations.sort.should == all_annotations.sort
62
+ sensor_names_on_tab(monitoring_tab).sort.should == annotations.sort
48
63
  end
49
64
 
50
65
  it "returns widgets of custom page created in initializer" do
51
- visit_tab(custom_tab)
52
- all_annotations.should == ["custom_sensor"]
66
+ sensor_names_on_tab(custom_tab).should == ["custom_sensor"]
53
67
  end
54
68
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pulse-meter-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-16 00:00:00.000000000Z
12
+ date: 2012-06-19 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pulse-meter
16
- requirement: &70196296895280 !ruby/object:Gem::Requirement
16
+ requirement: &70183084727520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70196296895280
24
+ version_requirements: *70183084727520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &70196296894160 !ruby/object:Gem::Requirement
27
+ requirement: &70183084726780 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '3.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70196296894160
35
+ version_requirements: *70183084726780
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rails
38
- requirement: &70196296893420 !ruby/object:Gem::Requirement
38
+ requirement: &70183084726260 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '3.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70196296893420
46
+ version_requirements: *70183084726260
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: capybara
49
- requirement: &70196296892580 !ruby/object:Gem::Requirement
49
+ requirement: &70183084725720 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70196296892580
57
+ version_requirements: *70183084725720
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rack-test
60
- requirement: &70196296891800 !ruby/object:Gem::Requirement
60
+ requirement: &70183084725240 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70196296891800
68
+ version_requirements: *70183084725240
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rails
71
- requirement: &70196296891120 !ruby/object:Gem::Requirement
71
+ requirement: &70183084724800 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70196296891120
79
+ version_requirements: *70183084724800
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rake
82
- requirement: &70196296890200 !ruby/object:Gem::Requirement
82
+ requirement: &70183084724360 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70196296890200
90
+ version_requirements: *70183084724360
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: redcarpet
93
- requirement: &70196296888840 !ruby/object:Gem::Requirement
93
+ requirement: &70183084723940 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70196296888840
101
+ version_requirements: *70183084723940
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rspec
104
- requirement: &70196296886980 !ruby/object:Gem::Requirement
104
+ requirement: &70183084723500 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70196296886980
112
+ version_requirements: *70183084723500
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rspec-rails
115
- requirement: &70196296886100 !ruby/object:Gem::Requirement
115
+ requirement: &70183084723080 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70196296886100
123
+ version_requirements: *70183084723080
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: simplecov
126
- requirement: &70196296884560 !ruby/object:Gem::Requirement
126
+ requirement: &70183084722560 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *70196296884560
134
+ version_requirements: *70183084722560
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: yard
137
- requirement: &70196296882960 !ruby/object:Gem::Requirement
137
+ requirement: &70183084721940 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,7 +142,7 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *70196296882960
145
+ version_requirements: *70183084721940
146
146
  description: Pulse meter toolbox
147
147
  email:
148
148
  - averyanov@gmail.com
@@ -208,7 +208,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
208
208
  version: '0'
209
209
  segments:
210
210
  - 0
211
- hash: 1441616513903231314
211
+ hash: 39999977172173136
212
212
  required_rubygems_version: !ruby/object:Gem::Requirement
213
213
  none: false
214
214
  requirements:
@@ -217,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
217
217
  version: '0'
218
218
  segments:
219
219
  - 0
220
- hash: 1441616513903231314
220
+ hash: 39999977172173136
221
221
  requirements: []
222
222
  rubyforge_project:
223
223
  rubygems_version: 1.8.10