sidekick 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,155 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
+ <title>sidekick.rb</title>
6
+ <link rel="stylesheet" href="http://jashkenas.github.com/docco/resources/docco.css">
7
+ </head>
8
+ <body>
9
+ <div id='container'>
10
+ <div id="background"></div>
11
+ <div id="jump_to">
12
+ Jump To &hellip;
13
+ <div id="jump_wrapper">
14
+ <div id="jump_page">
15
+ <a class="source" href="sidekick.html">sidekick.rb</a>
16
+ <a class="source" href="helpers.html">helpers.rb</a>
17
+ <a class="source" href="util.html">util.rb</a>
18
+ <a class="source" href="triggers.html">triggers.rb</a>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ <table cellspacing=0 cellpadding=0>
23
+ <thead>
24
+ <tr>
25
+ <th class=docs><h1>sidekick.rb</h1></th>
26
+ <th class=code></th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ <tr id='section-1'>
31
+ <td class=docs>
32
+ <div class="octowrap">
33
+ <a class="octothorpe" href="#section-1">#</a>
34
+ </div>
35
+ <p> <em>Sidekick</em> is a simple event driven background assistant. Among other things, you can use it to automatically compile assets, test code, restart servers and so on &ndash; as prescribed per project, in a <code>.sidekick</code> file. It is powered by EventMachine and Tilt.</p>
36
+
37
+ <p> This is the annotated source code. See the <a href="http://github.com/jbe/sidekick#readme">README</a> too.</p>
38
+
39
+ <hr />
40
+
41
+ <p> Sidekick basically helps you do two things:</p>
42
+
43
+ <p> &mdash; <em>Define</em> named triggers, such as saying that <code>watch(glob)</code> means doing something when a file matching <code>glob</code> changes, or that <code>every(duration)</code> means doing something every <code>duration</code> seconds.</p>
44
+
45
+ <p> &mdash; <em>Use</em> the defined triggers with callbacks, such as <code>watch(**.rb) { notify 'Code change' }</code></p>
46
+ </td>
47
+ <td class=code>
48
+ <div class='highlight'><pre><span class="nb">require</span> <span class="s1">&#39;fileutils&#39;</span>
49
+ <span class="nb">require</span> <span class="s1">&#39;eventmachine&#39;</span>
50
+
51
+ <span class="k">module</span> <span class="nn">Sidekick</span></pre></div>
52
+ </td>
53
+ </tr>
54
+ <tr id='section-2'>
55
+ <td class=docs>
56
+ <div class="octowrap">
57
+ <a class="octothorpe" href="#section-2">#</a>
58
+ </div>
59
+ <p> This core functionality is provided by <code>Sidekick::Triggers</code>.</p>
60
+
61
+ <p> New triggers can be defined by calling <code>Sidekick::Triggers.register(:trigger_name) { ... }</code>.</p>
62
+
63
+ <p>Basically, the job of a trigger definition is to take the parameters and the block from a call in <code>.sidekick</code> and use it to hook into EventMachine in some way. &mdash; Just have a look at the <a href="http://github.com/jbe/sidekick/blob/master/lib/sidekick/triggers.rb">default trigger library</a>.</p>
64
+
65
+ <p> By using Ruby&rsquo;s <code>method_missing</code>, we can forward method calls to the registered trigger definitions. Any module can thereby extend the <code>Triggers</code> module in order to expose the defined triggers as if they were methods.</p>
66
+ </td>
67
+ <td class=code>
68
+ <div class='highlight'><pre> <span class="k">module</span> <span class="nn">Triggers</span>
69
+ <span class="vc">@@triggers</span> <span class="o">=</span> <span class="p">{}</span>
70
+
71
+ <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">register</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
72
+ <span class="vc">@@triggers</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span> <span class="o">=</span> <span class="n">block</span>
73
+ <span class="k">end</span>
74
+
75
+ <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">log</span><span class="p">(</span><span class="n">str</span><span class="p">)</span> <span class="c1"># used by triggers</span>
76
+ <span class="nb">puts</span> <span class="n">str</span>
77
+ <span class="k">end</span>
78
+
79
+ <span class="k">def</span> <span class="nf">method_missing</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">blk</span><span class="p">)</span>
80
+ <span class="vc">@@triggers</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span> <span class="p">?</span>
81
+ <span class="vc">@@triggers</span><span class="o">[</span><span class="nb">name</span><span class="o">].</span><span class="n">call</span><span class="p">(</span><span class="n">blk</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="p">:</span> <span class="k">super</span>
82
+ <span class="k">end</span>
83
+
84
+ <span class="k">def</span> <span class="nf">respond_to?</span><span class="p">(</span><span class="nb">method</span><span class="p">)</span>
85
+ <span class="k">super</span> <span class="o">||</span> <span class="o">!!</span><span class="vc">@@triggers</span><span class="o">[</span><span class="nb">method</span><span class="o">]</span>
86
+ <span class="k">end</span>
87
+
88
+ <span class="k">end</span></pre></div>
89
+ </td>
90
+ </tr>
91
+ <tr id='section-3'>
92
+ <td class=docs>
93
+ <div class="octowrap">
94
+ <a class="octothorpe" href="#section-3">#</a>
95
+ </div>
96
+ <p> A default library of triggers and helpers is included..</p>
97
+ </td>
98
+ <td class=code>
99
+ <div class='highlight'><pre> <span class="nb">require</span> <span class="s1">&#39;sidekick/triggers&#39;</span>
100
+ <span class="nb">require</span> <span class="s1">&#39;sidekick/helpers&#39;</span></pre></div>
101
+ </td>
102
+ </tr>
103
+ <tr id='section-4'>
104
+ <td class=docs>
105
+ <div class="octowrap">
106
+ <a class="octothorpe" href="#section-4">#</a>
107
+ </div>
108
+ <p> The <code>.sidekick</code> file is evaluated in a <code>Sidekick::Context</code> module, which exposes DSL style methods by extending <code>Sidekick::Triggers</code> and <code>Sidekick::Helpers</code>.</p>
109
+ </td>
110
+ <td class=code>
111
+ <div class='highlight'><pre> <span class="no">Context</span> <span class="o">=</span> <span class="no">Module</span><span class="o">.</span><span class="n">new</span>
112
+ <span class="no">Context</span><span class="o">.</span><span class="n">extend</span> <span class="no">Triggers</span>
113
+ <span class="no">Context</span><span class="o">.</span><span class="n">extend</span> <span class="no">Helpers</span></pre></div>
114
+ </td>
115
+ </tr>
116
+ <tr id='section-5'>
117
+ <td class=docs>
118
+ <div class="octowrap">
119
+ <a class="octothorpe" href="#section-5">#</a>
120
+ </div>
121
+ <p> The <code>Sidekick.run!</code> method reads and applies the <code>.sidekick</code> file, wrapping the setup phase inside <code>EM.run { .. }</code>, and thus begins the event loop.</p>
122
+
123
+ </td>
124
+ <td class=code>
125
+ <div class='highlight'><pre> <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">run!</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s1">&#39;.sidekick&#39;</span><span class="p">)</span>
126
+ <span class="n">ensure_config_exists</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
127
+
128
+ <span class="no">Signal</span><span class="o">.</span><span class="n">trap</span><span class="p">(</span><span class="ss">:INT</span><span class="p">)</span> <span class="p">{</span> <span class="n">stop</span> <span class="p">}</span>
129
+
130
+ <span class="no">EventMachine</span><span class="o">.</span><span class="n">run</span> <span class="k">do</span>
131
+ <span class="no">Context</span><span class="o">.</span><span class="n">module_eval</span><span class="p">(</span>
132
+ <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="p">{</span><span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span> <span class="p">},</span> <span class="n">path</span> <span class="p">)</span>
133
+ <span class="k">end</span>
134
+ <span class="k">end</span>
135
+
136
+ <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">ensure_config_exists</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
137
+ <span class="k">unless</span> <span class="no">File</span><span class="o">.</span><span class="n">exists?</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
138
+ <span class="nb">puts</span> <span class="s1">&#39;Generate new sidekick file? (Y/n)&#39;</span>
139
+ <span class="nb">gets</span> <span class="o">=~</span> <span class="sr">/^N|n/</span> <span class="p">?</span> <span class="nb">exit</span> <span class="p">:</span>
140
+ <span class="no">FileUtils</span><span class="o">.</span><span class="n">cp</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s1">&#39;../template&#39;</span><span class="p">,</span>
141
+ <span class="bp">__FILE__</span><span class="p">),</span> <span class="n">path</span><span class="p">)</span>
142
+ <span class="k">end</span>
143
+ <span class="k">end</span>
144
+
145
+ <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">stop</span><span class="p">(</span><span class="n">msg</span><span class="o">=</span><span class="kp">false</span><span class="p">)</span>
146
+ <span class="no">EventMachine</span><span class="o">.</span><span class="n">stop</span>
147
+ <span class="nb">puts</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">#{</span><span class="n">msg</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">msg</span>
148
+ <span class="k">end</span>
149
+
150
+ <span class="k">end</span></pre></div>
151
+ </td>
152
+ </tr>
153
+ </table>
154
+ </div>
155
+ </body>
@@ -0,0 +1,76 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
+ <title>triggers.rb</title>
6
+ <link rel="stylesheet" href="http://jashkenas.github.com/docco/resources/docco.css">
7
+ </head>
8
+ <body>
9
+ <div id='container'>
10
+ <div id="background"></div>
11
+ <div id="jump_to">
12
+ Jump To &hellip;
13
+ <div id="jump_wrapper">
14
+ <div id="jump_page">
15
+ <a class="source" href="sidekick.html">sidekick.rb</a>
16
+ <a class="source" href="helpers.html">helpers.rb</a>
17
+ <a class="source" href="util.html">util.rb</a>
18
+ <a class="source" href="triggers.html">triggers.rb</a>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ <table cellspacing=0 cellpadding=0>
23
+ <thead>
24
+ <tr>
25
+ <th class=docs><h1>triggers.rb</h1></th>
26
+ <th class=code></th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ <tr id='section-1'>
31
+ <td class=docs>
32
+ <div class="octowrap">
33
+ <a class="octothorpe" href="#section-1">#</a>
34
+ </div>
35
+
36
+ </td>
37
+ <td class=code>
38
+ <div class='highlight'><pre><span class="nb">require</span> <span class="s1">&#39;em-dir-watcher&#39;</span>
39
+
40
+
41
+ <span class="k">module</span> <span class="nn">Sidekick::Triggers</span></pre></div>
42
+ </td>
43
+ </tr>
44
+ <tr id='section-2'>
45
+ <td class=docs>
46
+ <div class="octowrap">
47
+ <a class="octothorpe" href="#section-2">#</a>
48
+ </div>
49
+ <p> default triggers</p>
50
+
51
+ </td>
52
+ <td class=code>
53
+ <div class='highlight'><pre> <span class="n">register</span> <span class="ss">:watch</span> <span class="k">do</span> <span class="o">|</span><span class="n">callback</span><span class="p">,</span> <span class="n">glob</span><span class="o">|</span>
54
+ <span class="no">EMDirWatcher</span><span class="o">.</span><span class="n">watch</span><span class="p">(</span>
55
+ <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">),</span>
56
+ <span class="ss">:include_only</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="n">glob</span><span class="o">]</span><span class="p">,</span>
57
+ <span class="ss">:grace_period</span> <span class="o">=&gt;</span> <span class="mi">0</span><span class="o">.</span><span class="mi">2</span>
58
+ <span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">paths</span><span class="o">|</span>
59
+ <span class="n">log</span> <span class="s2">&quot;watch </span><span class="si">#{</span><span class="n">paths</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2">&quot;</span>
60
+ <span class="n">callback</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">paths</span><span class="p">)</span>
61
+ <span class="k">end</span>
62
+ <span class="k">end</span>
63
+
64
+ <span class="n">register</span> <span class="ss">:every</span> <span class="k">do</span> <span class="o">|</span><span class="n">callback</span><span class="p">,</span> <span class="n">duration</span><span class="o">|</span>
65
+ <span class="no">EventMachine</span><span class="o">::</span><span class="no">PeriodicTimer</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">duration</span><span class="p">)</span> <span class="k">do</span>
66
+ <span class="n">log</span> <span class="s2">&quot;every </span><span class="si">#{</span><span class="n">duration</span><span class="si">}</span><span class="s2"> seconds&quot;</span>
67
+ <span class="n">callback</span><span class="o">.</span><span class="n">call</span>
68
+ <span class="k">end</span>
69
+ <span class="k">end</span>
70
+
71
+ <span class="k">end</span></pre></div>
72
+ </td>
73
+ </tr>
74
+ </table>
75
+ </div>
76
+ </body>
@@ -0,0 +1,74 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
+ <title>util.rb</title>
6
+ <link rel="stylesheet" href="http://jashkenas.github.com/docco/resources/docco.css">
7
+ </head>
8
+ <body>
9
+ <div id='container'>
10
+ <div id="background"></div>
11
+ <div id="jump_to">
12
+ Jump To &hellip;
13
+ <div id="jump_wrapper">
14
+ <div id="jump_page">
15
+ <a class="source" href="sidekick.html">sidekick.rb</a>
16
+ <a class="source" href="helpers.html">helpers.rb</a>
17
+ <a class="source" href="util.html">util.rb</a>
18
+ <a class="source" href="triggers.html">triggers.rb</a>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ <table cellspacing=0 cellpadding=0>
23
+ <thead>
24
+ <tr>
25
+ <th class=docs><h1>util.rb</h1></th>
26
+ <th class=code></th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ <tr id='section-1'>
31
+ <td class=docs>
32
+ <div class="octowrap">
33
+ <a class="octothorpe" href="#section-1">#</a>
34
+ </div>
35
+
36
+ </td>
37
+ <td class=code>
38
+ <div class='highlight'><pre><span class="k">module</span> <span class="nn">Util</span></pre></div>
39
+ </td>
40
+ </tr>
41
+ <tr id='section-2'>
42
+ <td class=docs>
43
+ <div class="octowrap">
44
+ <a class="octothorpe" href="#section-2">#</a>
45
+ </div>
46
+ <p> :linux, :darwin, :other</p>
47
+
48
+ </td>
49
+ <td class=code>
50
+ <div class='highlight'><pre> <span class="k">def</span> <span class="nf">platform</span>
51
+ <span class="o">[</span><span class="ss">:linux</span><span class="p">,</span> <span class="ss">:darwin</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">plf</span><span class="o">|</span>
52
+ <span class="k">return</span> <span class="n">plf</span> <span class="k">if</span> <span class="no">Config</span><span class="o">::</span><span class="no">CONFIG</span><span class="o">[</span><span class="s1">&#39;target_os&#39;</span><span class="o">]</span> <span class="o">=~</span> <span class="sr">/</span><span class="si">#{</span><span class="n">plf</span><span class="si">}</span><span class="sr">/i</span>
53
+ <span class="k">end</span><span class="p">;</span> <span class="ss">:other</span>
54
+ <span class="k">end</span>
55
+
56
+ <span class="k">def</span> <span class="nf">gem_load?</span><span class="p">(</span><span class="n">gemname</span><span class="p">,</span> <span class="n">function</span><span class="o">=</span><span class="s1">&#39;full&#39;</span><span class="p">)</span>
57
+ <span class="vi">@installed</span> <span class="o">||=</span> <span class="k">begin</span>
58
+ <span class="nb">require</span> <span class="n">gemname</span>
59
+ <span class="kp">true</span>
60
+ <span class="k">rescue</span> <span class="no">LoadError</span>
61
+ <span class="s2">&quot;Please gem install </span><span class="si">#{</span><span class="n">gemname</span><span class="si">}</span><span class="s2"> for </span><span class="si">#{</span><span class="n">function</span><span class="si">}</span><span class="s2"> support.&quot;</span>
62
+ <span class="o">::</span><span class="no">Sidekick</span><span class="o">.</span><span class="n">stop</span>
63
+ <span class="k">end</span>
64
+ <span class="k">end</span>
65
+
66
+ <span class="k">def</span> <span class="nf">platform_load?</span><span class="p">(</span><span class="n">gems</span><span class="p">,</span> <span class="n">function</span><span class="o">=</span><span class="s1">&#39;full&#39;</span><span class="p">)</span>
67
+ <span class="n">gem_load?</span><span class="p">(</span><span class="n">gems</span><span class="o">[</span><span class="n">platform</span><span class="o">]</span><span class="p">,</span> <span class="n">function</span><span class="p">)</span>
68
+ <span class="k">end</span>
69
+ <span class="k">end</span></pre></div>
70
+ </td>
71
+ </tr>
72
+ </table>
73
+ </div>
74
+ </body>
@@ -1,8 +1,27 @@
1
+ # *Sidekick* is a simple event driven background assistant. Among other things, you can use it to automatically compile assets, test code, restart servers and so on - as prescribed per project, in a `.sidekick` file. It is powered by [EventMachine](http://github.com/eventmachine/eventmachine) and [Tilt](http://github.com/rtomayko/tilt).
2
+ #
3
+ # This is the annotated source code. See the [README](http://github.com/jbe/sidekick#readme) too.
4
+ #
5
+ # ***
6
+ #
7
+ # Sidekick basically helps you do two things:
8
+ #
9
+ # -- *Define* named triggers, such as saying that `watch(glob)` means doing something when a file matching `glob` changes, or that `every(duration)` means doing something every `duration` seconds.
10
+ #
11
+ # -- *Use* the defined triggers with callbacks, such as `watch(**.rb) { notify 'Code change' }`
12
+
1
13
  require 'fileutils'
2
14
  require 'eventmachine'
3
15
 
4
16
  module Sidekick
5
17
 
18
+ # This core functionality is provided by `Sidekick::Triggers`.
19
+ #
20
+ # New triggers can be defined by calling `Sidekick::Triggers.register(:trigger_name) { ... }`.
21
+ #
22
+ #Basically, the job of a trigger definition is to take the parameters and the block from a directive in the `.sidekick` file, and then hook into EventMachine in some way to set up the trigger. -- Just have a look at the [default trigger library](http://jbe.github.com/sidekick/triggers.html).
23
+ #
24
+ # By using Ruby's `method_missing`, we can forward method calls to the registered trigger definitions. Any module can thereby extend the `Sidekick::Triggers` module in order to expose the defined triggers as if they were methods.
6
25
  module Triggers
7
26
  @@triggers = {}
8
27
 
@@ -25,32 +44,30 @@ module Sidekick
25
44
 
26
45
  end
27
46
 
28
- # default library
47
+ # This part includes the default trigger definitions and helper methods. `Sidekick::Helpers` automagically loads the code in `sidekick/helpers` and then includes its sub-modules.
48
+
49
+ module Sidekick::Helpers
50
+ Dir[File.dirname(__FILE__) + '/sidekick/helpers/**.rb'
51
+ ].each {|path| load path }
52
+
53
+ constants.each do |name|
54
+ include const_get(name) if const_get(name).is_a?(Module)
55
+ end
56
+ end
57
+
29
58
  require 'sidekick/triggers'
30
- require 'sidekick/helpers'
31
59
 
32
- # context in which to evaluate .sidekick file
60
+ # The `.sidekick` file is evaluated in the `Sidekick::Context` module, which exposes DSL style methods by extending `Sidekick::Triggers` and `Sidekick::Helpers`.
33
61
  Context = Module.new
34
62
  Context.extend Triggers
35
63
  Context.extend Helpers
36
64
 
37
65
 
38
- def self.ensure_config_exists(path)
39
- unless File.exists?(path)
40
- puts 'Generate new sidekick file? (Y/n)'
41
- gets =~ /^N|n/ ? exit :
42
- FileUtils.cp(File.expand_path('../template',
43
- __FILE__), path)
44
- end
45
- end
46
-
47
- # reads and applies the .sidekick file, and begins
48
- # the event loop.
66
+ # `Sidekick.run!` reads and applies the `.sidekick` file, wrapping the setup phase inside `EM.run { .. }`, thus starting the event loop.
49
67
  def self.run!(path='.sidekick')
50
-
51
68
  ensure_config_exists(path)
52
69
 
53
- Signal.trap(:INT) { ::Sidekick.stop }
70
+ Signal.trap(:INT) { stop }
54
71
 
55
72
  EventMachine.run do
56
73
  Context.module_eval(
@@ -58,11 +75,18 @@ module Sidekick
58
75
  end
59
76
  end
60
77
 
61
- # stops Sidekick gracefully
62
- def self.stop(msg=false)
78
+ def self.ensure_config_exists(path)
79
+ unless File.exists?(path)
80
+ puts 'Generate new sidekick file? (Y/n)'
81
+ gets =~ /^N|n/ ? exit :
82
+ FileUtils.cp(File.expand_path('../template',
83
+ __FILE__), path)
84
+ end
85
+ end
86
+
87
+ def self.stop(msg=nil)
63
88
  EventMachine.stop
64
- puts
65
- puts msg if msg
89
+ puts "\n#{msg}" if msg
66
90
  end
67
91
 
68
92
  end
@@ -0,0 +1,34 @@
1
+
2
+
3
+ module Sidekick::Helpers::Compile
4
+
5
+ # Compiles one template using the `tilt` gem.
6
+
7
+ def compile(source, target)
8
+ needs 'tilt', 'to compile templates'
9
+
10
+ begin
11
+ File.open(target, 'w') do |f|
12
+ f.write(Tilt.new(source).render)
13
+ end
14
+ rescue Exception => e
15
+ notify "Error compiling #{file}:\n#{e}"
16
+ end
17
+ end
18
+
19
+
20
+ # watches for changes matching the `source` glob, and compiles to `target`, replacing ':name' in `target` with the basename of the changed file.
21
+ def auto_compile(source, target)
22
+
23
+ watch(source) do |files|
24
+ files.each do |file|
25
+ if File.exists?(file)
26
+ t = target.gsub(':name', File.basename(file, '.*'))
27
+ compile file, t
28
+ log "render #{file} => #{t}"
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,14 @@
1
+
2
+
3
+
4
+
5
+
6
+ module Sidekick::Helpers::Passenger
7
+
8
+ def restart_passenger
9
+ FileUtils.touch './tmp/restart.txt'
10
+ log 'restarted passenger'
11
+ end
12
+
13
+
14
+ end