Move to Apache License
[amazing.git] / lib / amazing / cli / commands.rb
blob525a54f07a5b2f4ba6230e4d7179cca1d56bcf53
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_stop_process
28         if @options[:stop]
29           stop_process(false)
30           exit
31         end
32       end
34       def cmd_list_widgets
35         if @options[:listwidgets]
36           if @options[:listwidgets] == true
37             longest_widget_name = Widgets.constants.inject {|a,b| a.length > b.length ? a : b }.length
39             Widgets.constants.sort.each do |widget|
40               widget_class = Widgets.const_get(widget)
41               puts "%-#{longest_widget_name}s : %s" % [widget, widget_class.description]
42             end
44           else
45             widget_class = Widgets.const_get(@options[:listwidgets].camel_case)
47             puts
48             puts "#{@options[:listwidgets].camel_case} - #{widget_class.description}"
49             puts
51             dependencies = widget_class.dependencies
52             unless dependencies.empty?
53               longest_dependency_name = dependencies.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
54               longest_dependency_name = 10 if longest_dependency_name < 10
55               longest_description = dependencies.values.inject {|a,b| a.length > b.length ? a : b }.length
56               longest_description = 11 if longest_description < 11
58               puts " %-#{longest_dependency_name}s | DESCRIPTION" % "DEPENDENCY"
59               puts "-" * (longest_dependency_name + longest_description + 5)
61               dependencies.keys.sort.each do |dependency|
62                 puts " %-#{longest_dependency_name}s | #{dependencies[dependency]}" % dependency
63               end
65               puts
66             end
68             options = widget_class.options
70             unless options.empty?
71               longest_option_name = options.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
72               longest_option_name = 6 if longest_option_name < 6
73               longest_description = options.values.inject {|a,b| a[:description].length > b[:description].length ? a : b }[:description].length
74               longest_description = 11 if longest_description < 11
75               longest_default = options.values.inject {|a,b| a[:default].inspect.length > b[:default].inspect.length ? a : b }[:default].inspect.length
76               longest_default = 7 if longest_default < 7
78               puts " %-#{longest_option_name}s | %-#{longest_description}s | DEFAULT" % ["OPTION", "DESCRIPTION"]
79               puts "-" * (longest_option_name + longest_description + longest_default + 8)
81               options.keys.sort_by {|option| option.to_s }.each do |option|
82                 puts " %-#{longest_option_name}s | %-#{longest_description}s | %s" % [option, options[option][:description], options[option][:default].inspect]
83               end
85               puts
86             end
88             fields = widget_class.fields
90             unless fields.empty?
91               longest_field_name = fields.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
92               longest_field_name = 5 if longest_field_name < 5
93               longest_description = fields.values.inject {|a,b| a[:description].length > b[:description].length ? a : b }[:description].length
94               longest_description = 11 if longest_description < 11
95               longest_default = fields.values.inject {|a,b| a[:default].inspect.length > b[:default].inspect.length ? a : b }[:default].inspect.length
96               longest_default = 7 if longest_default < 7
98               puts " %-#{longest_field_name + 1}s | %-#{longest_description}s | DEFAULT" % ["FIELD", "DESCRIPTION"]
99               puts "-" * (longest_field_name + longest_description + longest_default + 9)
101               fields.keys.sort_by {|field| field.to_s }.each do |field|
102                 puts " @%-#{longest_field_name}s | %-#{longest_description}s | %s" % [field, fields[field][:description], fields[field][:default].inspect]
103               end
105               puts
106             end
107           end
109           exit
110         end
111       end
113       def cmd_test_widget
114         if @options[:test]
115           widget = Widgets.const_get(@options[:test].camel_case)
116           settings = YAML.load("{#{ARGV[0]}}")
117           instance = widget.new(settings)
118           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
120           puts "@%-#{longest_field_name}s = %s" % [:default, instance.instance_variable_get(:@default).inspect]
122           widget.fields.keys.sort_by {|field| field.to_s }.each do |field|
123             puts "@%-#{longest_field_name}s = %s" % [field, instance.instance_variable_get("@#{field}".to_sym).inspect]
124           end
126           exit
127         end
128       end
130       def cmd_explicit_updates
131         if @options[:update] != []
132           @config[:awesome].each do |awesome|
133             awesome[:widgets].each do |widget|
134               locator = "%s/%s/%s" % [widget[:identifier], awesome[:statusbar], awesome[:screen]]
135               next unless @options[:update] == :all || @options[:update].include?(locator)
137               @threads << Thread.new(awesome, widget) do |awesome, widget|
138                 update_widget(awesome[:screen], awesome[:statusbar], widget)
139               end
140             end
141           end
143           @threads.each {|t| t.join }
144           exit
145         end
146       end
148       def cmd_main
149         @config[:awesome].each do |awesome|
150           awesome[:widgets].each do |widget|
151             if widget[:interval]
152               @threads << Thread.new(awesome, widget) do |awesome, widget|
153                 iteration = 1
155                 loop do
156                   Thread.new { update_widget(awesome[:screen], awesome[:statusbar], widget, iteration) }
158                   iteration += 1
159                   sleep widget[:interval]
160                 end
161               end
162             end
163           end
164         end
165       end
166     end
167   end