guard-coffeescript 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,10 +1,8 @@
1
- # Guard::CoffeeScript
2
-
3
- ![travis-ci](http://travis-ci.org/netzpirat/guard-coffeescript.png)
1
+ # Guard::CoffeeScript [![Build Status](https://secure.travis-ci.org/netzpirat/guard-coffeescript.png)](http://travis-ci.org/netzpirat/guard-coffeescript)
4
2
 
5
3
  Guard::CoffeeScript compiles or validates your CoffeeScripts automatically when files are modified.
6
4
 
7
- Tested on MRI Ruby 1.8.7, 1.9.2 and the latest versions of JRuby & Rubinius.
5
+ Tested on MRI Ruby 1.8.7, 1.9.2, REE and the latest versions of JRuby & Rubinius.
8
6
 
9
7
  If you have any questions please join us on our [Google group](http://groups.google.com/group/guard-dev) or on `#guard`
10
8
  (irc.freenode.net).
@@ -15,21 +13,15 @@ Please be sure to have [Guard](https://github.com/guard/guard) installed.
15
13
 
16
14
  Install the gem:
17
15
 
18
- ```bash
19
- $ gem install guard-coffeescript
20
- ```
16
+ $ gem install guard-coffeescript
21
17
 
22
18
  Add it to your `Gemfile`, preferably inside the development group:
23
19
 
24
- ```ruby
25
- gem 'guard-coffeescript'
26
- ```
20
+ gem 'guard-coffeescript'
27
21
 
28
22
  Add guard definition to your `Guardfile` by running this command:
29
23
 
30
- ```bash
31
- $ guard init coffeescript
32
- ```
24
+ $ guard init coffeescript
33
25
 
34
26
  ## JSON
35
27
 
@@ -41,59 +33,61 @@ to install the `json` or `json_pure` gem. On Ruby 1.9, JSON is included in the s
41
33
  Guard::CoffeeScript uses [Ruby CoffeeScript](https://github.com/josh/ruby-coffee-script/) to compile the CoffeeScripts,
42
34
  that in turn uses [ExecJS](https://github.com/sstephenson/execjs) to pick the best runtime to evaluate the JavaScript.
43
35
 
44
- ## Choose a runtime
36
+ * With CRuby you want to use a V8 JavaScript Engine or Mozilla SpiderMonkey.
37
+ * With JRuby you want to use the Mozilla Rhino.
38
+ * On Mac OS X you want to use Apple JavaScriptCore.
39
+ * On Linux or as a node.js developer you want to use Node.js (V8).
40
+ * On Windows you want to use Microsoft Windows Script Host.
41
+
42
+ ## JavaScript runtimes
43
+
44
+ The following sections gives you a short overview of the available JavaScript runtimes and how to install it.
45
45
 
46
- ### CoffeeScript executable on node.js
46
+ ### Node.js (V8)
47
47
 
48
- Please refer to the [CoffeeScript documentation](http://jashkenas.github.com/coffee-script/) for more information about
49
- how to install the latest CoffeeScript version on [node.js](http://nodejs.org/).
48
+ You can install [node.js](http://nodejs.org/) and use its V8 engine. On OS X you may want to install it with
49
+ [Homebrew](http://mxcl.github.com/homebrew/), on Linux with your package manager and on Windows you have to download and
50
+ install the [executable](http://www.nodejs.org/#download).
50
51
 
51
52
  ### V8 JavaScript Engine
52
53
 
53
54
  To use the [V8 JavaScript Engine](http://code.google.com/p/v8/), simple add `therubyracer` to your `Gemfile`.
54
55
  The Ruby Racer acts as a bridge between Ruby and the V8 engine, that will be automatically installed by the Ruby Racer.
55
56
 
56
- ```ruby
57
- group :development do
58
- gem 'therubyracer'
59
- end
60
- ```
57
+ group :development do
58
+ gem 'therubyracer'
59
+ end
61
60
 
62
61
  Another alternative is [Mustang](https://github.com/nu7hatch/mustang), a Ruby proxy library for the awesome Google V8
63
62
  JavaScript engine. Just add `mustang` to your `Gemfile`:
64
63
 
65
- ```ruby
66
- group :development do
67
- gem 'mustang'
68
- end
69
- ```
64
+ group :development do
65
+ gem 'mustang'
66
+ end
70
67
 
71
68
  ### Mozilla SpiderMonkey
72
69
 
73
70
  To use [Mozilla SpiderMonkey](https://developer.mozilla.org/en/SpiderMonkey), simple add `johnson` to your `Gemfile`.
74
71
  Johnson embeds the Mozilla SpiderMonkey JavaScript runtime as a C extension.
75
72
 
76
- ```ruby
77
- group :development do
78
- gem 'johnson'
79
- end
80
- ```
73
+ group :development do
74
+ gem 'johnson'
75
+ end
81
76
 
82
77
  ### Mozilla Rhino
83
78
 
84
79
  If you're using JRuby, you can embed the [Mozilla Rhino](http://www.mozilla.org/rhino/) runtime by adding `therubyrhino`
85
80
  to your `Gemfile`:
86
81
 
87
- ```ruby
88
- group :development do
89
- gem 'therubyrhino'
90
- end
91
- ```
82
+ group :development do
83
+ gem 'therubyrhino'
84
+ end
92
85
 
93
86
  ### Apple JavaScriptCore
94
87
 
95
- JavaScriptCore is only available on Mac OS X. To use JavaScript Core you don't have to install anything, because
96
- JavaScriptCore is packaged with Mac OS X.
88
+ [JavaScriptCore](http://developer.apple.com/library/mac/#documentation/Carbon/Reference/WebKit_JavaScriptCore_Ref/index.html)
89
+ is Safari's Nitro JavaScript Engine and only usable on Mac OS X. You don't have to install anything, because
90
+ JavaScriptCore is already packaged with Mac OS X.
97
91
 
98
92
  ### Microsoft Windows Script Host
99
93
 
@@ -109,71 +103,61 @@ Please read the [Guard usage documentation](https://github.com/guard/guard#readm
109
103
  Guard::CoffeeScript can be adapted to all kind of projects. Please read the
110
104
  [Guard documentation](https://github.com/guard/guard#readme) for more information about the Guardfile DSL.
111
105
 
112
- ### Standard Ruby gem
106
+ ### Ruby project
113
107
 
114
- In a custom Ruby project you want to configure your `:input` and `:output` directories.
108
+ In a Ruby project you want to configure your input and output directories.
115
109
 
116
- ```ruby
117
- guard 'coffeescript', :input => 'coffeescripts', :output => 'javascripts'
118
- ```
110
+ guard 'coffeescript', :input => 'coffeescripts', :output => 'javascripts'
119
111
 
120
112
  If your output directory is the same as the input directory, you can simply skip it:
121
113
 
122
- ```ruby
123
- guard 'coffeescript', :input => 'javascripts'
124
- ```
114
+ guard 'coffeescript', :input => 'javascripts'
125
115
 
126
116
  ### Rails app with the asset pipeline
127
117
 
128
118
  With the introduction of the [asset pipeline](http://guides.rubyonrails.org/asset_pipeline.html) in Rails 3.1 there is
129
- no need to compile your CoffeeScripts with this Guard. However if you like to have instant validation feedback
130
- (preferably with a Growl notification) directly after you save a change, then you may want still use this Guard and just
131
- skip the generation of the output file:
119
+ no need to compile your CoffeeScripts with this Guard.
132
120
 
133
- ```ruby
134
- guard 'coffeescript', :input => 'app/assets/javascripts', :noop => true
135
- ```
121
+ However, if you would still like to have feedback on the validation of your CoffeeScripts
122
+ (preferably with a Growl notification) directly after you save a change, then you can still
123
+ use this Guard and simply skip generation of the output file:
124
+
125
+ guard 'coffeescript', :input => 'app/assets/javascripts', :noop => true
136
126
 
137
127
  This give you a faster compilation feedback compared to making a subsequent request to your Rails application. If you
138
128
  just want to be notified when an error occurs you can hide the success compilation message:
139
129
 
140
- ```ruby
141
- guard 'coffeescript', :input => 'app/assets/javascripts', :noop => true, :hide_success => true
142
- ```
130
+ guard 'coffeescript', :input => 'app/assets/javascripts', :noop => true, :hide_success => true
143
131
 
144
132
  ### Rails app without the asset pipeline
145
133
 
146
134
  Without the asset pipeline you just define an input and output directory like within a normal Ruby project:
147
135
 
148
- ```ruby
149
- guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts',
150
- ```
136
+ guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts'
151
137
 
152
138
  ## Options
153
139
 
154
140
  There following options can be passed to Guard::CoffeeScript:
155
141
 
156
- ```ruby
157
- :input => 'coffeescripts' # Relative path to the input directory.
158
- # A suffix `/(.+\.coffee)` will be added to this option.
159
- # default: nil
142
+ :input => 'coffeescripts' # Relative path to the input directory.
143
+ # A suffix `/(.+\.coffee)` will be added to this option.
144
+ # default: nil
160
145
 
161
- :output => 'javascripts' # Relative path to the output directory.
162
- # default: the path given with the :input option
146
+ :output => 'javascripts' # Relative path to the output directory.
147
+ # default: the path given with the :input option
163
148
 
164
- :noop => true # No operation: do not write an output file.
165
- # default: false
149
+ :noop => true # No operation: do not write an output file.
150
+ # default: false
166
151
 
167
- :bare => true # Compile without the top-level function wrapper.
168
- # Provide either a boolean value or an Array of filenames.
169
- # default: false
152
+ :bare => true # Compile without the top-level function wrapper.
153
+ # Provide either a boolean value or an Array of filenames.
154
+ # default: false
170
155
 
171
- :shallow => true # Do not create nested output directories.
172
- # default: false
156
+ :shallow => true # Do not create nested output directories.
157
+ # default: false
173
158
 
174
- :hide_success => true # Disable successful compilation messages.
175
- # default: false
176
- ```
159
+ :hide_success => true # Disable successful compilation messages.
160
+ # default: false
177
161
 
178
162
  ### Output short notation
179
163
 
@@ -181,25 +165,19 @@ In addition to the standard configuration, this Guard has a short notation for c
181
165
  and output directory. This notation creates a watcher from the `:input` parameter that matches all CoffeeScript files
182
166
  under the given directory and you don't have to specify a watch regular expression.
183
167
 
184
- ```ruby
185
- guard 'coffeescript', :input => 'javascripts'
186
- ```
168
+ guard 'coffeescript', :input => 'javascripts'
187
169
 
188
170
  ### Selective bare option
189
171
 
190
172
  The `:bare` option can take a boolean value that indicates if all scripts should be compiled without the top-level
191
173
  function wrapper.
192
174
 
193
- ```ruby
194
- :bare => true
195
- ```
175
+ :bare => true
196
176
 
197
177
  But you can also pass an Array of filenames that should be compiled without the top-level function wrapper. The path of
198
178
  the file to compile is ignored, so the list of filenames should not contain any path information:
199
179
 
200
- ```ruby
201
- :bare => %w{ a.coffee b.coffee }
202
- ```
180
+ :bare => %w{ a.coffee b.coffee }
203
181
 
204
182
  In the above example, all `a.coffee` and `b.coffee` files will be compiled with option `:bare => true` and all other
205
183
  files with option `:bare => false`.
@@ -211,27 +189,19 @@ the match of the watch regular expression:
211
189
 
212
190
  A file
213
191
 
214
- ```bash
215
- /app/coffeescripts/ui/buttons/toggle_button.coffee
216
- ```
192
+ /app/coffeescripts/ui/buttons/toggle_button.coffee
217
193
 
218
194
  that has been detected by the watch
219
195
 
220
- ```ruby
221
- watch(%r{^app/coffeescripts/(.+\.coffee)$})
222
- ```
196
+ watch(%r{^app/coffeescripts/(.+\.coffee)$})
223
197
 
224
198
  with an output directory of
225
199
 
226
- ```ruby
227
- :output => 'public/javascripts/compiled'
228
- ```
200
+ :output => 'public/javascripts/compiled'
229
201
 
230
202
  will be compiled to
231
203
 
232
- ```bash
233
- public/javascripts/compiled/ui/buttons/toggle_button.js
234
- ```
204
+ public/javascripts/compiled/ui/buttons/toggle_button.js
235
205
 
236
206
  Note the parenthesis around the `.+\.coffee`. This enables Guard::CoffeeScript to place the full path that was matched
237
207
  inside the parenthesis into the proper output directory.
@@ -243,42 +213,40 @@ compiled directly to the output directory.
243
213
 
244
214
  The Guard short notation
245
215
 
246
- ```ruby
247
- guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts/compiled'
248
- ```
216
+ guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts/compiled'
249
217
 
250
218
  will be internally converted into the standard notation by adding `/(.+\.coffee)` to the `input` option string and
251
219
  create a Watcher that is equivalent to:
252
220
 
253
- ```ruby
254
- guard 'coffeescript', :output => 'public/javascripts/compiled' do
255
- watch(%r{^app/coffeescripts/(.+\.coffee)$})
256
- end
257
- ```
221
+ guard 'coffeescript', :output => 'public/javascripts/compiled' do
222
+ watch(%r{^app/coffeescripts/(.+\.coffee)$})
223
+ end
258
224
 
259
225
  To add a second source directory that will be compiled to the same output directory, just add another watcher:
260
226
 
261
- ```ruby
262
- guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts/compiled' do
263
- watch(%r{lib/coffeescripts/(.+\.coffee)})
264
- end
265
- ```
227
+ guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts/compiled' do
228
+ watch(%r{lib/coffeescripts/(.+\.coffee)})
229
+ end
266
230
 
267
231
  which is equivalent to:
268
232
 
269
- ```ruby
270
- guard 'coffeescript', :output => 'public/javascripts/compiled' do
271
- watch(%r{app/coffeescripts/(.+\.coffee)})
272
- watch(%r{lib/coffeescripts/(.+\.coffee)})
273
- end
274
- ```
233
+ guard 'coffeescript', :output => 'public/javascripts/compiled' do
234
+ watch(%r{app/coffeescripts/(.+\.coffee)})
235
+ watch(%r{lib/coffeescripts/(.+\.coffee)})
236
+ end
275
237
 
276
238
  ## Development
277
239
 
278
- - Source hosted at [GitHub](https://github.com/netzpirat/guard-coffeescript)
279
- - Report issues and feature requests to [GitHub Issues](https://github.com/netzpirat/guard-coffeescript/issues)
240
+ - Documentation hosted at [RubyDoc](http://rubydoc.info/gems/guard-coffeescript/frames).
241
+ - Source hosted at [GitHub](https://github.com/netzpirat/guard-coffeescript).
242
+ - Report issues and feature requests to [GitHub Issues](https://github.com/netzpirat/guard-coffeescript/issues).
243
+
244
+ Pull requests are very welcome! Please try to follow these simple "rules", though:
280
245
 
281
- Pull requests are very welcome! Make sure your patches are well tested.
246
+ - Please create a topic branch for every separate change you make.
247
+ - Make sure your patches are well tested.
248
+ - Update the README (if applicable).
249
+ - Please **do not change** the version number.
282
250
 
283
251
  For questions please join us on our [Google group](http://groups.google.com/group/guard-dev) or on `#guard`
284
252
  (irc.freenode.net).
@@ -292,7 +260,10 @@ For questions please join us on our [Google group](http://groups.google.com/grou
292
260
 
293
261
  ## Acknowledgment
294
262
 
295
- The [Guard Team](https://github.com/guard/guard/contributors) for giving us such a nice pice of software
263
+ [Jeremy Ashkenas][] for [CoffeeScript][], that little language that compiles into JavaScript and makes me enjoy the
264
+ frontend.
265
+
266
+ The [Guard Team](https://github.com/guard/guard/contributors) for giving us such a nice piece of software
296
267
  that is so easy to extend, one *has* to make a plugin for it!
297
268
 
298
269
  All the authors of the numerous [Guards](https://github.com/guard) available for making the Guard ecosystem
@@ -3,19 +3,34 @@ require 'guard/guard'
3
3
  require 'guard/watcher'
4
4
 
5
5
  module Guard
6
+
7
+ # The CoffeeScript guard that gets notifications about the following
8
+ # Guard events: `start`, `stop`, `reload`, `run_all` and `run_on_change`.
9
+ #
6
10
  class CoffeeScript < Guard
7
11
 
8
12
  autoload :Formatter, 'guard/coffeescript/formatter'
9
13
  autoload :Inspector, 'guard/coffeescript/inspector'
10
14
  autoload :Runner, 'guard/coffeescript/runner'
11
15
 
12
- def initialize(watchers = [], options = {})
16
+ # Initialize Guard::CoffeeScript.
17
+ #
18
+ # @param [Array<Guard::Watcher>] watchers the watchers in the Guard block
19
+ # @param [Hash] options the options for the Guard
20
+ # @option options [String] :input the input directory
21
+ # @option options [String] :output the output directory
22
+ # @option options [Boolean] :bare do not wrap the output in a top level function
23
+ # @option options [Boolean] :shallow do not create nested directories
24
+ # @option options [Boolean] :hide_success hide success message notification
25
+ # @option options [Boolean] :noop do not generate an output file
26
+ #
27
+ def initialize(watchers = [], options = { })
13
28
  watchers = [] if !watchers
14
29
  defaults = {
15
- :bare => false,
16
- :shallow => false,
30
+ :bare => false,
31
+ :shallow => false,
17
32
  :hide_success => false,
18
- :noop => false
33
+ :noop => false
19
34
  }
20
35
 
21
36
  if options[:input]
@@ -26,10 +41,19 @@ module Guard
26
41
  super(watchers, defaults.merge(options))
27
42
  end
28
43
 
44
+ # Gets called when all specs should be run.
45
+ #
46
+ # @return [Boolean] when running all specs was successful
47
+ #
29
48
  def run_all
30
49
  run_on_change(Watcher.match_files(self, Dir.glob(File.join('**', '*.coffee'))))
31
50
  end
32
51
 
52
+ # Gets called when watched paths and files have changes.
53
+ #
54
+ # @param [Array<String>] paths the changed paths and files
55
+ # @return [Boolean] when running the changed specs was successful
56
+ #
33
57
  def run_on_change(paths)
34
58
  changed_files, success = Runner.run(Inspector.clean(paths), watchers, options)
35
59
  notify changed_files
@@ -39,6 +63,11 @@ module Guard
39
63
 
40
64
  private
41
65
 
66
+ # Notify changed files back to Guard, so that other Guards can continue
67
+ # to work with the generated files.
68
+ #
69
+ # @param [Array<String>] changed_files the files that have been changed
70
+ #
42
71
  def notify(changed_files)
43
72
  ::Guard.guards.each do |guard|
44
73
  paths = Watcher.match_files(guard, changed_files)
@@ -1,32 +1,73 @@
1
1
  module Guard
2
2
  class CoffeeScript
3
+
4
+ # The Guard::CoffeeScript formatter collects console and
5
+ # system notification methods and enhances them with
6
+ # some color information.
7
+ #
3
8
  module Formatter
4
9
  class << self
5
10
 
6
- def info(message, options={ })
11
+ # Print an info message to the console.
12
+ #
13
+ # @param [String] message the message to print
14
+ # @param [Hash] options the output options
15
+ # @option options [Boolean] :reset reset the UI
16
+ #
17
+ def info(message, options = { })
7
18
  ::Guard::UI.info(message, options)
8
19
  end
9
20
 
10
- def debug(message, options={})
21
+ # Print a debug message to the console.
22
+ #
23
+ # @param [String] message the message to print
24
+ # @param [Hash] options the output options
25
+ # @option options [Boolean] :reset reset the UI
26
+ #
27
+ def debug(message, options = { })
11
28
  ::Guard::UI.debug(message, options)
12
29
  end
13
30
 
14
- def error(message, options={})
31
+ # Print a red error message to the console.
32
+ #
33
+ # @param [String] message the message to print
34
+ # @param [Hash] options the output options
35
+ # @option options [Boolean] :reset reset the UI
36
+ #
37
+ def error(message, options = { })
15
38
  ::Guard::UI.error(color(message, ';31'), options)
16
39
  end
17
40
 
18
- def success(message, options={})
41
+ # Print a green success message to the console.
42
+ #
43
+ # @param [String] message the message to print
44
+ # @param [Hash] options the output options
45
+ # @option options [Boolean] :reset reset the UI
46
+ #
47
+ def success(message, options = { })
19
48
  ::Guard::UI.info(color(message, ';32'), options)
20
49
  end
21
50
 
22
- def notify(message, options={})
51
+ # Outputs a system notification.
52
+ #
53
+ # @param [String] message the message to print
54
+ # @param [Hash] options the output options
55
+ # @option options [Symbol, String] :image the image to use, either :failed, :pending or :success, or an image path
56
+ # @option options [String] :title the title of the system notification
57
+ #
58
+ def notify(message, options = { })
23
59
  ::Guard::Notifier.notify(message, options)
24
60
  end
25
61
 
26
62
  private
27
63
 
64
+ # Print a info message to the console.
65
+ #
66
+ # @param [String] test the text to colorize
67
+ # @param [String] color_code the color code
68
+ #
28
69
  def color(text, color_code)
29
- ::Guard::UI.send(:color_enabled?) ? "\e[0#{color_code}m#{text}\e[0m" : text
70
+ ::Guard::UI.send(:color_enabled?) ? "\e[0#{ color_code }m#{ text }\e[0m" : text
30
71
  end
31
72
 
32
73
  end