jackasset 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
+ ```
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../lib/jackasset'
5
+
6
+ Jackasset::Cli.call
@@ -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'
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../config/environment'
4
+
5
+ # The main module
6
+ module Jackasset
7
+ end
@@ -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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jackasset
4
+ VERSION = '1.0.0'
5
+ 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: []