File: switch_ui.rb

package info (click to toggle)
ruby-compass 0.12.2~dfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 8,308 kB
  • sloc: ruby: 10,474; makefile: 42; xml: 14
file content (179 lines) | stat: -rw-r--r-- 6,037 bytes parent folder | download
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
require 'compass/exec/global_options_parser'
require 'compass/exec/project_options_parser'

module Compass::Exec
  class SwitchUI
    include GlobalOptionsParser
    include ProjectOptionsParser
    attr_accessor :args, :options, :opts

    def initialize(args)
      self.args = args
      self.options = {}
      parse!
    end

    def run!
      begin
        perform!
      rescue Exception => e
        raise e if e.is_a? SystemExit
        if e.is_a?(::Compass::Error) || e.is_a?(OptionParser::ParseError)
          $stderr.puts e.message
        else
          ::Compass::Exec::Helpers.report_error(e, @options)
        end
        return 1
      end
      return 0
    end
    
    protected
    
    def perform!
      if options[:command]
        do_command(options[:command])
      else
        puts self.opts
      end
    end
    
    def parse!
      self.opts = OptionParser.new(&method(:set_opts))
      self.opts.parse!(self.args)    
      if self.args.size > 0
        self.options[:project_name] = trim_trailing_separator(self.args.shift)
      end
      self.options[:command] ||= self.options[:project_name] ? :create_project : :update_project
      self.options[:framework] ||= :compass
    end

    def trim_trailing_separator(path)
      path[-1..-1] == File::SEPARATOR ? path[0..-2] : path
    end

    def set_opts(opts)
      opts.banner = <<END
Usage: compass [options] [project]

Description:
The compass command line tool will help you create and manage the stylesheets for your project.

To get started on a stand-alone project based on blueprint:

  compass -f blueprint my_compass_project

When you change any sass files, you must recompile your project using --update or --watch.
END
      opts.separator ''
      opts.separator 'Mode Options(only specify one):'

      opts.on('-i', '--install', :NONE, "Create a new compass project.",
                                        "  The default mode when a project is provided.") do
        self.options[:command] = :create_project
      end

      opts.on('-u', '--update', :NONE, 'Update the current project.',
                                       '  This is the default when no project is provided.') do
        self.options[:command] = :update_project
      end

      opts.on('-w', '--watch', :NONE, 'Monitor the current project for changes and update') do
        self.options[:command] = :watch_project
        self.options[:quiet] = true
      end

      opts.on('-p', '--pattern PATTERN', 'Stamp out a pattern into the current project.',
                                         '  Must be used with -f.') do |pattern|
        self.options[:command] = :stamp_pattern
        self.options[:pattern] = pattern
      end

      opts.on('-h', '--help') do
        self.options[:command] = :help
        self.options[:help_command] = :help
      end

      opts.on('--write-configuration', "Write the current configuration to the configuration file.") do
        self.options[:command] = :write_configuration
      end

      opts.on('--list-frameworks', "List compass frameworks available to use.") do
        self.options[:command] = :list_frameworks
      end

      opts.on('--validate', :NONE, 'Validate your project\'s compiled css. Requires Java.') do
        self.options[:command] = :validate_project
      end

      opts.on('--grid-img [DIMENSIONS]', 'Generate a background image to test grid alignment.',
                                         '  Dimension is given as <column_width>+<gutter_width>x<height>.',
                                         '  Defaults to 30+10x20. Height is optional.') do |dimensions|
        self.options[:grid_dimensions] = dimensions || "30+10"
        self.options[:command] = :generate_grid_background
      end

      opts.separator ''
      opts.separator 'Install/Pattern Options:'

      opts.on('-f FRAMEWORK', '--framework FRAMEWORK', 'Use the specified framework. Only one may be specified.') do |framework|
        self.options[:framework] = framework
      end

      opts.on('-n', '--pattern-name NAME', 'The name to use when stamping a pattern.',
                                           '  Must be used in combination with -p.') do |name|
        self.options[:pattern_name] = name
      end

      opts.on("-x", "--syntax SYNTAX", [:sass, :scss], "Specify the syntax to use when generating stylesheets.", "One of sass or scss. Defaults to scss.") do |syntax|
        self.options[:preferred_syntax] = syntax
      end

      opts.on('--rails', "Sets the app type to a rails project (same as --app rails).") do
        self.options[:project_type] = :rails
      end

      opts.on('--app APP_TYPE', 'Specify the kind of application to integrate with.') do |project_type|
        self.options[:project_type] = project_type.to_sym
      end

      opts.separator ''
      opts.separator 'Configuration Options:'

      set_project_options(opts)

      opts.separator ''
      opts.separator 'General Options:'

      set_global_options(opts)

      opts.on('--imports', :NONE, 'Emit an imports suitable for passing to the sass command-line.',
                                  '  Example: sass `compass --imports`',
                                  '  Note: Compass\'s Sass extensions will not be available.') do
        print ::Compass::Frameworks::ALL.map{|f| "-I #{f.stylesheets_directory}"}.join(' ')
        exit
      end

      opts.on('--install-dir', :NONE, 'Emit the location where compass is installed.') do
        puts ::Compass.base_directory
        exit
      end

      opts.on_tail("-v", "--version", "Print version") do
        self.options[:command] = :print_version
      end

      opts.on('--boring', :NONE, 'Turn off colorized output.') do
        self.options[:color_output] = false
      end

    end
    
    def do_command(command)
      command_class_name = command.to_s.split(/_/).map{|p| p.capitalize}.join('')
      command_class = eval("::Compass::Commands::#{command_class_name}")
      command_class.new(Dir.getwd, options).execute
    end

  end
end