sidekick 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.gitmodules +3 -0
- data/README.textile +23 -17
- data/Rakefile +22 -23
- data/VERSION +1 -1
- data/annotated/helpers.html +143 -0
- data/annotated/index.html +155 -0
- data/annotated/lib/sidekick.html +144 -0
- data/annotated/sidekick.html +155 -0
- data/annotated/triggers.html +76 -0
- data/annotated/util.html +74 -0
- data/lib/sidekick.rb +44 -20
- data/lib/sidekick/helpers/compile.rb +34 -0
- data/lib/sidekick/helpers/passenger.rb +14 -0
- data/lib/sidekick/helpers/shell.rb +10 -0
- data/lib/sidekick/helpers/sidekick.rb +12 -0
- data/lib/sidekick/helpers/system.rb +36 -0
- data/lib/sidekick/helpers/user_interaction.rb +15 -0
- data/lib/sidekick/triggers.rb +3 -4
- data/lib/template +1 -3
- metadata +17 -7
- data/lib/sidekick/helpers.rb +0 -71
- data/lib/sidekick/helpers/util.rb +0 -26
- data/sidekick.gemspec +0 -71
@@ -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 …
|
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 – 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> — <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> — <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">'fileutils'</span>
|
49
|
+
<span class="nb">require</span> <span class="s1">'eventmachine'</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. — 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’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">&</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">&</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">'sidekick/triggers'</span>
|
100
|
+
<span class="nb">require</span> <span class="s1">'sidekick/helpers'</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">'.sidekick'</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">'Generate new sidekick file? (Y/n)'</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">'../template'</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">"</span><span class="se">\n</span><span class="si">#{</span><span class="n">msg</span><span class="si">}</span><span class="s2">"</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 …
|
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">'em-dir-watcher'</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">'.'</span><span class="p">),</span>
|
56
|
+
<span class="ss">:include_only</span> <span class="o">=></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">=></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">"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">"</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">"every </span><span class="si">#{</span><span class="n">duration</span><span class="si">}</span><span class="s2"> seconds"</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>
|
data/annotated/util.html
ADDED
@@ -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 …
|
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">'target_os'</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">'full'</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">"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."</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">'full'</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>
|
data/lib/sidekick.rb
CHANGED
@@ -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
|
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
|
-
#
|
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
|
-
|
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) {
|
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
|
-
|
62
|
-
|
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
|