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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7aed0447a45d12d75dac3467f024b34ccff230a
4
- data.tar.gz: d26b31a8cb45c81d7ee4ca51d70f77643f99b18c
3
+ metadata.gz: b060db54ef18ae95264b3da27bc61c7dca574e15
4
+ data.tar.gz: 2cd5bbb62f9fec8d19764bcb2b5ece1ed70a0ba1
5
5
  SHA512:
6
- metadata.gz: 269014b83979ca883e041891f90eaa80a0c4743cd6b716f6150e1c08e73a80d882483601c841aece9784835319873b9f4ee427665006cff16dfd5cd5f316b602
7
- data.tar.gz: 7c2c0872876920642f9cadd16b132527135885a19cf845d07d41172968a1a3646ea37004374bd263476e2c824e1011079a8f0e43d1e6267c7070d795ffebe538
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::Daily.get.add('new user registration')
18
+ Reportier::Tracker[:daily].add('new user registration')
18
19
 
19
- Reportier::Daily.get.report
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 'Yearly' => 1.year, 'BiDay' => 2.days
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
- ## More
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
@@ -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/stats'
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
- Default::TYPES.each do |type, v|
12
- eval "#{type}.get.add(item)"
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
@@ -1,58 +1,48 @@
1
1
  module Reportier
2
- module Default
3
- extend Time
2
+ class Defaults
3
+ attr_accessor :types, :reporting_vars, :reporters,
4
+ :persister
4
5
 
5
- TYPES = {
6
- 'Hourly' => hours(1),
7
- 'Daily' => days(1),
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
- PERSISTER = :memory
10
+ def initialize(opts={})
11
+ initialize_defaults
12
+ @reporting_vars.merge! Hash(opts[:reporting_vars])
13
+ end
19
14
 
20
- end
15
+ def configure
16
+ yield self
17
+ end
21
18
 
22
- def self.set_default_reporting_vars(opts={})
23
- Default::REPORTING_VARS.merge!(opts)
24
- end
19
+ def update_reporting_vars(hash)
20
+ @reporting_vars.merge!(hash)
21
+ end
25
22
 
26
- def self.set_default_types(opts={})
27
- Default::TYPES.merge!(opts)
28
- _default_classes_create
29
- end
23
+ def types=(opts)
24
+ @types = Hash.new(0)
25
+ @types.merge! opts
26
+ end
30
27
 
31
- def self.set_default_reporters(opts={})
32
- Default::REPORTERS.merge!(opts)
33
- _require_reporter_libraries
34
- end
28
+ def reporters=(opts)
29
+ @reporters = opts
30
+ _require_reporter_libraries
31
+ end
35
32
 
36
- private
33
+ private
37
34
 
38
- def self._require_reporter_libraries
39
- Default::REPORTERS.each do |name, lib|
40
- require lib if lib
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
- def self._default_classes_create
45
- Default::TYPES.each do |key, val|
46
- raise TypeError unless val.kind_of? Integer
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
@@ -2,11 +2,11 @@ module Reportier
2
2
  class Namer
3
3
 
4
4
  def name_class(item)
5
- create_string(item).capitalize
5
+ name(item).split('_').map(&:capitalize).join
6
6
  end
7
7
 
8
8
  def name_item(item)
9
- pluralize(create_string(item))
9
+ pluralize(name(item))
10
10
  end
11
11
 
12
12
  def name(item)
@@ -1,16 +1,22 @@
1
1
  module Reportier
2
2
  class Persister
3
- def self.get
4
- eval "#{Namer.new.name_class(Default::PERSISTER)}Persister.new"
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
- _initialize_default_reporting_vars
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
- create_accessor(item) unless (eval "@#{item}")
13
- eval "@#{item} += 1"
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.to_s}\": #{v.to_s}" }.flatten.join(",\n")}}"
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
- reporting_vars.map do |var|
28
- "#{var}: #{eval var.to_s}\n"
62
+ to_hash.map do |key, val|
63
+ "#{key}: #{val}\n"
29
64
  end
30
65
  end
31
66
 
32
- def create_accessor(name)
33
- self.class.module_eval "attr_accessor :#{name}"
34
- eval "@#{name} ||= 0"
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[ *reporting_vars.collect { |v| [ v.to_s, (eval v.to_s) ] }.flatten ]
84
+ Hash[reporting_vars.map { |k| [k, get(k).to_i] }]
39
85
  end
40
86
 
41
- def reporting_vars
42
- instance_variables
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 clear
46
- reporting_vars.each do |var|
47
- eval "#{var} = 0"
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
- def _initialize_default_reporting_vars
53
- Default::REPORTING_VARS.each do |key, val|
54
- raise TypeError unless val.kind_of? Integer
55
- eval "@#{Namer.new.name(key)} = #{val}"
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
- end
63
- end
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
@@ -3,7 +3,7 @@ module Reportier
3
3
  attr_accessor :reporters
4
4
 
5
5
  def self.get
6
- @current ||= new(Default::REPORTERS)
6
+ @current ||= new(Defaults.global.reporters)
7
7
  end
8
8
 
9
9
  def initialize(reporters)
@@ -25,7 +25,7 @@ module Reportier
25
25
  end
26
26
 
27
27
  def years(int)
28
- months(int) * 12
28
+ Integer(days(int) * 365.25)
29
29
  end
30
30
  end
31
31
  end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Reportier
2
- VERSION = '0.4'
2
+ VERSION = '0.5'
3
3
  end
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'
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
- description: A stat tracker that reports automatically as you just add items
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 stat tracker that reports
80
+ summary: A event/item tracker that reports
53
81
  test_files: []
54
- has_rdoc:
@@ -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