Class: HTMLProofer::Cache
- Inherits:
-
Object
- Object
- HTMLProofer::Cache
show all
- Includes:
- Utils
- Defined in:
- lib/html-proofer/cache.rb
Constant Summary
collapse
- DEFAULT_STORAGE_DIR =
File.join('tmp', '.htmlproofer')
- DEFAULT_CACHE_FILE_NAME =
'cache.log'
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods included from Utils
#create_nokogiri, #pluralize, #swap
Constructor Details
#initialize(logger, options) ⇒ Cache
Returns a new instance of Cache.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# File 'lib/html-proofer/cache.rb', line 16
def initialize(logger, options)
@logger = logger
@cache_log = {}
@cache_datetime = DateTime.now
@cache_time = @cache_datetime.to_time
if options.nil? || options.empty?
define_singleton_method('use_cache?') { false }
else
define_singleton_method('use_cache?') { true }
setup_cache!(options)
@parsed_timeframe = parsed_timeframe(options[:timeframe])
end
end
|
Instance Attribute Details
#cache_file ⇒ Object
Returns the value of attribute cache_file.
14
15
16
|
# File 'lib/html-proofer/cache.rb', line 14
def cache_file
@cache_file
end
|
#cache_log ⇒ Object
Returns the value of attribute cache_log.
14
15
16
|
# File 'lib/html-proofer/cache.rb', line 14
def cache_log
@cache_log
end
|
#exists ⇒ Object
Returns the value of attribute exists.
14
15
16
|
# File 'lib/html-proofer/cache.rb', line 14
def exists
@exists
end
|
#storage_dir ⇒ Object
Returns the value of attribute storage_dir.
14
15
16
|
# File 'lib/html-proofer/cache.rb', line 14
def storage_dir
@storage_dir
end
|
Instance Method Details
#add(url, filenames, status, msg = '') ⇒ Object
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/html-proofer/cache.rb', line 61
def add(url, filenames, status, msg = '')
return unless use_cache?
data = {
time: @cache_time,
filenames: filenames,
status: status,
message: msg
}
@cache_log[clean_url(url)] = data
end
|
#clean_url(url) ⇒ Object
139
140
141
|
# File 'lib/html-proofer/cache.rb', line 139
def clean_url(url)
unescape_url(url)
end
|
#detect_url_changes(found) ⇒ Object
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# File 'lib/html-proofer/cache.rb', line 74
def detect_url_changes(found)
existing_urls = @cache_log.keys.map { |url| clean_url(url) }
found_urls = found.keys.map { |url| clean_url(url) }
additions = found.reject do |url, _|
url = clean_url(url)
if existing_urls.include?(url)
true
else
@logger.log :debug, "Adding #{url} to cache check"
false
end
end
new_link_count = additions.length
new_link_text = pluralize(new_link_count, 'link', 'links')
@logger.log :info, "Adding #{new_link_text} to the cache..."
del = 0
@cache_log.delete_if do |url, _|
url = clean_url(url)
if found_urls.include?(url)
false
else
@logger.log :debug, "Removing #{url} from cache check"
del += 1
true
end
end
del_link_text = pluralize(del, 'link', 'links')
@logger.log :info, "Removing #{del_link_text} from the cache..."
additions
end
|
#load? ⇒ Boolean
116
117
118
|
# File 'lib/html-proofer/cache.rb', line 116
def load?
@load.nil?
end
|
#parsed_timeframe(timeframe) ⇒ Object
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'lib/html-proofer/cache.rb', line 44
def parsed_timeframe(timeframe)
time, date = timeframe.match(/(\d+)(\D)/).captures
time = time.to_i
case date
when 'M'
time_ago(time, :months)
when 'w'
time_ago(time, :weeks)
when 'd'
time_ago(time, :days)
when 'h'
time_ago(time, :hours)
else
raise ArgumentError, "#{date} is not a valid timeframe!"
end
end
|
#retrieve_urls(urls) ⇒ Object
120
121
122
123
124
125
126
127
128
|
# File 'lib/html-proofer/cache.rb', line 120
def retrieve_urls(urls)
urls_to_check = detect_url_changes(urls)
@cache_log.each_pair do |url, cache|
next if within_timeframe?(cache['time']) && cache['message'].empty?
urls_to_check[url] = cache['filenames'] end
urls_to_check
end
|
#setup_cache!(options) ⇒ Object
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
# File 'lib/html-proofer/cache.rb', line 143
def setup_cache!(options)
@storage_dir = options[:storage_dir] || DEFAULT_STORAGE_DIR
FileUtils.mkdir_p(storage_dir) unless Dir.exist?(storage_dir)
cache_file_name = options[:cache_file] || DEFAULT_CACHE_FILE_NAME
@cache_file = File.join(storage_dir, cache_file_name)
return unless File.exist?(cache_file)
contents = File.read(cache_file)
@cache_log = contents.empty? ? {} : JSON.parse(contents)
end
|
#size ⇒ Object
40
41
42
|
# File 'lib/html-proofer/cache.rb', line 40
def size
@cache_log.length
end
|
#unescape_url(url) ⇒ Object
FIXME: it seems that Typhoeus actually acts on escaped URLs, but there’s no way to get at that information, and the cache stores unescaped URLs. Because of this, some links, such as github.com/search/issues?q=is:open+is:issue+fig are not matched as github.com/search/issues?q=is%3Aopen+is%3Aissue+fig
135
136
137
|
# File 'lib/html-proofer/cache.rb', line 135
def unescape_url(url)
Addressable::URI.unescape(url)
end
|
#urls ⇒ Object
36
37
38
|
# File 'lib/html-proofer/cache.rb', line 36
def urls
@cache_log['urls'] || []
end
|
#within_timeframe?(time) ⇒ Boolean
32
33
34
|
# File 'lib/html-proofer/cache.rb', line 32
def within_timeframe?(time)
(@parsed_timeframe..@cache_time).cover?(Time.parse(time))
end
|
#write ⇒ Object
112
113
114
|
# File 'lib/html-proofer/cache.rb', line 112
def write
File.write(cache_file, @cache_log.to_json)
end
|