aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/cli/style.rb
blob: 638e2568543a14666f5cc87712f3a6c7a059a07f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
require "English"

module Hbc
  class CLI
    class Style < Base
      def self.help
        "checks Cask style using RuboCop"
      end

      def self.run(*args)
        retval = new(args).run
        raise CaskError, "style check failed" unless retval
      end

      attr_reader :args
      def initialize(args)
        @args = args
      end

      def run
        install_rubocop
        system "rubocop", *rubocop_args, "--", *cask_paths
        $CHILD_STATUS.success?
      end

      RUBOCOP_CASK_VERSION = "~> 0.8.3".freeze

      def install_rubocop
        Utils.capture_stderr do
          begin
            Homebrew.install_gem_setup_path! "rubocop-cask", RUBOCOP_CASK_VERSION, "rubocop"
          rescue SystemExit
            raise CaskError, $stderr.string.chomp.sub("#{Tty.red}Error#{Tty.reset}: ", "")
          end
        end
      end

      def cask_paths
        @cask_paths ||= if cask_tokens.empty?
                          Hbc.all_tapped_cask_dirs
                        elsif cask_tokens.any? { |file| File.exist?(file) }
                          cask_tokens
                        else
                          cask_tokens.map { |token| Hbc.path(token) }
                        end
      end

      def cask_tokens
        @cask_tokens ||= self.class.cask_tokens_from(args)
      end

      def rubocop_args
        fix? ? autocorrect_args : default_args
      end

      def default_args
        ["--format", "simple", "--force-exclusion", "--config", rubocop_config]
      end

      def autocorrect_args
        default_args + ["--auto-correct"]
      end

      def rubocop_config
        Hbc.default_tap.cask_dir.join(".rubocop.yml")
      end

      def fix?
        args.any? { |arg| arg =~ %r{--(fix|(auto-?)?correct)} }
      end
    end
  end
end