aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb
blob: 4515fe931931fa44b54b4315a927c19c88660350 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
module Hbc
  class CLI
    class InternalStanza < AbstractInternalCommand
      # Syntax
      #
      #     brew cask _stanza <stanza_name> [ --table | --yaml | --inspect | --quiet ] [ <cask_token> ... ]
      #
      # If no tokens are given, then data for all Casks is returned.
      #
      # The pseudo-stanza "artifacts" is available.
      #
      # On failure, a blank line is returned on the standard output.
      #
      # Examples
      #
      #     brew cask _stanza appcast   --table
      #     brew cask _stanza app       --table alfred google-chrome adium voicemac logisim vagrant
      #     brew cask _stanza url       --table alfred google-chrome adium voicemac logisim vagrant
      #     brew cask _stanza version   --table alfred google-chrome adium voicemac logisim vagrant
      #     brew cask _stanza artifacts --table --inspect alfred google-chrome adium voicemac logisim vagrant
      #     brew cask _stanza artifacts --table --yaml    alfred google-chrome adium voicemac logisim vagrant
      #

      # TODO: this should be retrievable from Hbc::DSL
      ARTIFACTS = Set.new [
        :app,
        :suite,
        :artifact,
        :prefpane,
        :qlplugin,
        :dictionary,
        :font,
        :service,
        :colorpicker,
        :binary,
        :input_method,
        :internet_plugin,
        :audio_unit_plugin,
        :vst_plugin,
        :vst3_plugin,
        :screen_saver,
        :pkg,
        :installer,
        :stage_only,
        :nested_container,
        :uninstall,
        :preflight,
        :postflight,
        :uninstall_preflight,
        :uninstall_postflight,
      ]

      option "--table",   :table,   false
      option "--quiet",   :quiet,   false
      option "--yaml",    :yaml,    false
      option "--inspect", :inspect, false

      attr_accessor :format
      private :format, :format=

      attr_accessor :stanza
      private :stanza, :stanza=

      def initialize(*)
        super
        raise ArgumentError, "No stanza given." if args.empty?

        @stanza = args.shift.to_sym

        @format = :to_yaml if yaml?
        @format = :inspect if inspect?
      end

      def run
        return unless print_stanzas == :incomplete
        exit 1 if quiet?
        raise CaskError, "Print incomplete."
      end

      def print_stanzas
        if ARTIFACTS.include?(stanza)
          artifact_name = stanza
          @stanza = :artifacts
        end

        casks(alternative: -> { Hbc.all }).each do |cask|
          print "#{cask}\t" if table?

          unless cask.respond_to?(stanza)
            opoo "no such stanza '#{stanza}' on Cask '#{cask}'" unless quiet?
            puts ""
            next
          end

          begin
            value = cask.send(@stanza)
          rescue StandardError
            opoo "failure calling '#{stanza}' on Cask '#{cask}'" unless quiet?
            puts ""
            next
          end

          if artifact_name && !value.key?(artifact_name)
            opoo "no such stanza '#{artifact_name}' on Cask '#{cask}'" unless quiet?
            puts ""
            next
          end

          value = value.fetch(artifact_name).to_a.flatten if artifact_name

          if @format
            puts value.send(@format)
          elsif artifact_name || value.is_a?(Symbol)
            puts value.inspect
          else
            puts value.to_s
          end
        end
      end

      def self.help
        "extract and render a specific stanza for the given Casks"
      end
    end
  end
end