class HTMLProofer::Configuration

Constants

CACHE_DEFAULTS
DEFAULT_TESTS
HYDRA_DEFAULTS
PROOFER_DEFAULTS
TYPHOEUS_DEFAULTS

Public Class Methods

generate_defaults(opts) click to toggle source
# File lib/html_proofer/configuration.rb, line 49
def generate_defaults(opts)
  options = PROOFER_DEFAULTS.merge(opts)

  options[:typhoeus] = HTMLProofer::Configuration::TYPHOEUS_DEFAULTS.merge(opts[:typhoeus] || {})
  options[:hydra] = HTMLProofer::Configuration::HYDRA_DEFAULTS.merge(opts[:hydra] || {})

  options[:cache] = HTMLProofer::Configuration::CACHE_DEFAULTS.merge(opts[:cache] || {})

  options.delete(:src)

  options
end
new() click to toggle source
# File lib/html_proofer/configuration.rb, line 63
def initialize
  @options = {}
end

Public Instance Methods

parse_cli_options(args) click to toggle source
# File lib/html_proofer/configuration.rb, line 67
def parse_cli_options(args)
  define_options.parse!(args)

  input = ARGV.empty? ? "." : ARGV.join(",")

  [@options, input]
end
parse_json_option(option_name, config, symbolize_names: true) click to toggle source
# File lib/html_proofer/configuration.rb, line 263
def parse_json_option(option_name, config, symbolize_names: true)
  raise ArgumentError, "Must provide an option name in string format." unless option_name.is_a?(String)
  raise ArgumentError, "Must provide an option name in string format." if option_name.strip.empty?

  return {} if config.nil?

  raise ArgumentError, "Must provide a JSON configuration in string format." unless config.is_a?(String)

  return {} if config.strip.empty?

  begin
    JSON.parse(config, { symbolize_names: symbolize_names })
  rescue StandardError
    raise ArgumentError, "Option '#{option_name} did not contain valid JSON."
  end
end

Private Instance Methods

define_options() click to toggle source
# File lib/html_proofer/configuration.rb, line 75
        def define_options
  OptionParser.new do |opts|
    opts.banner = "Usage: htmlproofer [options] PATH/LINK"

    section(opts, "Input Options") do
      set_option(opts, "--as-links") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--assume-extension EXT") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--directory-index-file FILENAME") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--extensions [EXT1,EXT2,...]") do |long_opt_symbol, list|
        @options[long_opt_symbol] = list.nil? ? [] : list.split(",")
      end
    end

    section(opts, "Check Configuration") do
      set_option(opts, "--[no-]allow-hash-href") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--[no-]allow-missing-href") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--checks [CHECK1,CHECK2,...]") do |long_opt_symbol, list|
        @options[long_opt_symbol] = list.nil? ? [] : list.split(",")
      end

      set_option(opts, "--[no-]check-external-hash") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--[no-]check-internal-hash") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--[no-]check-sri") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--[no-]disable-external") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--[no-]enforce-https") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--root-dir <DIR>") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end
    end

    section(opts, "Ignore Configuration") do
      set_option(opts, "--ignore-files [FILE1,FILE2,...]") do |long_opt_symbol, list|
        @options[long_opt_symbol] = if list.nil?
          []
        else
          list.split(",").map.each do |l|
            if l.start_with?("/") && l.end_with?("/")
              Regexp.new(l[1...-1])
            else
              l
            end
          end
        end
      end

      set_option(opts, "--[no-]ignore-empty-alt") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--[no-]ignore-empty-mailto") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--[no-]ignore-missing-alt") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end

      set_option(opts, "--ignore-status-codes [500,401,420,...]") do |long_opt_symbol, list|
        @options[long_opt_symbol] = list.nil? ? [] : list.split(",").map(&:to_i)
      end

      set_option(opts, "--ignore-urls [URL1, URL2,...]") do |long_opt_symbol, list|
        @options[long_opt_symbol] = if list.nil?
          []
        else
          list.split(",").each_with_object([]) do |url, arr|
            arr << to_regex?(url)
          end
        end
      end

      set_option(opts, "--only-status-codes [404,451,...]") do |long_opt_symbol, list|
        @options[long_opt_symbol] = list.nil? ? [] : list.split(",")
      end

      set_option(opts, "--only-4xx") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg
      end
    end

    section(opts, "Transforms Configuration") do
      set_option(opts, "--swap-attributes <CONFIG>") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = parse_json_option("swap_attributes", arg, symbolize_names: false)
      end

      set_option(opts, "--swap-urls [re:string,re:string,...]") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = str_to_regexp_map(arg)
      end
    end

    section(opts, "Dependencies Configuration") do
      set_option(opts, "--typhoeus <CONFIG>") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = parse_json_option("typhoeus", arg, symbolize_names: false)
      end

      set_option(opts, "--hydra <CONFIG>") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = parse_json_option("hydra", arg, symbolize_names: true)
      end

      set_option(opts, "--cache <CONFIG>") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = parse_json_option("cache", arg, symbolize_names: true)
      end
    end

    section(opts, "Reporting Configuration") do
      set_option(opts, "--log-level <LEVEL>") do |long_opt_symbol, arg|
        @options[long_opt_symbol] = arg.to_sym
      end
    end

    section(opts, "General Configuration") do
      set_option(opts, "--version") do
        puts HTMLProofer::VERSION
        exit(0)
      end
    end
  end
end
parse_long_opt(long_opt) click to toggle source

Converts the option into a symbol, e.g. ‘–allow-hash-href’ => :allow_hash_href.

# File lib/html_proofer/configuration.rb, line 259
        def parse_long_opt(long_opt)
  long_opt[2..].sub("[no-]", "").sub(/ .*/, "").tr("-", "_").gsub(/[\[\]]/, "").to_sym
end
section(opts, heading) { || ... } click to toggle source
# File lib/html_proofer/configuration.rb, line 242
        def section(opts, heading, &_block)
  opts.separator("\n#{heading}:\n")
  yield
end
set_option(opts, long_arg) { |long_opt_symbol, arg| ... } click to toggle source
# File lib/html_proofer/configuration.rb, line 247
        def set_option(opts, long_arg, &block)
  long_opt_symbol = parse_long_opt(long_arg)
  args = []
  args += Array(ConfigurationHelp::TEXT[long_opt_symbol])

  opts.on(long_arg, *args) do |arg|
    yield long_opt_symbol, arg
  end
end
str_to_regexp_map(arg) click to toggle source
# File lib/html_proofer/configuration.rb, line 232
        def str_to_regexp_map(arg)
  arg.split(",").each_with_object({}) do |s, hsh|
    split = s.split(/(?<!\\):/, 2)

    re = split[0].gsub("\\:", ":")
    string = split[1].gsub("\\:", ":")
    hsh[Regexp.new(re)] = string
  end
end
to_regex?(item) click to toggle source
# File lib/html_proofer/configuration.rb, line 224
        def to_regex?(item)
  if item.start_with?("/") && item.end_with?("/")
    Regexp.new(item[1...-1])
  else
    item
  end
end