sidekick 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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