Drop YAML completely
[amazing.git] / lib / amazing / cli / commands.rb
blob06b80baa2a5c088728625951c1d3d7351f324244
1 # Copyright 2008 Dag Odenhall <dag.odenhall@gmail.com>
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 #    http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 module Amazing
16   class CLI
17     module Commands
18       private
20       def cmd_show_help
21         if @options[:help]
22           puts @options.help
23           exit
24         end
25       end
27       def cmd_scaffold
28         if @options[:scaffold]
29           list = {}
30           screen, statusbar = nil, nil
32           File.readlines(@options[:scaffold]).each do |line|
33             case line
35             when /^\s*screen .*(\d+)/
36               screen = $1.to_i
37               list[screen] = {}
39             when /^\s*statusbar[" ]*([^"\n ]+)/
40               statusbar = $1
41               list[screen][statusbar] = []
43             when /^\s*(graph|iconbox|progressbar|textbox)[" ]*([^"\n ]+)/
44               list[screen][statusbar] << [$1, $2]
46             when /^\s*data[" ]*([^"\n ]+)/
47               list[screen][statusbar][-1] << $1
49             end
50           end
52           list.each do |screen, statusbars|
53             statusbars.each do |statusbar, widgets|
55               puts "awesome {"
56               puts "#{'# ' if screen == 0}  set :screen => %s" % screen
57               puts "#{'# ' if statusbar == "mystatusbar"}  set :statusbar => %s" % statusbar.inspect
58               puts
60               widgets.each do |widget|
61                 type, name, datas = widget[0], widget[1], widget[2..-1]
62                 noop = !Amazing::Widgets.constants.include?(name.camel_case)
64                 puts "  widget(%s) {" % name.inspect
65                 puts "    set :module => :noop" if noop
66                 puts "#     set :module => %s" % name.to_sym.inspect unless noop
67                 puts '    set :property => "image"' if type == "iconbox"
68                 puts '#     set :property => "text"' if type == "textbox"
69                 puts "    set :property => \"data %s\"" % datas[0] if datas.size == 1
70                 puts "    set :interval => 1"
72                 Amazing::Widgets.const_get(name.camel_case).options.each do |option, data|
73                   puts "#     set %s => %s" % [option.inspect, data[:default].inspect]
74                 end unless noop
76                 if datas.size > 1
77                   puts
78                   datas.each do |data|
79                     puts "    property(\"data %s\") {" % data
80                     puts "      @default"
81                     puts "    }"
82                     puts unless data == datas.last
83                   end
84                 end
86                 puts "  }"
87                 puts unless name == widgets.last[1]
88               end
90               puts "}"
91               puts
92             end
93           end
95           exit
96         end
97       end
99       def cmd_stop_process
100         if @options[:stop]
101           stop_process(false)
102           exit
103         end
104       end
106       def cmd_list_widgets
107         if @options[:listwidgets]
108           if @options[:listwidgets] == true
109             longest_widget_name = Widgets.constants.inject {|a,b| a.length > b.length ? a : b }.length
111             Widgets.constants.sort.each do |widget|
112               widget_class = Widgets.const_get(widget)
113               puts "%-#{longest_widget_name}s : %s" % [widget, widget_class.description]
114             end
116           else
117             widget_class = Widgets.const_get(@options[:listwidgets].camel_case)
119             puts
120             puts "#{@options[:listwidgets].camel_case} - #{widget_class.description}"
121             puts
123             dependencies = widget_class.dependencies
124             unless dependencies.empty?
125               longest_dependency_name = dependencies.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
126               longest_dependency_name = 10 if longest_dependency_name < 10
127               longest_description = dependencies.values.inject {|a,b| a.length > b.length ? a : b }.length
128               longest_description = 11 if longest_description < 11
130               puts " %-#{longest_dependency_name}s | DESCRIPTION" % "DEPENDENCY"
131               puts "-" * (longest_dependency_name + longest_description + 5)
133               dependencies.keys.sort.each do |dependency|
134                 puts " %-#{longest_dependency_name}s | #{dependencies[dependency]}" % dependency
135               end
137               puts
138             end
140             options = widget_class.options
142             unless options.empty?
143               longest_option_name = options.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
144               longest_option_name = 6 if longest_option_name < 6
145               longest_description = options.values.inject {|a,b| a[:description].length > b[:description].length ? a : b }[:description].length
146               longest_description = 11 if longest_description < 11
147               longest_default = options.values.inject {|a,b| a[:default].inspect.length > b[:default].inspect.length ? a : b }[:default].inspect.length
148               longest_default = 7 if longest_default < 7
150               puts " %-#{longest_option_name}s | %-#{longest_description}s | DEFAULT" % ["OPTION", "DESCRIPTION"]
151               puts "-" * (longest_option_name + longest_description + longest_default + 8)
153               options.keys.sort_by {|option| option.to_s }.each do |option|
154                 puts " %-#{longest_option_name}s | %-#{longest_description}s | %s" % [option, options[option][:description], options[option][:default].inspect]
155               end
157               puts
158             end
160             fields = widget_class.fields
162             unless fields.empty?
163               longest_field_name = fields.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
164               longest_field_name = 5 if longest_field_name < 5
165               longest_description = fields.values.inject {|a,b| a[:description].length > b[:description].length ? a : b }[:description].length
166               longest_description = 11 if longest_description < 11
167               longest_default = fields.values.inject {|a,b| a[:default].inspect.length > b[:default].inspect.length ? a : b }[:default].inspect.length
168               longest_default = 7 if longest_default < 7
170               puts " %-#{longest_field_name + 1}s | %-#{longest_description}s | DEFAULT" % ["FIELD", "DESCRIPTION"]
171               puts "-" * (longest_field_name + longest_description + longest_default + 9)
173               fields.keys.sort_by {|field| field.to_s }.each do |field|
174                 puts " @%-#{longest_field_name}s | %-#{longest_description}s | %s" % [field, fields[field][:description], fields[field][:default].inspect]
175               end
177               puts
178             end
179           end
181           exit
182         end
183       end
185       def cmd_test_widget
186         if @options[:test]
187           widget = Widgets.const_get(@options[:test].camel_case)
188           settings = eval("{#{ARGV[0]}}")
189           instance = widget.new(settings)
190           longest_field_name = widget.fields.merge({:default => nil}).keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
192           puts "@%-#{longest_field_name}s = %s" % [:default, instance.instance_variable_get(:@default).inspect]
194           widget.fields.keys.sort_by {|field| field.to_s }.each do |field|
195             puts "@%-#{longest_field_name}s = %s" % [field, instance.instance_variable_get("@#{field}".to_sym).inspect]
196           end
198           exit
199         end
200       end
202       def cmd_explicit_updates
203         if @options[:update] != []
204           @config[:awesome].each do |awesome|
205             awesome[:widgets].each do |widget|
206               locator = "%s/%s/%s" % [widget[:identifier], awesome[:statusbar], awesome[:screen]]
207               next unless @options[:update] == :all || @options[:update].include?(locator)
209               @threads << Thread.new(awesome, widget) do |awesome, widget|
210                 update_widget(awesome[:screen], awesome[:statusbar], widget)
211               end
212             end
213           end
215           @threads.each {|t| t.join }
216           exit
217         end
218       end
220       def cmd_main
221         @config[:awesome].each do |awesome|
222           awesome[:widgets].each do |widget|
223             if widget[:interval]
224               @threads << Thread.new(awesome, widget) do |awesome, widget|
225                 iteration = 1
227                 loop do
228                   Thread.new { update_widget(awesome[:screen], awesome[:statusbar], widget, iteration) }
230                   iteration += 1
231                   sleep widget[:interval]
232                 end
233               end
234             end
235           end
236         end
237       end
238     end
239   end