snapcrawl 0.5.3 → 0.5.4.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|