tally 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +217 -0
- data/Rakefile +32 -0
- data/app/assets/config/tally_manifest.js +2 -0
- data/app/assets/javascripts/tally/application.js +15 -0
- data/app/assets/stylesheets/tally/application.css +15 -0
- data/app/controllers/tally/application_controller.rb +17 -0
- data/app/controllers/tally/days_controller.rb +19 -0
- data/app/controllers/tally/keys_controller.rb +19 -0
- data/app/controllers/tally/records_controller.rb +21 -0
- data/app/helpers/tally/application_helper.rb +4 -0
- data/app/helpers/tally/increment_helper.rb +15 -0
- data/app/jobs/tally/application_job.rb +4 -0
- data/app/jobs/tally/calculator_runner_job.rb +12 -0
- data/app/models/tally/application_record.rb +7 -0
- data/app/models/tally/record.rb +30 -0
- data/app/presenters/tally/record_presenter.rb +29 -0
- data/bin/annotate +29 -0
- data/bin/appraisal +29 -0
- data/bin/bundle +114 -0
- data/bin/coderay +29 -0
- data/bin/htmldiff +29 -0
- data/bin/ldiff +29 -0
- data/bin/nokogiri +29 -0
- data/bin/pry +29 -0
- data/bin/rackup +29 -0
- data/bin/rails +14 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/bin/ruby-parse +29 -0
- data/bin/ruby-rewrite +29 -0
- data/bin/sprockets +29 -0
- data/bin/thor +29 -0
- data/config/routes.rb +12 -0
- data/db/migrate/20181016172358_create_tally_records.rb +15 -0
- data/lib/tally.rb +77 -0
- data/lib/tally/archiver.rb +64 -0
- data/lib/tally/calculator.rb +30 -0
- data/lib/tally/calculator_runner.rb +56 -0
- data/lib/tally/calculators.rb +29 -0
- data/lib/tally/countable.rb +23 -0
- data/lib/tally/daily.rb +64 -0
- data/lib/tally/engine.rb +28 -0
- data/lib/tally/increment.rb +25 -0
- data/lib/tally/key_finder.rb +123 -0
- data/lib/tally/key_finder/entry.rb +66 -0
- data/lib/tally/keyable.rb +55 -0
- data/lib/tally/record_searcher.rb +110 -0
- data/lib/tally/sweeper.rb +46 -0
- data/lib/tally/version.rb +5 -0
- data/lib/tasks/tally_tasks.rake +16 -0
- metadata +256 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
module Tally
|
2
|
+
class Sweeper
|
3
|
+
|
4
|
+
def initialize(key: nil, day: "*", record: nil, type: nil)
|
5
|
+
@key = key
|
6
|
+
@day = day
|
7
|
+
@record = record
|
8
|
+
@type = type
|
9
|
+
end
|
10
|
+
|
11
|
+
def purge_date
|
12
|
+
@purge_date ||= 3.days.ago.beginning_of_day.to_date
|
13
|
+
end
|
14
|
+
|
15
|
+
def purgeable_keys
|
16
|
+
@purgeable_keys ||= finder.entries.map do |entry|
|
17
|
+
if entry.date <= purge_date
|
18
|
+
entry.raw_key
|
19
|
+
end
|
20
|
+
end.compact
|
21
|
+
end
|
22
|
+
|
23
|
+
def sweep!
|
24
|
+
Tally.redis do |conn|
|
25
|
+
purgeable_keys.in_groups_of(25, fill_with = nil).each do |group|
|
26
|
+
conn.pipelined do
|
27
|
+
group.each do |key|
|
28
|
+
conn.del(key)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.sweep!(*args)
|
36
|
+
new(*args).sweep!
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def finder
|
42
|
+
@key_finder ||= KeyFinder.new(key: @key, day: @day, record: @record, type: @type)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace :tally do
|
2
|
+
desc "Sweep all outdated keys from the data store"
|
3
|
+
task :sweep => :environment do
|
4
|
+
Tally::Sweeper.sweep!
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Archive today's temporary keys into record entries in the database"
|
8
|
+
task :archive => :environment do
|
9
|
+
Tally::Archiver.archive!
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Archive yesterday's temporary keys into record entries in the database"
|
13
|
+
task "archive:yesterday" => :environment do
|
14
|
+
Tally::Archiver.archive! day: 1.day.ago
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,256 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tally
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.beta1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John D. Tornow
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-02-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.2.4.1
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '7'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 5.2.4.1
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '7'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: redis
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '4.1'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '4.1'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: kaminari-activerecord
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.1'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.1'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: zeitwerk
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '2.2'
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.2'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rspec-rails
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '3.7'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '3.7'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: factory_bot_rails
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '5.1'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '5.1'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: shoulda-matchers
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '4.2'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '4.2'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: simplecov
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0.11'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0.11'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: rspec_junit_formatter
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - "~>"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0.2'
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - "~>"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0.2'
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: timecop
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - "~>"
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0.9'
|
152
|
+
type: :development
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - "~>"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0.9'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: appraisal
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
description: Tally is a simple Rails engine for capturing counts of various activities
|
174
|
+
around an app. These counts are quickly captured in Redis then are archived periodically
|
175
|
+
within the app’s default relational database.
|
176
|
+
email:
|
177
|
+
- john@johntornow.com
|
178
|
+
executables: []
|
179
|
+
extensions: []
|
180
|
+
extra_rdoc_files: []
|
181
|
+
files:
|
182
|
+
- README.md
|
183
|
+
- Rakefile
|
184
|
+
- app/assets/config/tally_manifest.js
|
185
|
+
- app/assets/javascripts/tally/application.js
|
186
|
+
- app/assets/stylesheets/tally/application.css
|
187
|
+
- app/controllers/tally/application_controller.rb
|
188
|
+
- app/controllers/tally/days_controller.rb
|
189
|
+
- app/controllers/tally/keys_controller.rb
|
190
|
+
- app/controllers/tally/records_controller.rb
|
191
|
+
- app/helpers/tally/application_helper.rb
|
192
|
+
- app/helpers/tally/increment_helper.rb
|
193
|
+
- app/jobs/tally/application_job.rb
|
194
|
+
- app/jobs/tally/calculator_runner_job.rb
|
195
|
+
- app/models/tally/application_record.rb
|
196
|
+
- app/models/tally/record.rb
|
197
|
+
- app/presenters/tally/record_presenter.rb
|
198
|
+
- bin/annotate
|
199
|
+
- bin/appraisal
|
200
|
+
- bin/bundle
|
201
|
+
- bin/coderay
|
202
|
+
- bin/htmldiff
|
203
|
+
- bin/ldiff
|
204
|
+
- bin/nokogiri
|
205
|
+
- bin/pry
|
206
|
+
- bin/rackup
|
207
|
+
- bin/rails
|
208
|
+
- bin/rake
|
209
|
+
- bin/rspec
|
210
|
+
- bin/rubocop
|
211
|
+
- bin/ruby-parse
|
212
|
+
- bin/ruby-rewrite
|
213
|
+
- bin/sprockets
|
214
|
+
- bin/thor
|
215
|
+
- config/routes.rb
|
216
|
+
- db/migrate/20181016172358_create_tally_records.rb
|
217
|
+
- lib/tally.rb
|
218
|
+
- lib/tally/archiver.rb
|
219
|
+
- lib/tally/calculator.rb
|
220
|
+
- lib/tally/calculator_runner.rb
|
221
|
+
- lib/tally/calculators.rb
|
222
|
+
- lib/tally/countable.rb
|
223
|
+
- lib/tally/daily.rb
|
224
|
+
- lib/tally/engine.rb
|
225
|
+
- lib/tally/increment.rb
|
226
|
+
- lib/tally/key_finder.rb
|
227
|
+
- lib/tally/key_finder/entry.rb
|
228
|
+
- lib/tally/keyable.rb
|
229
|
+
- lib/tally/record_searcher.rb
|
230
|
+
- lib/tally/sweeper.rb
|
231
|
+
- lib/tally/version.rb
|
232
|
+
- lib/tasks/tally_tasks.rake
|
233
|
+
homepage: https://github.com/jdtornow/tally
|
234
|
+
licenses:
|
235
|
+
- MIT
|
236
|
+
metadata: {}
|
237
|
+
post_install_message:
|
238
|
+
rdoc_options: []
|
239
|
+
require_paths:
|
240
|
+
- lib
|
241
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
242
|
+
requirements:
|
243
|
+
- - ">="
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: 2.5.7
|
246
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: 1.8.11
|
251
|
+
requirements: []
|
252
|
+
rubygems_version: 3.1.2
|
253
|
+
signing_key:
|
254
|
+
specification_version: 4
|
255
|
+
summary: Stats collection and reporting
|
256
|
+
test_files: []
|