event-counter 0.0.1 → 0.1.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
- data/.gitignore +1 -0
- data/.travis.yml +19 -0
- data/Appraisals +11 -0
- data/CHANGELOG.md +6 -0
- data/Gemfile +4 -0
- data/README.md +65 -28
- data/event-counter.gemspec +2 -7
- data/gemfiles/pg_ar_30.gemfile +12 -0
- data/gemfiles/pg_ar_30.gemfile.lock +60 -0
- data/gemfiles/pg_ar_31.gemfile +12 -0
- data/gemfiles/pg_ar_31.gemfile.lock +60 -0
- data/gemfiles/pg_ar_32.gemfile +12 -0
- data/gemfiles/pg_ar_32.gemfile.lock +60 -0
- data/gemfiles/pg_ar_40.gemfile +12 -0
- data/gemfiles/pg_ar_40.gemfile.lock +65 -0
- data/gemfiles/pg_ar_41.gemfile +12 -0
- data/gemfiles/pg_ar_41.gemfile.lock +65 -0
- data/lib/event_counter.rb +18 -6
- data/lib/event_counter/active_record_extension.rb +101 -85
- data/lib/event_counter/version.rb +1 -1
- data/log/.gitkeep +0 -0
- data/spec/fixtures/.gitkeep +0 -0
- data/spec/lib/event_counter_spec.rb +61 -21
- data/spec/lib/performance_spec.rb +82 -31
- data/spec/spec_helper.rb +10 -13
- data/spec/support/matchers.rb +6 -4
- metadata +26 -68
- data/spec/support/fabrications.rb +0 -2
data/log/.gitkeep
ADDED
File without changes
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe EventCounter do
|
4
|
-
let(:ball) {
|
4
|
+
let(:ball) { Ball.create! }
|
5
5
|
|
6
6
|
it 'has version' do
|
7
7
|
expect(EventCounter::VERSION).to match(/\d+\.\d+\.\d+/)
|
@@ -15,7 +15,7 @@ describe EventCounter do
|
|
15
15
|
expected = {
|
16
16
|
countable_id: ball.id,
|
17
17
|
countable_type: ball.class.name,
|
18
|
-
created_at: Time.now.floor(300),
|
18
|
+
created_at: Time.zone.now.floor(300),
|
19
19
|
name: 'rotations',
|
20
20
|
value: 3
|
21
21
|
}.with_indifferent_access
|
@@ -27,7 +27,7 @@ describe EventCounter do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it '#make on time' do
|
30
|
-
on_time = Time.mktime(
|
30
|
+
on_time = Time.mktime(2014, 1, 1, 1, 14).in_time_zone
|
31
31
|
expect {
|
32
32
|
counter = ball.rotations.make(
|
33
33
|
3, on_time: on_time)
|
@@ -48,7 +48,7 @@ describe EventCounter do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it '#make on time with interval as symbol' do
|
51
|
-
on_time = Time.mktime(
|
51
|
+
on_time = Time.mktime(2014, 1, 1, 1, 1).in_time_zone
|
52
52
|
[:week, :month, :year].each do |interval|
|
53
53
|
expect {
|
54
54
|
counter = ball.send(:"rotations_by_#{interval}").make(
|
@@ -73,7 +73,7 @@ describe EventCounter do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
describe Ball do
|
76
|
-
let(:ball) {
|
76
|
+
let(:ball) { Ball.create! }
|
77
77
|
|
78
78
|
it 'creates a new counter while incrementing' do
|
79
79
|
expect {
|
@@ -230,12 +230,12 @@ describe Ball do
|
|
230
230
|
|
231
231
|
def setup_counters(countable_count = 1)
|
232
232
|
[1, 1, 2, 3, 5, 8, 13, 21, 34].each do |n|
|
233
|
-
on_time = Time.mktime(
|
233
|
+
on_time = Time.mktime(2014, 1, 1, 1, n).in_time_zone
|
234
234
|
if countable_count == 1
|
235
235
|
ball.rotations.make n, on_time: on_time
|
236
236
|
else
|
237
237
|
countable_count.times do
|
238
|
-
|
238
|
+
Ball.create!.rotations.make n, on_time: on_time
|
239
239
|
end
|
240
240
|
end
|
241
241
|
end
|
@@ -282,9 +282,9 @@ describe Ball do
|
|
282
282
|
end
|
283
283
|
|
284
284
|
it 'with a greater interval and a time range' do
|
285
|
-
range_start = Time.mktime
|
286
|
-
range_end = Time.mktime
|
287
|
-
range = range_start..range_end
|
285
|
+
range_start = Time.mktime 2014, 1, 1, 1, 15
|
286
|
+
range_end = Time.mktime 2014, 1, 1, 1, 45
|
287
|
+
range = range_start.in_time_zone..range_end.in_time_zone
|
288
288
|
|
289
289
|
data = [ [ 10, 13 ], [ 20, 21 ], [ 30, 34 ], [ 40, 0] ]
|
290
290
|
|
@@ -293,7 +293,7 @@ describe Ball do
|
|
293
293
|
end
|
294
294
|
|
295
295
|
it 'with a greater interval as symbol' do
|
296
|
-
beginning_of_week = Time.mktime(
|
296
|
+
beginning_of_week = Time.mktime(2014).in_time_zone.beginning_of_week
|
297
297
|
|
298
298
|
data = [ [ beginning_of_week, 88 ] ]
|
299
299
|
|
@@ -305,29 +305,64 @@ describe Ball do
|
|
305
305
|
|
306
306
|
context '.data_for' do
|
307
307
|
|
308
|
+
subject { Ball }
|
309
|
+
|
308
310
|
before { setup_counters(3) }
|
309
311
|
|
310
312
|
it 'with a default interval' do
|
311
313
|
data = [
|
312
314
|
# [ minute, value ]
|
313
|
-
[ 0, 21
|
314
|
-
[ 5, 39
|
315
|
+
[ 0, 21 ],
|
316
|
+
[ 5, 39 ],
|
315
317
|
[ 10, 39 ],
|
316
|
-
[ 15, 0
|
318
|
+
[ 15, 0 ],
|
317
319
|
[ 20, 63 ],
|
318
|
-
[ 25, 0
|
320
|
+
[ 25, 0 ],
|
319
321
|
[ 30, 102 ]
|
320
322
|
]
|
321
323
|
expect(subject.data_for(:rotations)).to eql_data(data)
|
322
324
|
end
|
323
325
|
|
326
|
+
it 'with a greater interval' do
|
327
|
+
data = [ [ 0, 60 ], [ 10, 39 ], [ 20, 63 ], [ 30, 102 ] ]
|
328
|
+
|
329
|
+
expect(subject.data_for(:rotations, interval: 10.minutes))
|
330
|
+
.to eql_data(data)
|
331
|
+
end
|
332
|
+
|
333
|
+
it 'with a greater interval within range' do
|
334
|
+
data = [ [ 10, 39 ], [ 20, 63 ] ]
|
335
|
+
|
336
|
+
range_start = Time.mktime(2014, 1, 1, 1, 15).in_time_zone
|
337
|
+
range_end = Time.mktime(2014, 1, 1, 1, 29).in_time_zone
|
338
|
+
range = range_start..range_end
|
339
|
+
|
340
|
+
expect(subject.data_for(:rotations, interval: 10.minutes, range: range))
|
341
|
+
.to eql_data(data)
|
342
|
+
end
|
343
|
+
|
324
344
|
it 'with a greater interval as symbol and a simple data' do
|
325
|
-
|
326
|
-
data = [ [
|
327
|
-
|
345
|
+
bmonth = Time.mktime(2014, 1, 1).in_time_zone.beginning_of_month
|
346
|
+
data = [ [ bmonth, 264 ] ]
|
347
|
+
|
348
|
+
expect(subject.data_for(:rotations, interval: :month))
|
349
|
+
.to match_array(data)
|
328
350
|
end
|
329
351
|
|
330
|
-
it 'with a greater interval as symbol and a
|
352
|
+
it 'with a greater interval as symbol and a simple data within range' do
|
353
|
+
bmonth = Time.mktime(2014, 1, 1).in_time_zone.beginning_of_month
|
354
|
+
data = [ [ bmonth, 264 ] ]
|
355
|
+
|
356
|
+
range_start = bmonth
|
357
|
+
range_end = bmonth.end_of_month
|
358
|
+
range = range_start..range_end
|
359
|
+
|
360
|
+
expect(subject.data_for(:rotations, interval: :month, range: range))
|
361
|
+
.to match_array(data)
|
362
|
+
end
|
363
|
+
|
364
|
+
|
365
|
+
it 'with a greater interval as symbol on large data set within range' do
|
331
366
|
EventCounter.all.each do |counter|
|
332
367
|
11.times do |x|
|
333
368
|
created_at = counter.created_at - (x + 1).months
|
@@ -337,9 +372,14 @@ describe Ball do
|
|
337
372
|
end
|
338
373
|
end
|
339
374
|
|
340
|
-
data = (
|
375
|
+
data = (6..12).map { |x| [ Time.mktime(2013, x).in_time_zone, 264 ] }
|
376
|
+
|
377
|
+
range_start = data[0][0].beginning_of_month
|
378
|
+
range_end = data[-1][0].end_of_month
|
379
|
+
range = range_start..range_end
|
341
380
|
|
342
|
-
expect(subject.data_for(:rotations, interval: :month))
|
381
|
+
expect(subject.data_for(:rotations, interval: :month, range: range))
|
382
|
+
.to match_array(data)
|
343
383
|
end
|
344
384
|
|
345
385
|
end
|
@@ -1,55 +1,106 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Ball,
|
3
|
+
describe Ball, slow: true do
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
before(:suite) do
|
6
|
+
DatabaseCleaner.strategy = :truncation
|
7
|
+
DatabaseCleaner.clean_with(:truncation)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:range_start) { (Time.mktime 2013, 7).in_time_zone.beginning_of_month }
|
11
|
+
let(:range_end) { (Time.mktime 2014, 6).in_time_zone.end_of_month }
|
7
12
|
let(:range) { range_start..range_end }
|
8
13
|
|
9
|
-
|
10
|
-
|
14
|
+
def disable_logging(&blk)
|
15
|
+
logger = ActiveRecord::Base.logger
|
11
16
|
ActiveRecord::Base.logger = nil
|
17
|
+
yield
|
18
|
+
ActiveRecord::Base.logger = logger
|
12
19
|
end
|
13
20
|
|
14
|
-
|
15
|
-
|
21
|
+
|
22
|
+
def connection
|
23
|
+
ActiveRecord::Base.connection.raw_connection
|
16
24
|
end
|
17
25
|
|
18
|
-
def setup_data(countable =
|
19
|
-
|
20
|
-
|
26
|
+
def setup_data(countable = 1000, step = 1.day)
|
27
|
+
|
28
|
+
ball = Ball.create!
|
29
|
+
|
30
|
+
(Time.mktime(2012).to_i..Time.mktime(2015).to_i).step(step) do |i|
|
31
|
+
on_time = Time.at(i)
|
32
|
+
ball.rotations.make on_time: on_time
|
33
|
+
end
|
34
|
+
|
35
|
+
path = File.expand_path('../../fixtures/event_counters.sql', __FILE__)
|
36
|
+
|
37
|
+
skip_count = 0
|
38
|
+
|
21
39
|
|
22
|
-
|
23
|
-
|
24
|
-
|
40
|
+
export_sql = "COPY event_counters TO STDOUT (DELIMITER '|')"
|
41
|
+
connection.copy_data(export_sql) do
|
42
|
+
File.open(path, 'w') do |f|
|
43
|
+
while line = connection.get_copy_data
|
44
|
+
skip_count += 1
|
45
|
+
f.write(line)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
File.open(path, 'a+') do |f|
|
51
|
+
lines = f.readlines
|
52
|
+
last_ids = lines.last.split('|')[0, 4]
|
53
|
+
id, countable_id = last_ids.first.to_i, last_ids.last.to_i
|
54
|
+
(2..countable).each do |i|
|
55
|
+
countable_id += 1
|
56
|
+
lines.each do |line|
|
57
|
+
id += 1
|
58
|
+
split = line.split('|')
|
59
|
+
split[0] = id
|
60
|
+
split[3] = countable_id
|
61
|
+
f.write split.join('|')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
import_sql = "COPY event_counters FROM STDIN (DELIMITER '|')"
|
67
|
+
connection.copy_data(import_sql) do
|
68
|
+
File.open(path, 'r') do |f|
|
69
|
+
i = 0
|
70
|
+
while line = f.gets
|
71
|
+
i += 1
|
72
|
+
next if i <= skip_count
|
73
|
+
connection.put_copy_data line
|
74
|
+
end
|
25
75
|
end
|
26
76
|
end
|
27
77
|
end
|
28
78
|
|
29
79
|
context '#data_for' do
|
30
80
|
|
31
|
-
before { setup_data }
|
32
|
-
|
33
81
|
it 'performance is adequate' do
|
82
|
+
disable_logging { setup_data }
|
83
|
+
|
34
84
|
data = [
|
35
|
-
{"created_at"=>"
|
36
|
-
{"created_at"=>"
|
37
|
-
{"created_at"=>"
|
38
|
-
{"created_at"=>"
|
39
|
-
{"created_at"=>"
|
40
|
-
{"created_at"=>"
|
41
|
-
{"created_at"=>"
|
42
|
-
{"created_at"=>"
|
43
|
-
{"created_at"=>"
|
44
|
-
{"created_at"=>"
|
45
|
-
{"created_at"=>"
|
46
|
-
{"created_at"=>"
|
85
|
+
{"created_at"=>"2013-07-01 00:00:00", "value"=>"31000"},
|
86
|
+
{"created_at"=>"2013-08-01 00:00:00", "value"=>"31000"},
|
87
|
+
{"created_at"=>"2013-09-01 00:00:00", "value"=>"30000"},
|
88
|
+
{"created_at"=>"2013-10-01 00:00:00", "value"=>"31000"},
|
89
|
+
{"created_at"=>"2013-11-01 00:00:00", "value"=>"30000"},
|
90
|
+
{"created_at"=>"2013-12-01 00:00:00", "value"=>"31000"},
|
91
|
+
{"created_at"=>"2014-01-01 00:00:00", "value"=>"31000"},
|
92
|
+
{"created_at"=>"2014-02-01 00:00:00", "value"=>"28000"},
|
93
|
+
{"created_at"=>"2014-03-01 00:00:00", "value"=>"31000"},
|
94
|
+
{"created_at"=>"2014-04-01 00:00:00", "value"=>"30000"},
|
95
|
+
{"created_at"=>"2014-05-01 00:00:00", "value"=>"31000"},
|
96
|
+
{"created_at"=>"2014-06-01 00:00:00", "value"=>"30000"}
|
47
97
|
]
|
48
98
|
|
49
|
-
expect {
|
50
|
-
expect(
|
51
|
-
.
|
52
|
-
|
99
|
+
#expect {
|
100
|
+
expect(
|
101
|
+
Ball.data_for(:rotations, interval: :month, range: range, raw: true)
|
102
|
+
).to match_array(data)
|
103
|
+
#}.to take_less_than(0.1).seconds
|
53
104
|
end
|
54
105
|
end
|
55
106
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,7 +3,6 @@ require 'bundler/setup'
|
|
3
3
|
|
4
4
|
require 'active_record'
|
5
5
|
require 'database_cleaner'
|
6
|
-
require 'fabrication'
|
7
6
|
require 'logger'
|
8
7
|
require 'event_counter'
|
9
8
|
|
@@ -20,11 +19,12 @@ YAML.load(File.open(conf).read).values.each do |config|
|
|
20
19
|
ActiveRecord::Base.establish_connection config
|
21
20
|
end
|
22
21
|
|
22
|
+
ActiveRecord::Base.default_timezone = :utc
|
23
|
+
Time.zone = 'Moscow'
|
24
|
+
|
23
25
|
ActiveRecord::Schema.define do
|
24
26
|
self.verbose = false
|
25
27
|
|
26
|
-
create_table :cubes, force: true
|
27
|
-
|
28
28
|
create_table :balls, force: true
|
29
29
|
|
30
30
|
create_table :event_counters, force: true do |t|
|
@@ -35,9 +35,9 @@ ActiveRecord::Schema.define do
|
|
35
35
|
t.datetime :created_at
|
36
36
|
end
|
37
37
|
|
38
|
-
add_index :event_counters, :
|
39
|
-
add_index :event_counters, [:countable_type, :name, :countable_id
|
40
|
-
name: '
|
38
|
+
add_index :event_counters, :created_at#, name: 'idx_created_at_desc'
|
39
|
+
add_index :event_counters, [:countable_type, :name, :countable_id],
|
40
|
+
name: 'idx_composite'
|
41
41
|
end
|
42
42
|
|
43
43
|
# :nodoc:
|
@@ -54,18 +54,15 @@ Dir[File.expand_path('../support/*.rb', __FILE__)].each do |file|
|
|
54
54
|
end
|
55
55
|
|
56
56
|
RSpec.configure do |config|
|
57
|
+
|
57
58
|
config.before(:suite) do
|
58
59
|
DatabaseCleaner.strategy = :transaction
|
59
60
|
DatabaseCleaner.clean_with(:truncation)
|
60
61
|
end
|
61
62
|
|
62
|
-
config.
|
63
|
-
DatabaseCleaner.
|
64
|
-
end
|
65
|
-
|
66
|
-
config.after(:each) do
|
67
|
-
DatabaseCleaner.clean
|
63
|
+
config.around(:each) do |example|
|
64
|
+
DatabaseCleaner.cleaning { example.run }
|
68
65
|
end
|
69
66
|
|
70
|
-
config.filter_run_excluding
|
67
|
+
config.filter_run_excluding slow: true unless ENV['RUN_ALL']
|
71
68
|
end
|
data/spec/support/matchers.rb
CHANGED
@@ -11,10 +11,12 @@ RSpec::Matchers.define :be_eql do |expected|
|
|
11
11
|
diffable
|
12
12
|
end
|
13
13
|
|
14
|
-
RSpec
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
module RSpec
|
15
|
+
module Matchers
|
16
|
+
def eql_data(items)
|
17
|
+
items.map! { |a, b| [ Time.mktime(2014, 1, 1, 1, a).in_time_zone, b ] }
|
18
|
+
contain_exactly(*items)
|
19
|
+
end
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
metadata
CHANGED
@@ -1,113 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: event-counter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Orel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3'
|
20
20
|
type: :runtime
|
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: '3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.7'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.7'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: database_cleaner
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
31
|
+
- - ">="
|
74
32
|
- !ruby/object:Gem::Version
|
75
33
|
version: '3'
|
76
|
-
type: :
|
34
|
+
type: :runtime
|
77
35
|
prerelease: false
|
78
36
|
version_requirements: !ruby/object:Gem::Requirement
|
79
37
|
requirements:
|
80
|
-
- - "
|
38
|
+
- - ">="
|
81
39
|
- !ruby/object:Gem::Version
|
82
40
|
version: '3'
|
83
41
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
42
|
+
name: pg
|
85
43
|
requirement: !ruby/object:Gem::Requirement
|
86
44
|
requirements:
|
87
45
|
- - "~>"
|
88
46
|
- !ruby/object:Gem::Version
|
89
47
|
version: '0'
|
90
|
-
type: :
|
48
|
+
type: :runtime
|
91
49
|
prerelease: false
|
92
50
|
version_requirements: !ruby/object:Gem::Requirement
|
93
51
|
requirements:
|
94
52
|
- - "~>"
|
95
53
|
- !ruby/object:Gem::Version
|
96
54
|
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rake
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '10.0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '10.0'
|
111
55
|
description: Database based event counter with throttling per time intervals
|
112
56
|
email:
|
113
57
|
- eagle.anton@gmail.com
|
@@ -117,20 +61,34 @@ extra_rdoc_files: []
|
|
117
61
|
files:
|
118
62
|
- ".gitignore"
|
119
63
|
- ".rubocop.yml"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Appraisals
|
66
|
+
- CHANGELOG.md
|
120
67
|
- Gemfile
|
121
68
|
- LICENSE.txt
|
122
69
|
- README.md
|
123
70
|
- Rakefile
|
124
71
|
- config/database.ci.yml
|
125
72
|
- event-counter.gemspec
|
73
|
+
- gemfiles/pg_ar_30.gemfile
|
74
|
+
- gemfiles/pg_ar_30.gemfile.lock
|
75
|
+
- gemfiles/pg_ar_31.gemfile
|
76
|
+
- gemfiles/pg_ar_31.gemfile.lock
|
77
|
+
- gemfiles/pg_ar_32.gemfile
|
78
|
+
- gemfiles/pg_ar_32.gemfile.lock
|
79
|
+
- gemfiles/pg_ar_40.gemfile
|
80
|
+
- gemfiles/pg_ar_40.gemfile.lock
|
81
|
+
- gemfiles/pg_ar_41.gemfile
|
82
|
+
- gemfiles/pg_ar_41.gemfile.lock
|
126
83
|
- lib/event-counter.rb
|
127
84
|
- lib/event_counter.rb
|
128
85
|
- lib/event_counter/active_record_extension.rb
|
129
86
|
- lib/event_counter/version.rb
|
87
|
+
- log/.gitkeep
|
88
|
+
- spec/fixtures/.gitkeep
|
130
89
|
- spec/lib/event_counter_spec.rb
|
131
90
|
- spec/lib/performance_spec.rb
|
132
91
|
- spec/spec_helper.rb
|
133
|
-
- spec/support/fabrications.rb
|
134
92
|
- spec/support/matchers.rb
|
135
93
|
homepage: https://github.com/skyeagle/event-counter
|
136
94
|
licenses:
|
@@ -157,9 +115,9 @@ signing_key:
|
|
157
115
|
specification_version: 4
|
158
116
|
summary: Event counter with throttling per time interval
|
159
117
|
test_files:
|
118
|
+
- spec/fixtures/.gitkeep
|
160
119
|
- spec/lib/event_counter_spec.rb
|
161
120
|
- spec/lib/performance_spec.rb
|
162
121
|
- spec/spec_helper.rb
|
163
|
-
- spec/support/fabrications.rb
|
164
122
|
- spec/support/matchers.rb
|
165
123
|
has_rdoc:
|