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.
@@ -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: []