snapcrawl 0.5.3 → 0.5.4.rc1
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/bin/snapcrawl +6 -11
- data/lib/snapcrawl/cli.rb +7 -10
- data/lib/snapcrawl/config.rb +17 -18
- data/lib/snapcrawl/crawler.rb +18 -19
- data/lib/snapcrawl/dependencies.rb +6 -6
- data/lib/snapcrawl/log_helpers.rb +14 -13
- data/lib/snapcrawl/page.rb +16 -13
- data/lib/snapcrawl/refinements/pair_split.rb +10 -7
- data/lib/snapcrawl/refinements/string_refinements.rb +1 -1
- data/lib/snapcrawl/screenshot.rb +12 -9
- data/lib/snapcrawl/version.rb +2 -2
- metadata +43 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ae3bce2bddf47cad311373025e31b28e09acc5ee9e6d9a265794ad8ae355989
|
4
|
+
data.tar.gz: 2d6bb777cac25e0f7817e5385249c2009de50bf7bdb75dea71dc7435cfe65120
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f54f93475622850ed12de2325b49e61e661e57d3d1372cf2086673453bc4f9c9a6878d0ef3d9551b4c96064231b1dea529cc44151ab915c6e383fc5fb0e4ecce
|
7
|
+
data.tar.gz: 8839db491de4274076d6ae9c7f801faa96f21bb3364335c0e4f8cb4bf28d1dfde5f0f8dff401715cffef259a9dbbecbd808079a5ca205ea13e3f14988a83c82d
|
data/bin/snapcrawl
CHANGED
@@ -10,21 +10,16 @@ include Colsole
|
|
10
10
|
|
11
11
|
begin
|
12
12
|
CLI.new.call ARGV
|
13
|
-
|
14
13
|
rescue MissingPhantomJS => e
|
15
|
-
message =
|
16
|
-
say! "\n\
|
14
|
+
message = 'Cannot find phantomjs executable in the path, please install it first.'
|
15
|
+
say! "\n\nru`#{e.class}`\n#{message}"
|
17
16
|
exit 2
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
say! "\n\n!undred!#{e.class}!txtrst!\n#{message}"
|
17
|
+
rescue MissingImageMagick => e
|
18
|
+
message = 'Cannot find convert (ImageMagick) executable in the path, please install it first.'
|
19
|
+
say! "\n\nru`#{e.class}`\n#{message}"
|
22
20
|
exit 3
|
23
|
-
|
24
21
|
rescue => e
|
25
22
|
puts e.backtrace.reverse if ENV['DEBUG']
|
26
|
-
say! "\
|
23
|
+
say! "\nru`#{e.class}`\n#{e.message}"
|
27
24
|
exit 1
|
28
|
-
|
29
25
|
end
|
30
|
-
|
data/lib/snapcrawl/cli.rb
CHANGED
@@ -7,13 +7,11 @@ module Snapcrawl
|
|
7
7
|
include Colsole
|
8
8
|
using StringRefinements
|
9
9
|
using PairSplit
|
10
|
-
|
10
|
+
|
11
11
|
def call(args = [])
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
puts e.message
|
16
|
-
end
|
12
|
+
execute Docopt.docopt(docopt, version: VERSION, argv: args)
|
13
|
+
rescue Docopt::Exit => e
|
14
|
+
puts e.message
|
17
15
|
end
|
18
16
|
|
19
17
|
private
|
@@ -26,7 +24,7 @@ module Snapcrawl
|
|
26
24
|
apply_tweaks tweaks if tweaks
|
27
25
|
|
28
26
|
Dependencies.verify
|
29
|
-
|
27
|
+
|
30
28
|
$logger.debug 'initializing cli'
|
31
29
|
FileUtils.mkdir_p Config.snaps_dir
|
32
30
|
|
@@ -37,11 +35,11 @@ module Snapcrawl
|
|
37
35
|
end
|
38
36
|
|
39
37
|
def docopt
|
40
|
-
@
|
38
|
+
@docopt ||= File.read docopt_path
|
41
39
|
end
|
42
40
|
|
43
41
|
def docopt_path
|
44
|
-
File.expand_path
|
42
|
+
File.expand_path 'templates/docopt.txt', __dir__
|
45
43
|
end
|
46
44
|
|
47
45
|
def apply_tweaks(tweaks)
|
@@ -50,6 +48,5 @@ module Snapcrawl
|
|
50
48
|
$logger.level = value if key == 'log_level'
|
51
49
|
end
|
52
50
|
end
|
53
|
-
|
54
51
|
end
|
55
52
|
end
|
data/lib/snapcrawl/config.rb
CHANGED
@@ -7,19 +7,19 @@ module Snapcrawl
|
|
7
7
|
def load(file = nil)
|
8
8
|
reset!
|
9
9
|
push defaults
|
10
|
-
|
10
|
+
|
11
11
|
return unless file
|
12
12
|
|
13
|
-
file = "#{file}.yml" unless
|
13
|
+
file = "#{file}.yml" unless /\.ya?ml$/.match?(file)
|
14
14
|
|
15
15
|
# FIXME: Cannot use logger here due to the "chicken and egg" with
|
16
16
|
# Config. The $logger is available, but it was not yet fully
|
17
17
|
# configured with log_level etc.
|
18
18
|
if File.exist? file
|
19
|
-
# $logger.debug "loading config file
|
19
|
+
# $logger.debug "loading config file g`#{file}`"
|
20
20
|
push file
|
21
21
|
else
|
22
|
-
# $logger.debug "creating config file
|
22
|
+
# $logger.debug "creating config file g`#{file}`"
|
23
23
|
create_config file
|
24
24
|
end
|
25
25
|
end
|
@@ -28,20 +28,20 @@ module Snapcrawl
|
|
28
28
|
|
29
29
|
def defaults
|
30
30
|
{
|
31
|
-
depth:
|
32
|
-
width:
|
33
|
-
height:
|
34
|
-
cache_life:
|
35
|
-
cache_dir:
|
36
|
-
snaps_dir:
|
37
|
-
name_template:
|
38
|
-
url_whitelist:
|
39
|
-
url_blacklist:
|
40
|
-
css_selector:
|
41
|
-
log_level:
|
42
|
-
log_color:
|
31
|
+
depth: 1,
|
32
|
+
width: 1280,
|
33
|
+
height: 0,
|
34
|
+
cache_life: 86_400,
|
35
|
+
cache_dir: 'cache',
|
36
|
+
snaps_dir: 'snaps',
|
37
|
+
name_template: '%{url}',
|
38
|
+
url_whitelist: nil,
|
39
|
+
url_blacklist: nil,
|
40
|
+
css_selector: nil,
|
41
|
+
log_level: 1,
|
42
|
+
log_color: 'auto',
|
43
43
|
skip_ssl_verification: false,
|
44
|
-
screenshot_delay:
|
44
|
+
screenshot_delay: nil,
|
45
45
|
}
|
46
46
|
end
|
47
47
|
|
@@ -55,7 +55,6 @@ module Snapcrawl
|
|
55
55
|
def config_template
|
56
56
|
File.expand_path 'templates/config.yml', __dir__
|
57
57
|
end
|
58
|
-
|
59
58
|
end
|
60
59
|
end
|
61
60
|
end
|
data/lib/snapcrawl/crawler.rb
CHANGED
@@ -7,10 +7,10 @@ module Snapcrawl
|
|
7
7
|
attr_reader :url
|
8
8
|
|
9
9
|
def initialize(url)
|
10
|
-
$logger.debug "initializing crawler with
|
11
|
-
|
10
|
+
$logger.debug "initializing crawler with g`#{url}`"
|
11
|
+
|
12
12
|
config_for_display = Config.settings.dup
|
13
|
-
config_for_display['name_template'] = '%%{url}'
|
13
|
+
config_for_display['name_template'] = '%%{url}'
|
14
14
|
|
15
15
|
$logger.debug "config #{config_for_display}"
|
16
16
|
@url = url
|
@@ -25,27 +25,27 @@ module Snapcrawl
|
|
25
25
|
private
|
26
26
|
|
27
27
|
def process_todo
|
28
|
-
$logger.debug "processing queue:
|
28
|
+
$logger.debug "processing queue: g`#{todo.count} remaining`"
|
29
29
|
|
30
30
|
url, page = todo.shift
|
31
31
|
done.push url
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
return unless process_page page
|
34
|
+
|
35
|
+
register_sub_pages page.pages if page.depth < Config.depth
|
36
36
|
end
|
37
37
|
|
38
38
|
def register_sub_pages(pages)
|
39
39
|
pages.each do |sub_page|
|
40
|
-
next if todo.has_key?(sub_page)
|
41
|
-
|
42
|
-
if Config.url_whitelist
|
43
|
-
$logger.debug "ignoring
|
40
|
+
next if todo.has_key?(sub_page) || done.include?(sub_page)
|
41
|
+
|
42
|
+
if Config.url_whitelist && sub_page.path !~ (/#{Config.url_whitelist}/)
|
43
|
+
$logger.debug "ignoring mu`#{sub_page.url}`, reason: whitelist"
|
44
44
|
next
|
45
45
|
end
|
46
46
|
|
47
|
-
if Config.url_blacklist
|
48
|
-
$logger.debug "ignoring
|
47
|
+
if Config.url_blacklist && sub_page.path =~ (/#{Config.url_blacklist}/)
|
48
|
+
$logger.debug "ignoring mu`#{sub_page.url}`, reason: blacklist"
|
49
49
|
next
|
50
50
|
end
|
51
51
|
|
@@ -56,9 +56,9 @@ module Snapcrawl
|
|
56
56
|
def process_page(page)
|
57
57
|
outfile = "#{Config.snaps_dir}/#{Config.name_template}.png" % { url: page.url.to_slug }
|
58
58
|
|
59
|
-
$logger.info "processing
|
59
|
+
$logger.info "processing mu`#{page.url}`, depth: #{page.depth}"
|
60
60
|
|
61
|
-
|
61
|
+
unless page.valid?
|
62
62
|
$logger.debug "page #{page.path} is invalid, aborting process"
|
63
63
|
return false
|
64
64
|
end
|
@@ -66,7 +66,7 @@ module Snapcrawl
|
|
66
66
|
if file_fresh? outfile
|
67
67
|
$logger.info "screenshot for #{page.path} already exists"
|
68
68
|
else
|
69
|
-
$logger.info "
|
69
|
+
$logger.info "gb`capturing screenshot for #{page.path}`"
|
70
70
|
save_screenshot page, outfile
|
71
71
|
end
|
72
72
|
|
@@ -76,11 +76,11 @@ module Snapcrawl
|
|
76
76
|
def save_screenshot(page, outfile)
|
77
77
|
page.save_screenshot outfile
|
78
78
|
rescue => e
|
79
|
-
$logger.error "screenshot error on
|
79
|
+
$logger.error "screenshot error on mu`#{page.path}` - r`#{e.class}`: #{e.message}"
|
80
80
|
end
|
81
81
|
|
82
82
|
def file_fresh?(file)
|
83
|
-
Config.cache_life
|
83
|
+
Config.cache_life.positive? and File.exist?(file) and file_age(file) < Config.cache_life
|
84
84
|
end
|
85
85
|
|
86
86
|
def file_age(file)
|
@@ -94,6 +94,5 @@ module Snapcrawl
|
|
94
94
|
def done
|
95
95
|
@done ||= []
|
96
96
|
end
|
97
|
-
|
98
97
|
end
|
99
98
|
end
|
@@ -4,18 +4,18 @@ module Snapcrawl
|
|
4
4
|
class Dependencies
|
5
5
|
class << self
|
6
6
|
include Colsole
|
7
|
-
|
7
|
+
|
8
8
|
def verify
|
9
9
|
return if @verified
|
10
10
|
|
11
|
-
$logger.debug 'verifying
|
12
|
-
raise MissingPhantomJS unless command_exist?
|
11
|
+
$logger.debug 'verifying g`phantomjs` is present'
|
12
|
+
raise MissingPhantomJS unless command_exist? 'phantomjs'
|
13
13
|
|
14
|
-
$logger.debug 'verifying
|
15
|
-
raise MissingImageMagick unless command_exist?
|
14
|
+
$logger.debug 'verifying g`imagemagick` is present'
|
15
|
+
raise MissingImageMagick unless command_exist? 'convert'
|
16
16
|
|
17
17
|
@verified = true
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
@@ -5,18 +5,18 @@ module Snapcrawl
|
|
5
5
|
include Colsole
|
6
6
|
|
7
7
|
SEVERITY_COLORS = {
|
8
|
-
'INFO'
|
9
|
-
'WARN'
|
10
|
-
'ERROR' => :
|
11
|
-
'FATAL' => :
|
12
|
-
'DEBUG' => :
|
8
|
+
'INFO' => :b,
|
9
|
+
'WARN' => :y,
|
10
|
+
'ERROR' => :r,
|
11
|
+
'FATAL' => :r,
|
12
|
+
'DEBUG' => :c,
|
13
13
|
}
|
14
|
-
|
14
|
+
|
15
15
|
def log_formatter
|
16
16
|
proc do |severity, _time, _prog, message|
|
17
17
|
severity_color = SEVERITY_COLORS[severity]
|
18
|
-
line = "
|
19
|
-
use_colors? ? colorize(line) :
|
18
|
+
line = "#{severity_color}`#{severity.rjust 5}` : #{message}\n"
|
19
|
+
use_colors? ? colorize(line) : strip_colors(line)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -25,11 +25,12 @@ module Snapcrawl
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def tty?
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
case ENV['TTY']
|
29
|
+
when 'on' then true
|
30
|
+
when 'off' then false
|
31
|
+
else
|
32
|
+
$stdout.tty?
|
33
|
+
end
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
data/lib/snapcrawl/page.rb
CHANGED
@@ -10,11 +10,12 @@ module Snapcrawl
|
|
10
10
|
|
11
11
|
attr_reader :url, :depth
|
12
12
|
|
13
|
-
EXTENSION_BLACKLIST =
|
14
|
-
PROTOCOL_BLACKLIST =
|
13
|
+
EXTENSION_BLACKLIST = 'png|gif|jpg|pdf|zip'
|
14
|
+
PROTOCOL_BLACKLIST = 'mailto|tel'
|
15
15
|
|
16
16
|
def initialize(url, depth: 0)
|
17
|
-
@url
|
17
|
+
@url = url.protocolize
|
18
|
+
@depth = depth
|
18
19
|
end
|
19
20
|
|
20
21
|
def valid?
|
@@ -31,18 +32,21 @@ module Snapcrawl
|
|
31
32
|
|
32
33
|
def links
|
33
34
|
return nil unless valid?
|
35
|
+
|
34
36
|
doc = Nokogiri::HTML http_response.body
|
35
37
|
normalize_links doc.css('a')
|
36
38
|
end
|
37
39
|
|
38
40
|
def pages
|
39
41
|
return nil unless valid?
|
40
|
-
|
42
|
+
|
43
|
+
links.map { |link| Page.new link, depth: depth + 1 }
|
41
44
|
end
|
42
45
|
|
43
46
|
def save_screenshot(outfile)
|
44
47
|
return false unless valid?
|
45
|
-
|
48
|
+
|
49
|
+
Screenshot.new(url).save outfile
|
46
50
|
end
|
47
51
|
|
48
52
|
private
|
@@ -54,16 +58,14 @@ module Snapcrawl
|
|
54
58
|
def http_response!
|
55
59
|
response = cache.get(url) { HTTParty.get url, httparty_options }
|
56
60
|
|
57
|
-
|
58
|
-
$logger.warn "http error on
|
61
|
+
unless response.success?
|
62
|
+
$logger.warn "http error on mu`#{url}`, code: y`#{response.code}`, message: #{response.message.strip}"
|
59
63
|
end
|
60
64
|
|
61
65
|
response
|
62
|
-
|
63
66
|
rescue => e
|
64
|
-
$logger.error "http error on
|
67
|
+
$logger.error "http error on mu`#{url}` - r`#{e.class}`: #{e.message}"
|
65
68
|
nil
|
66
|
-
|
67
69
|
end
|
68
70
|
|
69
71
|
def httparty_options
|
@@ -89,8 +91,8 @@ module Snapcrawl
|
|
89
91
|
return nil if link.empty?
|
90
92
|
|
91
93
|
# Remove links to specific extensions and protocols
|
92
|
-
return nil if
|
93
|
-
return nil if
|
94
|
+
return nil if /\.(#{EXTENSION_BLACKLIST})(\?.*)?$/o.match?(link)
|
95
|
+
return nil if /^(#{PROTOCOL_BLACKLIST}):/o.match?(link)
|
94
96
|
|
95
97
|
# Strip spaces
|
96
98
|
link.strip!
|
@@ -99,12 +101,13 @@ module Snapcrawl
|
|
99
101
|
begin
|
100
102
|
link = Addressable::URI.join(url, link).to_s.dup
|
101
103
|
rescue => e
|
102
|
-
$logger.warn "
|
104
|
+
$logger.warn "r`#{e.class}`: #{e.message} on #{path} (link: #{link})"
|
103
105
|
return nil
|
104
106
|
end
|
105
107
|
|
106
108
|
# Keep only links in our base domain
|
107
109
|
return nil unless link.include? site
|
110
|
+
|
108
111
|
link
|
109
112
|
end
|
110
113
|
|
@@ -2,21 +2,24 @@ module Snapcrawl
|
|
2
2
|
module PairSplit
|
3
3
|
refine Array do
|
4
4
|
def pair_split
|
5
|
-
|
5
|
+
false_values = %w[no false]
|
6
|
+
true_values = %w[yes true]
|
7
|
+
|
8
|
+
to_h do |pair|
|
6
9
|
key, value = pair.split '='
|
7
|
-
|
8
|
-
value = if
|
9
|
-
value.to_i
|
10
|
-
elsif
|
10
|
+
|
11
|
+
value = if /^\d+$/.match?(value)
|
12
|
+
value.to_i
|
13
|
+
elsif false_values.include? value
|
11
14
|
false
|
12
|
-
elsif
|
15
|
+
elsif true_values.include? value
|
13
16
|
true
|
14
17
|
else
|
15
18
|
value
|
16
19
|
end
|
17
20
|
|
18
21
|
[key, value]
|
19
|
-
end
|
22
|
+
end
|
20
23
|
end
|
21
24
|
end
|
22
25
|
end
|
data/lib/snapcrawl/screenshot.rb
CHANGED
@@ -27,10 +27,10 @@ module Snapcrawl
|
|
27
27
|
hide_output do
|
28
28
|
webshot.capture url, image_path, webshot_options do |magick|
|
29
29
|
magick.combine_options do |c|
|
30
|
-
c.background
|
30
|
+
c.background 'white'
|
31
31
|
c.gravity 'north'
|
32
32
|
c.quality 100
|
33
|
-
c.extent Config.height
|
33
|
+
c.extent Config.height.positive? ? "#{Config.width}x#{Config.height}" : "#{Config.width}x"
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -38,9 +38,9 @@ module Snapcrawl
|
|
38
38
|
|
39
39
|
def webshot_options
|
40
40
|
result = { allowed_status_codes: [404, 401, 403] }
|
41
|
-
|
42
|
-
if Config.
|
43
|
-
result[:selector] = Config.
|
41
|
+
|
42
|
+
if Config.css_selector
|
43
|
+
result[:selector] = Config.css_selector
|
44
44
|
result[:full] = false
|
45
45
|
end
|
46
46
|
|
@@ -55,16 +55,19 @@ module Snapcrawl
|
|
55
55
|
@webshot ||= Webshot::Screenshot.instance
|
56
56
|
end
|
57
57
|
|
58
|
-
# The webshot gem messes with stdout/stderr streams so we keep it in
|
58
|
+
# The webshot gem messes with stdout/stderr streams so we keep it in
|
59
59
|
# check by using this method. Also, in some sites (e.g. uown.co) it
|
60
60
|
# prints some output to stdout, this is why we override $stdout for
|
61
61
|
# the duration of the run.
|
62
62
|
def hide_output
|
63
|
-
keep_stdout
|
64
|
-
|
63
|
+
keep_stdout = $stdout
|
64
|
+
keep_stderr = $stderr
|
65
|
+
$stdout = StringIO.new
|
66
|
+
$stderr = StringIO.new
|
65
67
|
yield
|
66
68
|
ensure
|
67
|
-
$stdout
|
69
|
+
$stdout = keep_stdout
|
70
|
+
$stderr = keep_stderr
|
68
71
|
end
|
69
72
|
end
|
70
73
|
end
|
data/lib/snapcrawl/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Snapcrawl
|
2
|
-
VERSION =
|
3
|
-
end
|
2
|
+
VERSION = '0.5.4.rc1'
|
3
|
+
end
|
metadata
CHANGED
@@ -1,127 +1,133 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snapcrawl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.4.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: addressable
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.7'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: colsole
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.8.1
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '2'
|
34
37
|
type: :runtime
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
|
-
- - "
|
41
|
+
- - ">="
|
39
42
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
43
|
+
version: 0.8.1
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
48
|
+
name: docopt
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
53
|
+
version: '0.6'
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
60
|
+
version: '0.6'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
62
|
+
name: httparty
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
65
|
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
67
|
+
version: '0.21'
|
62
68
|
type: :runtime
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
74
|
+
version: '0.21'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
76
|
+
name: lightly
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
72
78
|
requirements:
|
73
79
|
- - "~>"
|
74
80
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
81
|
+
version: '0.3'
|
76
82
|
type: :runtime
|
77
83
|
prerelease: false
|
78
84
|
version_requirements: !ruby/object:Gem::Requirement
|
79
85
|
requirements:
|
80
86
|
- - "~>"
|
81
87
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
88
|
+
version: '0.3'
|
83
89
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
90
|
+
name: nokogiri
|
85
91
|
requirement: !ruby/object:Gem::Requirement
|
86
92
|
requirements:
|
87
93
|
- - "~>"
|
88
94
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
95
|
+
version: '1.10'
|
90
96
|
type: :runtime
|
91
97
|
prerelease: false
|
92
98
|
version_requirements: !ruby/object:Gem::Requirement
|
93
99
|
requirements:
|
94
100
|
- - "~>"
|
95
101
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
102
|
+
version: '1.10'
|
97
103
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
104
|
+
name: sting
|
99
105
|
requirement: !ruby/object:Gem::Requirement
|
100
106
|
requirements:
|
101
107
|
- - "~>"
|
102
108
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
109
|
+
version: '0.4'
|
104
110
|
type: :runtime
|
105
111
|
prerelease: false
|
106
112
|
version_requirements: !ruby/object:Gem::Requirement
|
107
113
|
requirements:
|
108
114
|
- - "~>"
|
109
115
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
116
|
+
version: '0.4'
|
111
117
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
118
|
+
name: webshot
|
113
119
|
requirement: !ruby/object:Gem::Requirement
|
114
120
|
requirements:
|
115
121
|
- - "~>"
|
116
122
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0.
|
123
|
+
version: '0.1'
|
118
124
|
type: :runtime
|
119
125
|
prerelease: false
|
120
126
|
version_requirements: !ruby/object:Gem::Requirement
|
121
127
|
requirements:
|
122
128
|
- - "~>"
|
123
129
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0.
|
130
|
+
version: '0.1'
|
125
131
|
description: Snapcrawl is a command line utility for crawling a website and saving
|
126
132
|
screenshots.
|
127
133
|
email: db@dannyben.com
|
@@ -150,8 +156,9 @@ files:
|
|
150
156
|
homepage: https://github.com/DannyBen/snapcrawl
|
151
157
|
licenses:
|
152
158
|
- MIT
|
153
|
-
metadata:
|
154
|
-
|
159
|
+
metadata:
|
160
|
+
rubygems_mfa_required: 'true'
|
161
|
+
post_install_message:
|
155
162
|
rdoc_options: []
|
156
163
|
require_paths:
|
157
164
|
- lib
|
@@ -159,15 +166,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
166
|
requirements:
|
160
167
|
- - ">="
|
161
168
|
- !ruby/object:Gem::Version
|
162
|
-
version: '
|
169
|
+
version: '3.0'
|
163
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
171
|
requirements:
|
165
|
-
- - "
|
172
|
+
- - ">"
|
166
173
|
- !ruby/object:Gem::Version
|
167
|
-
version:
|
174
|
+
version: 1.3.1
|
168
175
|
requirements: []
|
169
|
-
rubygems_version: 3.
|
170
|
-
signing_key:
|
176
|
+
rubygems_version: 3.4.17
|
177
|
+
signing_key:
|
171
178
|
specification_version: 4
|
172
179
|
summary: Crawl a website and take screenshots (CLI + Library)
|
173
180
|
test_files: []
|