reportier 0.4 → 0.5
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/README.md +6 -17
- data/lib/reportier.rb +9 -4
- data/lib/reportier/defaults.rb +33 -43
- data/lib/reportier/naming.rb +2 -2
- data/lib/reportier/persister.rb +86 -29
- data/lib/reportier/reporter.rb +1 -1
- data/lib/reportier/time.rb +1 -1
- data/lib/reportier/tracker.rb +69 -0
- data/lib/reportier/version.rb +1 -1
- metadata +33 -6
- data/lib/reportier/stats.rb +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b060db54ef18ae95264b3da27bc61c7dca574e15
|
4
|
+
data.tar.gz: 2cd5bbb62f9fec8d19764bcb2b5ece1ed70a0ba1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a54ae56c41cc2b5687937b7d2860684eb8f8dd4f4741ba654f0f0fc4b843060528f949b9466339fd294ce577ca4d2eea1e3270b141732584c89d3f6e1294e20f
|
7
|
+
data.tar.gz: 224b602038052de692254f2702a1ba8806546794c67a171ed84f72ffe95b060eebd54d4ee71af520a2e18fa9d54b7827505917713088b519325701fdf442e244
|
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
This is a tracker that tracks the count of events.
|
4
4
|
|
5
5
|
## Use
|
6
|
+
`gem 'reportier'`
|
6
7
|
|
7
8
|
Using the Tracker is fairly simple, by default there are 4 types of trackers.
|
8
9
|
An `Hourly`, a `Daily` a `Weekly` and a `Monthly`.
|
@@ -14,9 +15,9 @@ as long as you keep adding items to them.
|
|
14
15
|
Examples:
|
15
16
|
|
16
17
|
```
|
17
|
-
Reportier::
|
18
|
+
Reportier::Tracker[:daily].add('new user registration')
|
18
19
|
|
19
|
-
Reportier::
|
20
|
+
Reportier::Tracker[:daily].report
|
20
21
|
# -> Daily report started at 2016-06-17T15:34:40+03:00
|
21
22
|
# @new_user_registrations: 1
|
22
23
|
```
|
@@ -47,7 +48,7 @@ So the usage would be
|
|
47
48
|
|
48
49
|
|
49
50
|
```
|
50
|
-
Reportier.set_default_types
|
51
|
+
Reportier.set_default_types yearly: 1.year, bidaily: 2.days
|
51
52
|
```
|
52
53
|
|
53
54
|
These new tracker classes will be created and can be used normally like any other tracker,
|
@@ -77,18 +78,6 @@ class Reportier::Reporter
|
|
77
78
|
end
|
78
79
|
```
|
79
80
|
|
81
|
+
### TODO
|
80
82
|
|
81
|
-
|
82
|
-
|
83
|
-
There are many more features to come, as persiters.
|
84
|
-
This has been kind of a personal project, please give me feedback on anything that has room for improvement.
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
83
|
+
When persisted through redis trackers need to get their starting time from redis
|
data/lib/reportier.rb
CHANGED
@@ -1,15 +1,20 @@
|
|
1
|
+
require 'date'
|
1
2
|
require_relative 'reportier/naming'
|
2
3
|
require_relative 'reportier/time'
|
4
|
+
require_relative 'reportier/defaults'
|
3
5
|
require_relative 'reportier/reporter'
|
4
6
|
require_relative 'reportier/persister'
|
5
|
-
require_relative 'reportier/
|
6
|
-
require_relative 'reportier/defaults'
|
7
|
+
require_relative 'reportier/tracker'
|
7
8
|
require_relative 'reportier/version'
|
8
9
|
|
9
10
|
module Reportier
|
10
11
|
def self.add_to_all(item)
|
11
|
-
|
12
|
-
|
12
|
+
@types.each do |type, v|
|
13
|
+
Tracker[type].add(item)
|
13
14
|
end
|
14
15
|
end
|
16
|
+
|
17
|
+
def self.configure(&blk)
|
18
|
+
Defaults.global.configure &blk
|
19
|
+
end
|
15
20
|
end
|
data/lib/reportier/defaults.rb
CHANGED
@@ -1,58 +1,48 @@
|
|
1
1
|
module Reportier
|
2
|
-
|
3
|
-
|
2
|
+
class Defaults
|
3
|
+
attr_accessor :types, :reporting_vars, :reporters,
|
4
|
+
:persister
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
'Weekly' => weeks(1),
|
9
|
-
'Monthly' => months(1)
|
10
|
-
}
|
11
|
-
|
12
|
-
REPORTING_VARS = {}
|
13
|
-
|
14
|
-
REPORTERS = {
|
15
|
-
console: nil
|
16
|
-
}
|
6
|
+
def self.global
|
7
|
+
@global ||= new
|
8
|
+
end
|
17
9
|
|
18
|
-
|
10
|
+
def initialize(opts={})
|
11
|
+
initialize_defaults
|
12
|
+
@reporting_vars.merge! Hash(opts[:reporting_vars])
|
13
|
+
end
|
19
14
|
|
20
|
-
|
15
|
+
def configure
|
16
|
+
yield self
|
17
|
+
end
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
def update_reporting_vars(hash)
|
20
|
+
@reporting_vars.merge!(hash)
|
21
|
+
end
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
def types=(opts)
|
24
|
+
@types = Hash.new(0)
|
25
|
+
@types.merge! opts
|
26
|
+
end
|
30
27
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
def reporters=(opts)
|
29
|
+
@reporters = opts
|
30
|
+
_require_reporter_libraries
|
31
|
+
end
|
35
32
|
|
36
|
-
|
33
|
+
private
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
def initialize_defaults
|
36
|
+
@types = Hash.new(0)
|
37
|
+
@reporting_vars = Hash.new
|
38
|
+
@reporters = Hash.new
|
39
|
+
@persister = :memory
|
41
40
|
end
|
42
|
-
end
|
43
41
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
s_key = Namer.new.name_class(key)
|
48
|
-
eval %{
|
49
|
-
class #{s_key} < Instant
|
50
|
-
def expires_at
|
51
|
-
@started_at + #{val}
|
52
|
-
end
|
42
|
+
def _require_reporter_libraries
|
43
|
+
@reporters.each do |name, lib|
|
44
|
+
require lib if lib
|
53
45
|
end
|
54
|
-
}
|
55
46
|
end
|
56
47
|
end
|
57
|
-
_default_classes_create
|
58
48
|
end
|
data/lib/reportier/naming.rb
CHANGED
data/lib/reportier/persister.rb
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
module Reportier
|
2
2
|
class Persister
|
3
|
-
|
4
|
-
|
3
|
+
|
4
|
+
def self.get(tracker, persister_type = Defaults.global.persister)
|
5
|
+
type = Namer.new.name_class(persister_type)
|
6
|
+
persister = eval "#{type}Persister"
|
7
|
+
persister.new(tracker)
|
5
8
|
end
|
6
9
|
|
7
|
-
def initialize
|
8
|
-
|
10
|
+
def initialize(tracker)
|
11
|
+
@tracker = tracker
|
12
|
+
@reporting_vars = {}
|
13
|
+
_initialize_reporting_vars
|
9
14
|
end
|
10
15
|
|
11
16
|
def save(item)
|
12
|
-
|
13
|
-
|
17
|
+
item = item.to_sym
|
18
|
+
initialize_reporting_var(item) unless get(item)
|
19
|
+
incr(item)
|
14
20
|
end
|
15
21
|
|
16
22
|
def report
|
@@ -18,48 +24,99 @@ module Reportier
|
|
18
24
|
end
|
19
25
|
|
20
26
|
def to_json
|
21
|
-
"{#{to_hash.map { |k,v| "\"#{k
|
27
|
+
"{#{to_hash.map { |k,v| "\"#{k}\": #{v}" }.flatten.join(",\n")}}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def clear
|
31
|
+
@reporting_vars = {}
|
32
|
+
_initialize_reporting_vars
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_date
|
36
|
+
@tracker.started_at
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_date(date)
|
40
|
+
@tracker.started_at = date
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_hash
|
44
|
+
@reporting_vars
|
22
45
|
end
|
23
46
|
|
24
47
|
private
|
25
48
|
|
49
|
+
def incr(item)
|
50
|
+
@reporting_vars[item] += 1
|
51
|
+
end
|
52
|
+
|
53
|
+
def get(item)
|
54
|
+
@reporting_vars[item]
|
55
|
+
end
|
56
|
+
|
57
|
+
def set(item, val)
|
58
|
+
@reporting_vars[item] = 0
|
59
|
+
end
|
60
|
+
|
26
61
|
def attr_messages
|
27
|
-
|
28
|
-
"#{
|
62
|
+
to_hash.map do |key, val|
|
63
|
+
"#{key}: #{val}\n"
|
29
64
|
end
|
30
65
|
end
|
31
66
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
67
|
+
def initialize_reporting_var(name)
|
68
|
+
set(name, 0)
|
69
|
+
end
|
70
|
+
|
71
|
+
def _initialize_reporting_vars
|
72
|
+
@reporting_vars.merge!(@tracker.defaults.reporting_vars)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
class MemoryPersister < Persister; end
|
76
|
+
class RedisPersister < Persister
|
77
|
+
|
78
|
+
def clear
|
79
|
+
Redis.current.del(Redis.current.keys(name + '*'))
|
80
|
+
rescue Redis::CommandError
|
35
81
|
end
|
36
82
|
|
37
83
|
def to_hash
|
38
|
-
Hash[
|
84
|
+
Hash[reporting_vars.map { |k| [k, get(k).to_i] }]
|
39
85
|
end
|
40
86
|
|
41
|
-
def
|
42
|
-
|
87
|
+
def get_date
|
88
|
+
date = Redis.current.get "Reportier:DateFor#{name}"
|
89
|
+
return if date.nil? || date.empty?
|
90
|
+
DateTime.parse(date)
|
43
91
|
end
|
44
92
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
initialize
|
93
|
+
def set_date(date)
|
94
|
+
Redis.current.set "Reportier:DateFor#{name}", date.to_s
|
95
|
+
super
|
50
96
|
end
|
51
97
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
98
|
+
private
|
99
|
+
|
100
|
+
def reporting_vars
|
101
|
+
Redis.current.keys(name + '*').map do |var|
|
102
|
+
var.sub(name,'').to_sym
|
56
103
|
end
|
57
104
|
end
|
58
|
-
end
|
59
|
-
class MemoryPersister < Persister; end
|
60
|
-
class RedisPersister < Persister
|
61
105
|
|
62
|
-
|
63
|
-
|
106
|
+
def incr(item)
|
107
|
+
Redis.current.incr name(item)
|
108
|
+
end
|
64
109
|
|
110
|
+
def set(item, val)
|
111
|
+
Redis.current.set name(item), val
|
112
|
+
end
|
65
113
|
|
114
|
+
def get(item)
|
115
|
+
Redis.current.get name(item)
|
116
|
+
end
|
117
|
+
|
118
|
+
def name(item=nil)
|
119
|
+
"#{@tracker.name}:#{item}"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/lib/reportier/reporter.rb
CHANGED
data/lib/reportier/time.rb
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
module Reportier
|
2
|
+
class Tracker
|
3
|
+
attr_accessor :started_at
|
4
|
+
attr_reader :reporter, :persister, :type, :name, :defaults
|
5
|
+
|
6
|
+
|
7
|
+
def self.[](type)
|
8
|
+
@current ||= Hash.new
|
9
|
+
@current[type] ||= new(type: type)
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(opts = {})
|
13
|
+
@defaults = Defaults.new
|
14
|
+
@type = opts[:type]
|
15
|
+
@reporter = opts[:reporter] || Reporter.get
|
16
|
+
@persister = opts[:persister] || Persister.get(self)
|
17
|
+
@name = Namer.new.name \
|
18
|
+
"#{opts[:name]}#{@type && @type.capitalize}Tracker"
|
19
|
+
@persister.set_date(_set_date)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add(item)
|
23
|
+
(report && clear) unless active?
|
24
|
+
return if Defaults.global.types[@type] == 0
|
25
|
+
@persister.save(Namer.new.name_item(item))
|
26
|
+
end
|
27
|
+
|
28
|
+
def report
|
29
|
+
@reporter.call(self) do
|
30
|
+
"#{@type} report started at #{@started_at}\n" +
|
31
|
+
@persister.report
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_json
|
36
|
+
@persister.to_json
|
37
|
+
end
|
38
|
+
|
39
|
+
def active?
|
40
|
+
DateTime.now < expires_at
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def clear
|
46
|
+
@persister.clear
|
47
|
+
@persister.set_date(_set_date)
|
48
|
+
end
|
49
|
+
|
50
|
+
def expires_at
|
51
|
+
@persister.get_date + Defaults.global.types[@type]
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def _set_date
|
57
|
+
return DateTime.now if _set_to_now?
|
58
|
+
@persister.get_date || expires_at
|
59
|
+
end
|
60
|
+
|
61
|
+
def _set_to_now?
|
62
|
+
@persister.get_date.nil? || _long_due?
|
63
|
+
end
|
64
|
+
|
65
|
+
def _long_due?
|
66
|
+
expires_at < (DateTime.now - Defaults.global.types[@type])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/reportier/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reportier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.5'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasilis Spilka
|
@@ -9,8 +9,36 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2016-06-13 00:00:00.000000000 Z
|
12
|
-
dependencies:
|
13
|
-
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A event/item tracker that reports automatically as you just add items
|
14
42
|
email: vasspilka@gmail.com
|
15
43
|
executables: []
|
16
44
|
extensions: []
|
@@ -23,8 +51,8 @@ files:
|
|
23
51
|
- lib/reportier/naming.rb
|
24
52
|
- lib/reportier/persister.rb
|
25
53
|
- lib/reportier/reporter.rb
|
26
|
-
- lib/reportier/stats.rb
|
27
54
|
- lib/reportier/time.rb
|
55
|
+
- lib/reportier/tracker.rb
|
28
56
|
- lib/reportier/version.rb
|
29
57
|
homepage: http://rubygems.org/gems/reportier
|
30
58
|
licenses:
|
@@ -49,6 +77,5 @@ rubyforge_project:
|
|
49
77
|
rubygems_version: 2.5.1
|
50
78
|
signing_key:
|
51
79
|
specification_version: 4
|
52
|
-
summary: A
|
80
|
+
summary: A event/item tracker that reports
|
53
81
|
test_files: []
|
54
|
-
has_rdoc:
|
data/lib/reportier/stats.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Reportier
|
2
|
-
|
3
|
-
class Instant
|
4
|
-
attr_accessor :reporter, :persister
|
5
|
-
|
6
|
-
def self.get
|
7
|
-
@current ||= new
|
8
|
-
end
|
9
|
-
|
10
|
-
def initialize(opts = {})
|
11
|
-
@report_type = self.class.to_s.sub('Reportier::','')
|
12
|
-
@started_at = DateTime.now
|
13
|
-
@reporter = opts[:reporter] || Reporter.get
|
14
|
-
@persister = opts[:persister] || Persister.get
|
15
|
-
end
|
16
|
-
|
17
|
-
def add(item)
|
18
|
-
(report && clear) unless active?
|
19
|
-
item_name = name(item)
|
20
|
-
@persister.save(item_name)
|
21
|
-
item_added
|
22
|
-
end
|
23
|
-
|
24
|
-
def report
|
25
|
-
@reporter.call(self) do
|
26
|
-
"#{@report_type} report started at #{@started_at}\n" +
|
27
|
-
@persister.report
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def to_json
|
32
|
-
@persister.to_json
|
33
|
-
end
|
34
|
-
|
35
|
-
def active?
|
36
|
-
DateTime.now < expires_at
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def clear
|
42
|
-
@persister.clear
|
43
|
-
end
|
44
|
-
|
45
|
-
def item_added
|
46
|
-
"item added"
|
47
|
-
end
|
48
|
-
|
49
|
-
def name(item)
|
50
|
-
Namer.new.name_item(item)
|
51
|
-
end
|
52
|
-
|
53
|
-
def expires_at
|
54
|
-
@started_at
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|