Class: Coverband::Collectors::AbstractTracker

Inherits:
Object
  • Object
show all
Defined in:
lib/coverband/collectors/abstract_tracker.rb

Overview

This abstract class makes it easy to track any used/unused with timestamp set of usage

Direct Known Subclasses

RouteTracker, TranslationTracker, ViewTracker

Constant Summary collapse

REPORT_ROUTE =
"/"
TITLE =
"abstract"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ AbstractTracker

Returns a new instance of AbstractTracker.

Raises:

  • (NotImplementedError)


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/coverband/collectors/abstract_tracker.rb', line 18

def initialize(options = {})
  raise NotImplementedError, "#{self.class.name} requires a newer version of Rails" unless self.class.supported_version?
  raise "Coverband: #{self.class.name} initialized before configuration!" if !Coverband.configured? && ENV["COVERBAND_TEST"] == "test"

  @ignore_patterns = Coverband.configuration.ignore
  @store = options.fetch(:store) { Coverband.configuration.store }
  @logger = options.fetch(:logger) { Coverband.configuration.logger }
  @target = options.fetch(:target) do
    concrete_target
  end

  @one_time_timestamp = false

  @logged_keys = Set.new
  @keys_to_record = Set.new
end

Instance Attribute Details

#ignore_patternsObject (readonly)

Returns the value of attribute ignore_patterns.



16
17
18
# File 'lib/coverband/collectors/abstract_tracker.rb', line 16

def ignore_patterns
  @ignore_patterns
end

#loggerObject (readonly)

Returns the value of attribute logger.



16
17
18
# File 'lib/coverband/collectors/abstract_tracker.rb', line 16

def logger
  @logger
end

#storeObject (readonly)

Returns the value of attribute store.



16
17
18
# File 'lib/coverband/collectors/abstract_tracker.rb', line 16

def store
  @store
end

#targetObject

Returns the value of attribute target.



15
16
17
# File 'lib/coverband/collectors/abstract_tracker.rb', line 15

def target
  @target
end

Class Method Details

.supported_version?Boolean

This is the basic rails version supported, if there is something more unique over ride in subclass

Returns:

  • (Boolean)


111
112
113
# File 'lib/coverband/collectors/abstract_tracker.rb', line 111

def self.supported_version?
  defined?(Rails) && defined?(Rails::VERSION) && Rails::VERSION::STRING.split(".").first.to_i >= 5
end

Instance Method Details

#all_keysObject



59
60
61
# File 'lib/coverband/collectors/abstract_tracker.rb', line 59

def all_keys
  target.uniq
end

#as_jsonObject



68
69
70
71
72
73
74
# File 'lib/coverband/collectors/abstract_tracker.rb', line 68

def as_json
  used_keys = self.used_keys
  {
    unused_keys: unused_keys(used_keys),
    used_keys: used_keys
  }.to_json
end

#clear_key!(key) ⇒ Object



89
90
91
92
93
94
# File 'lib/coverband/collectors/abstract_tracker.rb', line 89

def clear_key!(key)
  return unless key
  puts "#{tracker_key} key #{key}"
  redis_store.hdel(tracker_key, key)
  @logged_keys.delete(key)
end

#keys_to_recordObject



39
40
41
# File 'lib/coverband/collectors/abstract_tracker.rb', line 39

def keys_to_record
  @keys_to_record.to_a
end

#logged_keysObject



35
36
37
# File 'lib/coverband/collectors/abstract_tracker.rb', line 35

def logged_keys
  @logged_keys.to_a
end

#reset_recordingsObject



84
85
86
87
# File 'lib/coverband/collectors/abstract_tracker.rb', line 84

def reset_recordings
  redis_store.del(tracker_key)
  redis_store.del(tracker_time_key)
end

#routeObject



115
116
117
# File 'lib/coverband/collectors/abstract_tracker.rb', line 115

def route
  self.class::REPORT_ROUTE
end

#save_reportObject



96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/coverband/collectors/abstract_tracker.rb', line 96

def save_report
  redis_store.set(tracker_time_key, Time.now.to_i) unless @one_time_timestamp || tracker_time_key_exists?
  @one_time_timestamp = true
  reported_time = Time.now.to_i
  @keys_to_record.to_a.each do |key|
    redis_store.hset(tracker_key, key.to_s, reported_time)
  end
  @keys_to_record.clear
rescue => e
  # we don't want to raise errors if Coverband can't reach redis.
  # This is a nice to have not a bring the system down
  logger&.error "Coverband: #{self.class.name} failed to store, error #{e.class.name} info #{e.message}"
end

#titleObject



119
120
121
# File 'lib/coverband/collectors/abstract_tracker.rb', line 119

def title
  self.class::TITLE
end

#track_key(key) ⇒ Object

This method is called on every translation usage



46
47
48
49
50
51
52
53
# File 'lib/coverband/collectors/abstract_tracker.rb', line 46

def track_key(key)
  if key
    if newly_seen_key?(key)
      @logged_keys << key
      @keys_to_record << key if track_key?(key)
    end
  end
end

#tracking_sinceObject



76
77
78
79
80
81
82
# File 'lib/coverband/collectors/abstract_tracker.rb', line 76

def tracking_since
  if (tracking_time = redis_store.get(tracker_time_key))
    Time.at(tracking_time.to_i).iso8601
  else
    "N/A"
  end
end

#unused_keys(used_keys = nil) ⇒ Object



63
64
65
66
# File 'lib/coverband/collectors/abstract_tracker.rb', line 63

def unused_keys(used_keys = nil)
  recently_used_keys = (used_keys || self.used_keys).keys
  all_keys.reject { |k| recently_used_keys.include?(k.to_s) }
end

#used_keysObject



55
56
57
# File 'lib/coverband/collectors/abstract_tracker.rb', line 55

def used_keys
  redis_store.hgetall(tracker_key)
end