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 +13 -5
- data/Gemfile +0 -1
- data/lib/rhcf/timeseries/redis.rb +185 -251
- data/lib/rhcf/timeseries/version.rb +1 -1
- data/spec/lib/rhcf/timeseries/redis_spec.rb +20 -0
- metadata +28 -28
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YzI2ZTRlZmMyZjBjNTgzNmZjMDljMmJhOGI4MDJkMjRkMmM4ZWE3MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
OTJlN2JhN2VlY2FlNGVkM2M0ZmI5ZDc1MGJjZTliM2RkOWVhZmRiMQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
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,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
|
-
|
10
|
-
|
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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
69
|
-
|
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
|
-
|
77
|
-
|
78
|
-
|
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
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
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
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
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
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
103
|
+
def on_connection(conn)
|
104
|
+
@connection_to_use = conn
|
105
|
+
yield self
|
106
|
+
@connection_to_use = nil
|
107
|
+
end
|
148
108
|
|
149
|
-
|
150
|
-
|
109
|
+
def redis_connection_to_use
|
110
|
+
@connection_to_use || redis_connection
|
111
|
+
end
|
151
112
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
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
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
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
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
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
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
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
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
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
|
-
|
192
|
-
|
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
|
-
|
204
|
-
|
205
|
-
|
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
|
-
|
211
|
-
|
212
|
-
|
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
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
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
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
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
|
-
|
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
|
-
|
283
|
-
|
284
|
-
}
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
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
|
@@ -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.
|
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:
|
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
|
-
-
|
175
|
-
-
|
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: []
|