#!/usr/bin/env ruby # frozen_string_literal: true require 'optparse' # for dev purposes require 'bundler/setup' if ENV['SITE_HEALTH_GEM_DEV'] require 'site_health' def site_report(url, fields, progress) puts 'severity,title,url' if progress nurse = SiteHealth.check(url) do |n| n.clerk do |clerk| clerk.every_issue do |issue| puts [issue.severity, issue.title, issue.url].join(',') if progress end end end SiteHealth::IssuesReport.new(nurse.issues) do |r| r.fields = fields if fields end end options = {} OptionParser.new do |parser| parser.banner = 'Usage: site_health --help' parser.default_argv = ARGV parser.on('--url=val0', String, '') do |url| options[:url] = url end parser.on('--fields=priority,title,url', Array, 'Issue fields to include - by default all fields are included') do |fields| # rubocop:disable Metrics/LineLength options[:fields] = fields end parser.on('--output=result.csv', String, 'Output format, .csv or .json') do |output| options[:output] = output end parser.on('--[no-]progress', '') do |progress| options[:progress] = progress end parser.on('-h', '--help', 'How to use') do puts parser exit end end.parse! def die(error_klass, message) fail(error_klass, "#{message} - run `site_health --help`") end def perform(output, url, fields, progress, format_method) File.write( output, site_report(url, fields, progress).public_send(format_method) ) end url = options.fetch(:url) { die(ArgumentError, '--url is required') } output = options.fetch(:output) { die(ArgumentError, '--output is required') } progress = options.fetch(:progress, true) fields = options.fetch(:fields, nil) extension = File.extname(output) case extension when '.csv' then perform(output, url, fields, progress, :to_csv) when '.json' then perform(output, url, fields, progress, :to_json) when '' die(ArgumentError, "missing file extension from '#{output}'") else die(ArgumentError, "unknown file extension '#{extension}'") end