jackasset 1.0.0
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 +7 -0
- data/README.md +17 -0
- data/bin/jackasset +6 -0
- data/config/environment.rb +14 -0
- data/lib/jackasset.rb +7 -0
- data/lib/jackasset/assets_checker.rb +60 -0
- data/lib/jackasset/cli.rb +45 -0
- data/lib/jackasset/rescued_response.rb +14 -0
- data/lib/jackasset/url_checker.rb +47 -0
- data/lib/jackasset/version.rb +5 -0
- metadata +67 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1bbac3afa95ece2628102ae3b506cccabb70bc13
|
4
|
+
data.tar.gz: ea7dffdd2ae06384c0ec6028aae366552c07f66b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 48843b2e7f6040aca68a88944938578dd533ddef1aa3f5cde2941588cdc208e11a70aa70dc86e691a98a81f5e2f82f55eb59bcbdc62815f7dae0a4e495b040af
|
7
|
+
data.tar.gz: 15547d586c79a63c372793352451de5d58be92dd6df6f367390fcf0b9cb15da98008889ca633264f7b2abf1815ee6e88325528af455880c3c6153dbc16677af3
|
data/README.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# jackasset
|
2
|
+
|
3
|
+
A Ruby CLI for checking local static site assets.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
```
|
8
|
+
jackasset [-p PORT] path/to/html_files
|
9
|
+
```
|
10
|
+
|
11
|
+
```
|
12
|
+
$ jackasset path/to/html_files
|
13
|
+
200 OK http://localhost:8080/images/posts/deciphering-metrics/turbulence-d401c085.jpg
|
14
|
+
404 Not Found http://localhost:8080//platform.twitter.com/widgets.js
|
15
|
+
404 Not Found https://google.com/assets/cheese.png
|
16
|
+
Finished checking 3 URLs and found 2 issues
|
17
|
+
```
|
data/bin/jackasset
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'benchmark'
|
4
|
+
require 'colorize'
|
5
|
+
require 'csv'
|
6
|
+
require 'net/http'
|
7
|
+
require 'openssl'
|
8
|
+
|
9
|
+
require_relative '../lib/jackasset'
|
10
|
+
require_relative '../lib/jackasset/assets_checker'
|
11
|
+
require_relative '../lib/jackasset/cli'
|
12
|
+
require_relative '../lib/jackasset/rescued_response'
|
13
|
+
require_relative '../lib/jackasset/url_checker'
|
14
|
+
require_relative '../lib/jackasset/version'
|
data/lib/jackasset.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jackasset
|
4
|
+
class AssetsChecker
|
5
|
+
attr_reader :host, :num_issues, :source_dir
|
6
|
+
|
7
|
+
def initialize(host:, source_dir:)
|
8
|
+
@host = host
|
9
|
+
@source_dir = source_dir
|
10
|
+
@num_issues = 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.call(host: 'http://localhost:8080', source_dir:)
|
14
|
+
new(host: host, source_dir: source_dir).call
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
img_urls
|
19
|
+
threads = img_urls.each_with_object([]) do |url, threads|
|
20
|
+
next unless url.match?(/\Ahttp/)
|
21
|
+
threads << Thread.new { check_url url }
|
22
|
+
end
|
23
|
+
threads.each(&:join)
|
24
|
+
puts "Finished checking #{img_urls.count} URLs and found #{num_issues} issues"
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def check_url(url)
|
30
|
+
display_result Jackasset::UrlChecker.new(url: url).call
|
31
|
+
end
|
32
|
+
|
33
|
+
def clean_url(url)
|
34
|
+
cleaned_url = url.gsub('src=', '').gsub('"', '').strip # Remove src, quotes, and whitespace
|
35
|
+
cleaned_url.gsub! /\A\/\//, 'http://' # Set protocol if needed
|
36
|
+
cleaned_url.slice! /\A\// # Remove single leading slash
|
37
|
+
cleaned_url.match?(/\Ahttp/) ? cleaned_url : "#{host}/#{cleaned_url}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def display_result(response)
|
41
|
+
msg = " #{response.code} #{response.message} #{response.uri.to_s}\n"
|
42
|
+
case response
|
43
|
+
when Net::HTTPSuccess, Net::HTTPRedirection
|
44
|
+
print msg.green
|
45
|
+
else
|
46
|
+
@num_issues += 1
|
47
|
+
print msg.red
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def img_urls
|
52
|
+
@img_urls ||= Dir["#{source_dir}/**/*.html"].each_with_object([]) do |path, urls|
|
53
|
+
file_content = File.read path
|
54
|
+
file_content.scan(/src=\"\S*\"/).flatten.each do |src|
|
55
|
+
urls << clean_url(src)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jackasset
|
4
|
+
# The main class
|
5
|
+
class Cli
|
6
|
+
BAD_CALL_MSG = 'Usage: jackasset [-p PORT] path/to/html_files'
|
7
|
+
PORT_RANGE = 1..65535
|
8
|
+
|
9
|
+
def self.call
|
10
|
+
new.call
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
if valid_args_without_port?
|
15
|
+
check_assets source_dir: ARGV.first
|
16
|
+
elsif valid_args_with_port?
|
17
|
+
check_assets host: "http://localhost:#{ARGV[1]}", source_dir: ARGV.last
|
18
|
+
else
|
19
|
+
puts BAD_CALL_MSG.red
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def check_assets(args)
|
26
|
+
Jackasset::AssetsChecker.call args
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid_args_with_port?
|
30
|
+
ARGV.length == 3 && valid_port_arg? && valid_dir_arg?
|
31
|
+
end
|
32
|
+
|
33
|
+
def valid_args_without_port?
|
34
|
+
ARGV.length == 1 && valid_dir_arg?
|
35
|
+
end
|
36
|
+
|
37
|
+
def valid_dir_arg?
|
38
|
+
File.directory? ARGV.last
|
39
|
+
end
|
40
|
+
|
41
|
+
def valid_port_arg?
|
42
|
+
ARGV.first == '-p' && PORT_RANGE.include?(ARGV[1])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jackasset
|
4
|
+
class RecuedResponse
|
5
|
+
attr_reader :code, :message, :uri
|
6
|
+
|
7
|
+
def initialize(code:, message:, uri:)
|
8
|
+
raise TypeError, "#{uri} is not a URI" unless uri.is_a? URI
|
9
|
+
@code = code
|
10
|
+
@message = message
|
11
|
+
@uri = uri
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jackasset
|
4
|
+
class UrlChecker
|
5
|
+
attr_reader :url_string, :uri
|
6
|
+
|
7
|
+
def initialize(url:)
|
8
|
+
@url_string = url
|
9
|
+
end
|
10
|
+
|
11
|
+
def call
|
12
|
+
check_url
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def check_url
|
18
|
+
@uri = URI(URI.escape url_string)
|
19
|
+
return invalid_uri_response unless valid_url?
|
20
|
+
response = Net::HTTP.get_response uri
|
21
|
+
response.uri ||= uri # sometimes the uri is not set
|
22
|
+
response
|
23
|
+
rescue Errno::ECONNREFUSED => e
|
24
|
+
rescued_response('Connection refused', e.message)
|
25
|
+
rescue Errno::EINVAL => e
|
26
|
+
rescued_response('Invalid argument', e.message)
|
27
|
+
rescue => e
|
28
|
+
rescued_response(e.class.to_s, e.message)
|
29
|
+
end
|
30
|
+
|
31
|
+
def invalid_uri_response
|
32
|
+
rescued_response('Invalid URL', 'URL must begin with http')
|
33
|
+
end
|
34
|
+
|
35
|
+
def rescued_response(code, message)
|
36
|
+
Jackasset::RecuedResponse.new(
|
37
|
+
code: code,
|
38
|
+
message: message,
|
39
|
+
uri: uri
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
def valid_url?
|
44
|
+
uri.kind_of?(URI::HTTP) || uri.kind_of?(URI::HTTPS)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jackasset
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kevin McCormack
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-04-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colorize
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.8'
|
27
|
+
description: A Ruby CLI for checking local static site assets.
|
28
|
+
email: HarlemSquirrel@gmail.com
|
29
|
+
executables:
|
30
|
+
- jackasset
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- README.md
|
35
|
+
- bin/jackasset
|
36
|
+
- config/environment.rb
|
37
|
+
- lib/jackasset.rb
|
38
|
+
- lib/jackasset/assets_checker.rb
|
39
|
+
- lib/jackasset/cli.rb
|
40
|
+
- lib/jackasset/rescued_response.rb
|
41
|
+
- lib/jackasset/url_checker.rb
|
42
|
+
- lib/jackasset/version.rb
|
43
|
+
homepage: https://github.com/HarlemSquirrel/jackasset
|
44
|
+
licenses:
|
45
|
+
- MIT
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 2.4.0
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 2.6.11
|
64
|
+
signing_key:
|
65
|
+
specification_version: 4
|
66
|
+
summary: Check asset sources in HTML files
|
67
|
+
test_files: []
|