rhcf-timeseries 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 146cc9e889b48ba83a1dde00fea45287a95f25e9
4
- data.tar.gz: 93d923a9fc1bf50c114e1029ad6e4f5080c17dbc
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YzI2ZTRlZmMyZjBjNTgzNmZjMDljMmJhOGI4MDJkMjRkMmM4ZWE3MA==
5
+ data.tar.gz: !binary |-
6
+ OTJlN2JhN2VlY2FlNGVkM2M0ZmI5ZDc1MGJjZTliM2RkOWVhZmRiMQ==
5
7
  SHA512:
6
- metadata.gz: e38c432a2dc566fbd5796e5786090143d7b615059cc126e29fbd0d5d15dd879396c68daabc5459d52db46123d67643b4fef312ddd33ad26899bcbaa2b2bbeb04
7
- data.tar.gz: c54b9df5b03bb47b6bd5f5c1a51288ed0e264c14c7e3c52eb3086d5369a791479eaa05ef488798947ef5df2e416eea94b4f9dc77d8c9719db279395e6b65ac94
8
+ metadata.gz: !binary |-
9
+ OThmZDUyMTllYjI3ZTU3NmVjODdjYWM0YzhmZTlkMzMzNjM5N2UwZjRlNWY2
10
+ Nzg2ZjY2OTdkZjI1YWVjYWQyMmJjNDlmNGQyOGZkMDJlMjlhMjAzMmM3MDIz
11
+ Yzc3YmI2N2U1OThhMDNlNDIyMjAzZDM5ZmJmMGZmNTQ2ZmU1ZGE=
12
+ data.tar.gz: !binary |-
13
+ MzIxMjdmN2QxYWU5NTc3OGUyNWRlNzhjNGUzNDhmYWY4Y2YwNjI1MDJhMDdj
14
+ ZTQwYTE5MDRhMWFjOTA5YWM3YTViNzMyMDIyYWU2NGJhNzY0ZDQ5MTE3MTZj
15
+ ZTJjOWY4OGRlYmMzZTcyNTUxYjJlYTJhMTg1NGNlNDdjMWJkNmU=
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
- gem 'pry-debugger'
3
2
  # Specify your gem's dependencies in rhcf-timeseries.gemspec
4
3
  gemspec
@@ -1,293 +1,227 @@
1
- #!/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby
2
1
  require 'active_support/core_ext/numeric/time'
3
-
4
- #require 'observer'
5
-
6
2
  require 'micon'
7
3
  require 'date'
8
4
 
9
- class Rhcf::Timeseries::Result
10
- def initialize(subject, from, to, series)
11
- if from > to
12
- raise ArgumentError, "Argument 'from' can not be bigger then 'to'"
13
- end
14
- @series = series
15
- @subject = subject
16
- @from = from
17
- @to = to
18
- end
19
-
5
+ module Rhcf
6
+ module Timeseries
20
7
 
21
- def total(resolution_id=nil)
22
- accumulator={}
23
- points(resolution_id || better_resolution[:id]) do |data|
24
- data[:values].each do |key, value|
25
- accumulator[key]||=0
26
- accumulator[key]+=value
8
+ class Result
9
+ def initialize(subject, from, to, series)
10
+ if from > to
11
+ raise ArgumentError, "Argument 'from' can not be bigger then 'to'"
12
+ end
13
+ @series = series
14
+ @subject = subject
15
+ @from = from
16
+ @to = to
27
17
  end
28
- end
29
- accumulator
30
- end
31
18
 
32
- def points(resolution_id)
33
- list =[]
34
-
35
- point_range(resolution_id) do |point|
36
- values = {}
37
-
38
- @series.events_for_subject_on(@subject, point, resolution_id).each do |event|
39
- value = @series.get('point', @subject, event, resolution_id, point)
40
- values[event] = value.to_i
41
- end
42
-
43
- next if values.empty?
44
- data = {moment: point, values: values }
45
- if block_given?
46
- yield data
47
- else
48
- list << data
49
- end
50
- end
51
- list unless block_given?
52
- end
53
-
54
- def point_range(resolution_id)
55
- #require 'pry-debugger';binding.pry
56
- resolution = @series.resolution(resolution_id)
57
- span = resolution[:span]
58
- ptr = @from.dup
59
- while ptr < @to
60
- point = @series.resolution_value_at(ptr, resolution_id)
61
- yield point
62
- ptr += span.to_i
63
- end
64
- rescue FloatDomainError
65
- # OK
66
- end
19
+ def total(resolution_id=nil)
20
+ accumulator={}
21
+ points(resolution_id || better_resolution[:id]) do |data|
22
+ data[:values].each do |key, value|
23
+ accumulator[key]||=0
24
+ accumulator[key]+=value
25
+ end
26
+ end
27
+ accumulator
28
+ end
67
29
 
68
- def better_resolution
69
- span = @to - @from
70
- resolutions = @series.resolutions.sort_by{|h| h[:span]}.reverse
71
- better = resolutions.find{|r| r[:span] < span / 5} || resolutions.last
72
- end
73
- end
30
+ def points(resolution_id)
31
+ list =[]
74
32
 
33
+ point_range(resolution_id) do |point|
34
+ values = {}
75
35
 
76
- class Rhcf::Timeseries::Redis
77
- inject :logger
78
- inject :redis_connection
79
-
80
- RESOLUTIONS_MAP={
81
- :ever => {span:Float::INFINITY, formatter: "ever"},
82
- :year => {span: 365.days,formatter: "%Y"},
83
- :week => {span: 1.week, formatter: "%Y-CW%w"},
84
- :month => {span: 30.days, formatter: "%Y-%m"},
85
- :day => {span: 1.day, formatter: "%Y-%m-%d"},
86
- :hour => {span: 1.hour, formatter: "%Y-%m-%dT%H"},
87
- :minute => {span: 1.minute, formatter: "%Y-%m-%dT%H:%M"},
88
- :second => {span: 1, formatter: "%Y-%m-%dT%H:%M:%S"},
89
- :"5seconds" => {span: 5.seconds, formatter: ->(time){ [time.strftime("%Y-%m-%dT%H:%M:") , time.to_i % 60/5, '*',5].join('') }},
90
- :"5minutes" => {span: 5.minutes, formatter: ->(time){ [time.strftime("%Y-%m-%dT%H:") , (time.to_i/60) % 60/5, '*',5].join('') }},
91
- :"15minutes" => {span: 15.minutes, formatter: ->(time){ [time.strftime("%Y-%m-%dT%H:") , (time.to_i/60) % 60/15, '*',15].join('') }}
92
-
93
- }
94
- DEFAULT_RESOLUTIONS = RESOLUTIONS_MAP.keys
95
- DEFAULT_MAX_POINTS = 1_024
96
- NAMESPACE_SEPARATOR = '|'
97
-
98
-
99
- def initialize(options = {})
100
- @resolution_ids = options[:resolutions] || DEFAULT_RESOLUTIONS
101
- @max_points = options[:max_points] || DEFAULT_MAX_POINTS
102
- @prefix=self.class.name
103
- end
36
+ @series.events_for_subject_on(@subject, point, resolution_id).each do |event|
37
+ value = @series.get('point', @subject, event, resolution_id, point)
38
+ values[event] = value.to_i
39
+ end
104
40
 
105
- def store(subject, event_point_hash, moment = Time.now)
106
- descend(subject) do |subject_path|
107
- event_point_hash.each do |event, point_value|
108
- descend(event) do |event_path|
109
- resolutions_of(moment) do |resolution_name, resolution_value|
110
- store_point_value(subject_path, event_path, resolution_name, resolution_value, point_value)
41
+ next if values.empty?
42
+ data = {moment: point, values: values }
43
+ if block_given?
44
+ yield data
45
+ else
46
+ list << data
111
47
  end
112
48
  end
49
+ list unless block_given?
113
50
  end
114
- end
115
- end
116
51
 
52
+ def point_range(resolution_id)
53
+ resolution = @series.resolution(resolution_id)
54
+ span = resolution[:span]
55
+ ptr = @from.dup
56
+ while ptr < @to
57
+ point = @series.resolution_value_at(ptr, resolution_id)
58
+ yield point
59
+ ptr += span.to_i
60
+ end
61
+ rescue FloatDomainError
62
+ # OK
63
+ end
117
64
 
118
- def resolutions_of(moment)
119
- @resolution_ids.each do |res_id|
120
- yield res_id, resolution_value_at(moment, res_id)
121
- end
122
- end
123
-
124
- def resolution_value_at(moment, res_id)
125
- time_resolution_formater = RESOLUTIONS_MAP[res_id][:formatter]
126
- case time_resolution_formater
127
- when String
128
- moment.strftime(time_resolution_formater)
129
- when Proc
130
- time_resolution_formater.call(moment)
131
- else
132
- raise ArgumentError, "Unexpected moment formater type #{time_resolution_formater.class}"
65
+ def better_resolution
66
+ span = @to - @from
67
+ resolutions = @series.resolutions.sort_by{|h| h[:span]}.reverse
68
+ better = resolutions.find{|r| r[:span] < span / 5} || resolutions.last
69
+ end
133
70
  end
134
- end
135
71
 
136
72
 
137
- def descend(path, &block)
138
- return if path.empty? or path == "."
139
- block.call(path)
140
- descend(File.dirname(path), &block)
141
- end
73
+ class Redis
74
+ inject :logger
75
+ inject :redis_connection
76
+
77
+ RESOLUTIONS_MAP={
78
+ :ever => {span:Float::INFINITY, formatter: "ever", ttl: (2 * 366).days},
79
+ :year => {span: 365.days,formatter: "%Y", ttl: (2 * 366).days},
80
+ :week => {span: 1.week, formatter: "%Y-CW%w", ttl: 90.days},
81
+ :month => {span: 30.days, formatter: "%Y-%m", ttl: 366.days},
82
+ :day => {span: 1.day, formatter: "%Y-%m-%d", ttl: 30.days},
83
+ :hour => {span: 1.hour, formatter: "%Y-%m-%dT%H", ttl: 24.hours},
84
+ :minute => {span: 1.minute, formatter: "%Y-%m-%dT%H:%M", ttl: 120.minutes},
85
+ :second => {span: 1, formatter: "%Y-%m-%dT%H:%M:%S", ttl: 1.hour},
86
+ :"5seconds" => {span: 5.seconds, formatter: ->(time){ [time.strftime("%Y-%m-%dT%H:%M:") , time.to_i % 60/5, '*',5].join('') }, ttl: 1.hour},
87
+ :"5minutes" => {span: 5.minutes, formatter: ->(time){ [time.strftime("%Y-%m-%dT%H:") , (time.to_i/60) % 60/5, '*',5].join('') }, ttl: 3.hour},
88
+ :"15minutes" => {span: 15.minutes, formatter: ->(time){ [time.strftime("%Y-%m-%dT%H:") , (time.to_i/60) % 60/15, '*',15].join('') }, ttl: 24.hours}
89
+
90
+ }
91
+ DEFAULT_RESOLUTIONS = RESOLUTIONS_MAP.keys
92
+ DEFAULT_MAX_POINTS = 1_024
93
+ NAMESPACE_SEPARATOR = '|'
94
+
95
+
96
+ def initialize(options = {})
97
+ @resolution_ids = options[:resolutions] || DEFAULT_RESOLUTIONS
98
+ @max_points = options[:max_points] || DEFAULT_MAX_POINTS
99
+ @prefix = options[:prefix] || self.class.name
100
+ @connection_to_use = nil
101
+ end
142
102
 
143
- def store_point_event( resolution_name, resolution_value, subject_path, event_path)
144
- key = [@prefix, 'event_set', resolution_name, resolution_value, subject_path].join(NAMESPACE_SEPARATOR)
145
- logger.debug("EVENTSET SADD #{key} -> #{event_path}")
146
- redis_connection.sadd(key, event_path)
147
- end
103
+ def on_connection(conn)
104
+ @connection_to_use = conn
105
+ yield self
106
+ @connection_to_use = nil
107
+ end
148
108
 
149
- def store_point_value( subject_path, event_path, resolution_name, resolution_value, point_value)
150
- store_point_event(resolution_name, resolution_value, subject_path, event_path)
109
+ def redis_connection_to_use
110
+ @connection_to_use || redis_connection
111
+ end
151
112
 
152
- key = [@prefix, 'point' ,subject_path, event_path, resolution_name, resolution_value].join(NAMESPACE_SEPARATOR)
153
- logger.debug("SETTING KEY #{key}")
154
- redis_connection.incrby(key, point_value)
155
- end
113
+ def store(subject, event_point_hash, moment = Time.now)
114
+ resolutions = resolutions_of(moment)
115
+
116
+ descend(subject) do |subject_path|
117
+ event_point_hash.each do |event, point_value|
118
+ descend(event) do |event_path|
119
+ resolutions.each do |res|
120
+ resolution_name, resolution_value = *res
121
+ store_point_value(subject_path, event_path, resolution_name, resolution_value, point_value)
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
156
127
 
157
- def find(subject, from, to = Time.now)
158
- Rhcf::Timeseries::Result.new(subject, from, to, self)
159
- end
160
128
 
161
- def flush!
162
- every_key{|a_key| delete_key(a_key)}
163
- end
164
129
 
165
- def every_key(pattern=nil, &block)
166
- pattern = [@prefix, pattern,'*'].compact.join(NAMESPACE_SEPARATOR)
167
- redis_connection.keys(pattern).each do |key|
168
- yield key
169
- end
170
- end
130
+ def resolutions_of(moment)
131
+ @resolution_ids.collect do |res_id|
132
+ [res_id, resolution_value_at(moment, res_id)]
133
+ end
134
+ end
171
135
 
172
- def delete_key(a_key)
173
- logger.debug("DELETING KEY #{a_key}")
174
- redis_connection.del(a_key)
175
- end
136
+ def resolution_value_at(moment, res_id)
137
+ res_config = RESOLUTIONS_MAP[res_id]
138
+ if res_config.nil?
139
+ fail "No resolution config for id: #{res_id.class}:#{res_id}"
140
+ end
176
141
 
177
- def keys(*a_key)
178
- raise "GIVEUP"
179
- a_key = [@prefix, a_key].flatten.join(NAMESPACE_SEPARATOR)
180
- logger.debug("FINDING KEY #{a_key}")
181
- redis_connection.keys(a_key).collect{|k| k.split(NAMESPACE_SEPARATOR)[1,1000].join(NAMESPACE_SEPARATOR) }
182
- end
142
+ time_resolution_formater = res_config[:formatter]
143
+ case time_resolution_formater
144
+ when String
145
+ moment.strftime(time_resolution_formater)
146
+ when Proc
147
+ time_resolution_formater.call(moment)
148
+ else
149
+ raise ArgumentError, "Unexpected moment formater type #{time_resolution_formater.class}"
150
+ end
151
+ end
183
152
 
184
- def get(*a_key)
185
- a_key = [@prefix, a_key].flatten.join(NAMESPACE_SEPARATOR)
186
- logger.debug("GETTING KEY #{a_key}")
187
- redis_connection.get(a_key)
188
- end
153
+ def descend(path, &block)
154
+ return if path.empty? or path == "."
155
+ block.call(path)
156
+ descend(File.dirname(path), &block)
157
+ end
189
158
 
159
+ def store_point_event( resolution_name, resolution_value, subject_path, event_path)
160
+ key = [@prefix, 'event_set', resolution_name, resolution_value, subject_path].join(NAMESPACE_SEPARATOR)
161
+ logger.debug("EVENTSET SADD #{key} -> #{event_path}")
162
+ redis_connection_to_use.sadd(key, event_path)
163
+ end
190
164
 
191
- def resolution(id)
192
- res = RESOLUTIONS_MAP[id]
193
- raise ArgumentError, "Invalid resolution name #{id} for this time series" if res.nil?
194
- res.merge(:id => id)
195
- end
196
- def resolutions
197
- @resolution_ids.collect do |id|
198
- resolution(id)
199
- end
200
- end
165
+ def store_point_value( subject_path, event_path, resolution_name, resolution_value, point_value)
166
+ store_point_event(resolution_name, resolution_value, subject_path, event_path)
201
167
 
168
+ key = [@prefix, 'point' ,subject_path, event_path, resolution_name, resolution_value].join(NAMESPACE_SEPARATOR)
169
+ logger.debug("SETTING KEY #{key}")
170
+ redis_connection_to_use.incrby(key, point_value)
171
+ redis_connection_to_use.expire(key, RESOLUTIONS_MAP[resolution_name][:ttl])
172
+ end
202
173
 
203
- def events_for_subject_on(subject, point, resolution_id)
204
- key = [@prefix, 'event_set', resolution_id, point, subject].join(NAMESPACE_SEPARATOR)
205
- logger.debug("EVENTSET SMEMBERS #{key}")
206
- redis_connection.smembers(key)
207
- end
208
- end
174
+ def find(subject, from, to = Time.now)
175
+ Rhcf::Timeseries::Result.new(subject, from, to, self)
176
+ end
209
177
 
210
- #require 'json'
211
- #$:.unshift File.dirname(__FILE__)
212
- #require 'hash_storer'
213
-
214
- =begin
215
- class Redis
216
- # include Observable
217
- attr_reader :prefix, :scales, :max_points
218
-
219
-
220
- def initialize(prefix, scales, max_points, store = HashStorer.new)
221
- @lasts = {}
222
- @prefix = prefix
223
- @scales = {}
224
- @store = store
225
- scales.each do |s|
226
- @scales[s] = eval(s)
227
- end
228
- @max_point = max_points
229
- end
230
-
231
- def persist
232
- @store.persist if @store.respond_to?( 'persist' )
233
- end
234
-
235
-
236
- def add(dimension, value, time = Time.now)
237
- @scales.each do |name, v|
238
- add_to_scale(name, dimension, value, time)
239
- end
240
- end
241
-
242
- def add_to_scale(scale_name, dimension, value, time = Time.now)
243
- scale = @scales[scale_name]
244
- time = time.to_i
245
- scale_time = time - (time % scale)
246
- scale_key = [@prefix, dimension, scale_name].join('-')
247
- last = @store.increment(scale_key, scale_time, value, time, @lasts["#{scale_name}-#{dimension}"])
248
- @lasts["#{scale_name}-#{dimension}"] = last['last']
249
- changed
250
- notify_observers(scale_key, last)
251
- end
252
- end
178
+ def flush!
179
+ every_key{|a_key| delete_key(a_key)}
180
+ end
253
181
 
182
+ def every_key(pattern=nil, &block)
183
+ pattern = [@prefix, pattern,'*'].compact.join(NAMESPACE_SEPARATOR)
184
+ redis_connection_to_use.keys(pattern).each do |key|
185
+ yield key
186
+ end
187
+ end
254
188
 
255
- class RedisTimeSeriesUpdater
256
- def initialize(channel_prefix, observable, redis)
257
- @channel_prefix = channel_prefix
258
- @observable = observable
259
- @redis = redis
260
- observable.add_observer(self)
261
- end
189
+ def delete_key(a_key)
190
+ logger.debug("DELETING KEY #{a_key}")
191
+ redis_connection_to_use.del(a_key)
192
+ end
262
193
 
263
- def update(key, data)
264
- key += '-realtime'
265
- # puts ['broadcasting', data, 'on', key].join(' ')
266
- @redis.publish(key, data.to_json)
267
- end
268
- end
194
+ def keys(*a_key)
195
+ raise "GIVEUP"
196
+ a_key = [@prefix, a_key].flatten.join(NAMESPACE_SEPARATOR)
197
+ logger.debug("FINDING KEY #{a_key}")
198
+ redis_connection_to_use.keys(a_key).collect{|k| k.split(NAMESPACE_SEPARATOR)[1,1000].join(NAMESPACE_SEPARATOR) }
199
+ end
269
200
 
270
- redis = Redis.new
201
+ def get(*a_key)
202
+ a_key = [@prefix, a_key].flatten.join(NAMESPACE_SEPARATOR)
203
+ logger.debug("GETTING KEY #{a_key}")
204
+ redis_connection_to_use.get(a_key)
205
+ end
271
206
 
272
- ts1 = TimeSeries.new('mymachine', ['1.hour', '15.minutes', '1.minute', '1.second', '10.seconds'], 1000)
273
- #ts1 = TimeSeries.new('mymachine', [ '1.second'], 1000)
274
- pub = RedisTimeSeriesUpdater.new('realtime', ts1, redis)
275
207
 
208
+ def resolution(id)
209
+ res = RESOLUTIONS_MAP[id]
210
+ raise ArgumentError, "Invalid resolution name #{id} for this time series" if res.nil?
211
+ res.merge(:id => id)
212
+ end
213
+ def resolutions
214
+ @resolution_ids.collect do |id|
215
+ resolution(id)
216
+ end
217
+ end
276
218
 
277
- alive = true
278
- Signal.trap('INT'){
279
- alive = false
280
- }
281
219
 
282
- Signal.trap('USR1'){
283
- pub.refresh
284
- }
285
- while alive
286
- sleep 1
287
- ts1.add('cpu_load', %x{uptime | sed 's/.*: //;s/,.*//'}.strip.to_f, Time.now)
288
- ts1.add('rx', %x{ifconfig eth0| grep 'RX bytes' | sed 's/ (.*//;s/.*://'}.strip.to_f,Time.now)
289
- ts1.add('tx', %x{ifconfig eth0| grep 'TX bytes' | sed 's/.*TX.*://;s/ .*//'}.strip.to_f,Time.now)
220
+ def events_for_subject_on(subject, point, resolution_id)
221
+ key = [@prefix, 'event_set', resolution_id, point, subject].join(NAMESPACE_SEPARATOR)
222
+ logger.debug("EVENTSET SMEMBERS #{key}")
223
+ redis_connection_to_use.smembers(key)
224
+ end
225
+ end
226
+ end
290
227
  end
291
-
292
- ts1.persist
293
- =end
@@ -1,5 +1,5 @@
1
1
  module Rhcf
2
2
  module Timeseries
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -143,4 +143,24 @@ describe Rhcf::Timeseries::Redis do
143
143
 
144
144
 
145
145
  end
146
+
147
+ it "causes no stack overflow" do
148
+ params_hash = {
149
+ sender_domain: 'example.com',
150
+ realm: 'realm',
151
+ destination_domain: 'lvh.me',
152
+ mail_server: 'aserver',
153
+ bind_interface: '11.1.1.11'
154
+ }
155
+
156
+ {
157
+ 'sender_domain' => '%{sender_domain}',
158
+ 'realm_and_sender_domain' => '%{realm}/%{sender_domain}',
159
+ 'mail_server_and_interface' => '%{mail_server}/%{bind_interface}',
160
+ 'realm_and_destination_domain' => '%{realm}/%{destination_domain}',
161
+ 'destination_domain' => '%{destination_domain}'
162
+ }.each do |known, unknown|
163
+ subject.store(known % params_hash, {[(unknown % params_hash),'sent'].join('/') => 1})
164
+ end
165
+ end
146
166
  end
metadata CHANGED
@@ -1,167 +1,167 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhcf-timeseries
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Romeu Fonseca
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-04 00:00:00.000000000 Z
11
+ date: 2015-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.5'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - ! '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: redis
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - ! '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: guard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - ! '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: guard-rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - ! '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - ! '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: guard-bundler
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - ! '>='
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - ! '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: simplecov
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - ! '>='
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - ! '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: timecop
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - ! '>='
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - ! '>='
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: activesupport
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ">="
143
+ - - ! '>='
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ">="
150
+ - - ! '>='
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: micon
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ">="
157
+ - - ! '>='
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ">="
164
+ - - ! '>='
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  description: Gem to allow your system to keep record of time series on rhcf
@@ -171,8 +171,8 @@ executables: []
171
171
  extensions: []
172
172
  extra_rdoc_files: []
173
173
  files:
174
- - ".gitignore"
175
- - ".rspec"
174
+ - .gitignore
175
+ - .rspec
176
176
  - Gemfile
177
177
  - Guardfile
178
178
  - LICENSE.txt
@@ -196,12 +196,12 @@ require_paths:
196
196
  - lib
197
197
  required_ruby_version: !ruby/object:Gem::Requirement
198
198
  requirements:
199
- - - ">="
199
+ - - ! '>='
200
200
  - !ruby/object:Gem::Version
201
201
  version: '0'
202
202
  required_rubygems_version: !ruby/object:Gem::Requirement
203
203
  requirements:
204
- - - ">="
204
+ - - ! '>='
205
205
  - !ruby/object:Gem::Version
206
206
  version: '0'
207
207
  requirements: []