sidekick 0.6.2 → 0.6.3
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.
- data/.sidekick +6 -1
- data/README.textile +4 -9
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/sidekick +1 -1
- data/lib/sidekick.rb +12 -48
- data/lib/sidekick/{helpers → actions}/compile.rb +1 -1
- data/lib/sidekick/actions/passenger.rb +18 -0
- data/lib/sidekick/{helpers → actions}/rake.rb +1 -1
- data/lib/sidekick/{helpers → actions}/shell.rb +1 -1
- data/lib/sidekick/{helpers → actions}/sidekick_itself.rb +5 -1
- data/lib/sidekick/{helpers → actions}/system.rb +1 -1
- data/lib/sidekick/actions/triggers.rb +43 -0
- data/lib/sidekick/{helpers → actions}/user_interaction.rb +1 -1
- data/lib/template +16 -13
- metadata +13 -13
- data/lib/sidekick/helpers/passenger.rb +0 -14
- data/lib/sidekick/triggers.rb +0 -30
data/.sidekick
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
|
2
|
+
on_start { notify 'started..' }
|
2
3
|
|
3
|
-
|
4
|
+
on_stop { notify 'stopped..' }
|
5
|
+
|
6
|
+
after(5) { notify sh 'fortune' }
|
4
7
|
|
5
8
|
watch('lib/**.rb') { rake 'docs' }
|
6
9
|
|
@@ -10,4 +13,6 @@ auto_compile 'test/fixtures/*.sass', 'test/output/:name.css'
|
|
10
13
|
|
11
14
|
auto_compile 'test/fixtures/*.coffee', 'test/output/:name.js'
|
12
15
|
|
16
|
+
passenger_server 3002
|
17
|
+
|
13
18
|
# vim:ft=ruby
|
data/README.textile
CHANGED
@@ -3,7 +3,7 @@ h1. Sidekick
|
|
3
3
|
"Sidekick":http://ibuildlegobricks.tumblr.com/post/1398895151/automate-common-tasks-with-sidekick is a command line tool to automatically trigger actions on certain events, as defined per project, in a local @.sidekick@ file in your project folder:
|
4
4
|
|
5
5
|
<pre><code>
|
6
|
-
watch('**/*.rb') { restart_passenger; rake docs }
|
6
|
+
watch('**/*.rb') { restart_passenger; rake 'docs' }
|
7
7
|
|
8
8
|
auto_compile 'assets/*.sass', 'public/:name.css'
|
9
9
|
|
@@ -23,7 +23,7 @@ h3. Features
|
|
23
23
|
* Easy to extend
|
24
24
|
* Compiles many formats, thanks to "Tilt":http://github.com/rtomayko/tilt.
|
25
25
|
* Powered by "EventMachine":http://github.com/eventmachine/eventmachine
|
26
|
-
*
|
26
|
+
* Very brief and concise codebase.
|
27
27
|
|
28
28
|
You can "read the annotated source code":http://jbe.github.com/sidekick/sidekick.html.
|
29
29
|
|
@@ -31,16 +31,11 @@ h2. Basic usage
|
|
31
31
|
|
32
32
|
Install with @gem install sidekick@ and invoke the @sidekick@ command in your project folder. If you do not have a @.sidekick@ file, you will be offered a "template":http://github.com/jbe/sidekick/blob/master/lib/template with plenty of examples.
|
33
33
|
|
34
|
-
View source:
|
35
|
-
|
36
|
-
* "triggers":http://jbe.github.com/sidekick/triggers.html
|
37
|
-
* "helpers":http://github.com/jbe/sidekick/tree/master/lib/sidekick/helpers/
|
38
|
-
|
39
34
|
h2. Defining new triggers
|
40
35
|
|
41
|
-
Have a look at the "existing triggers":http://jbe.github.com/sidekick/triggers.html, and you will get the idea. Basically, you define new triggers by
|
36
|
+
Have a look at the "existing triggers":http://jbe.github.com/sidekick/triggers.html, and you will get the idea. Basically, you define new triggers by writing methods that hook into "EventMachine":http://github.com/eventmachine/eventmachine the same way as in @EM.run { .. }@.
|
42
37
|
|
43
|
-
|
38
|
+
If you write some useful extensions, please ask me to merge them into the main repository.
|
44
39
|
|
45
40
|
h3. Copyright
|
46
41
|
|
data/Rakefile
CHANGED
@@ -6,8 +6,8 @@ begin
|
|
6
6
|
require 'jeweler'
|
7
7
|
Jeweler::Tasks.new do |gem|
|
8
8
|
gem.name = "sidekick"
|
9
|
-
gem.summary = %Q{Automatically run common development tasks on events
|
10
|
-
gem.description = %Q{Automatically run common development tasks on events, as
|
9
|
+
gem.summary = %Q{Automatically run common development tasks on events.}
|
10
|
+
gem.description = %Q{Automatically run common development tasks on events, as prescribed in a local .sidekick file. Easy, powerful DSL. Powered by EventMachine.}
|
11
11
|
gem.email = "post@jostein.be"
|
12
12
|
gem.homepage = "http://github.com/jbe/sidekick"
|
13
13
|
gem.authors = ["Jostein Berre Eliassen,"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.3
|
data/bin/sidekick
CHANGED
data/lib/sidekick.rb
CHANGED
@@ -4,50 +4,16 @@
|
|
4
4
|
#
|
5
5
|
# ***
|
6
6
|
#
|
7
|
-
#
|
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' }`
|
7
|
+
# The default trigger definitions and helper methods -- commonly referred to as actions -- are automagically required and included from `lib/sidekick/actions/**.rb`.
|
12
8
|
|
13
9
|
require 'fileutils'
|
14
10
|
require 'eventmachine'
|
15
11
|
|
16
12
|
module Sidekick
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
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.
|
25
|
-
module Triggers
|
26
|
-
@@triggers = {}
|
27
|
-
|
28
|
-
def self.register(name, &block)
|
29
|
-
@@triggers[name] = block
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.log(str) # used by triggers
|
33
|
-
puts str
|
34
|
-
end
|
35
|
-
|
36
|
-
def method_missing(name, *args, &blk)
|
37
|
-
@@triggers[name] ?
|
38
|
-
@@triggers[name].call(blk, *args) : super
|
39
|
-
end
|
40
|
-
|
41
|
-
def respond_to?(method)
|
42
|
-
super || !!@@triggers[method]
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
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'
|
14
|
+
module Sidekick::Actions
|
15
|
+
Dir[
|
16
|
+
File.join File.dirname(__FILE__), *%w{sidekick actions **.rb}
|
51
17
|
].each {|path| load path }
|
52
18
|
|
53
19
|
constants.each do |name|
|
@@ -55,15 +21,10 @@ module Sidekick
|
|
55
21
|
end
|
56
22
|
end
|
57
23
|
|
58
|
-
|
59
|
-
|
60
|
-
# The `.sidekick` file is evaluated in the `Sidekick::Context` module, which exposes DSL style methods by extending `Sidekick::Triggers` and `Sidekick::Helpers`.
|
61
|
-
Context = Module.new
|
62
|
-
Context.extend Triggers
|
63
|
-
Context.extend Helpers
|
24
|
+
STOP_CALLBACKS = [] # called on shutdown
|
64
25
|
|
26
|
+
Context = Module.new.extend(Actions)
|
65
27
|
|
66
|
-
# `Sidekick.run!` reads and applies the `.sidekick` file, wrapping the setup phase inside `EM.run { .. }`, thus starting the event loop.
|
67
28
|
def self.run!(path='.sidekick')
|
68
29
|
ensure_config_exists(path)
|
69
30
|
|
@@ -71,20 +32,23 @@ module Sidekick
|
|
71
32
|
|
72
33
|
EventMachine.run do
|
73
34
|
Context.module_eval(
|
74
|
-
open(path) {|f| f.read },
|
35
|
+
open(path) {|f| f.read },
|
36
|
+
path
|
37
|
+
)
|
75
38
|
end
|
76
39
|
end
|
77
40
|
|
78
41
|
def self.ensure_config_exists(path)
|
79
42
|
unless File.exists?(path)
|
80
|
-
puts
|
81
|
-
gets =~ /^N|n/ ? exit :
|
43
|
+
puts "Generate #{path}? (Y/n)"
|
44
|
+
STDIN.gets =~ /^N|n/ ? exit :
|
82
45
|
FileUtils.cp(File.expand_path('../template',
|
83
46
|
__FILE__), path)
|
84
47
|
end
|
85
48
|
end
|
86
49
|
|
87
50
|
def self.stop(msg=nil)
|
51
|
+
STOP_CALLBACKS.each {|c| c.call }
|
88
52
|
EventMachine.stop
|
89
53
|
puts "\n#{msg}" if msg
|
90
54
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
module Sidekick::Actions::Passenger
|
7
|
+
|
8
|
+
def restart_passenger
|
9
|
+
FileUtils.touch './tmp/restart.txt'
|
10
|
+
log 'restarted passenger'
|
11
|
+
end
|
12
|
+
|
13
|
+
def passenger_server(port=3000)
|
14
|
+
sh "passenger start -d -p #{port.to_s}"
|
15
|
+
on_stop { sh "passenger stop -p #{port.to_s}" }
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
# 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.
|
3
|
+
module Sidekick::Actions::Triggers
|
4
|
+
|
5
|
+
|
6
|
+
def watch(glob)
|
7
|
+
needs 'em-dir-watcher', 'to watch file changes'
|
8
|
+
|
9
|
+
EMDirWatcher.watch(
|
10
|
+
File.expand_path('.'),
|
11
|
+
:include_only => [glob],
|
12
|
+
:grace_period => 0.2
|
13
|
+
) do |paths|
|
14
|
+
log_trigger "watch #{paths.inspect}"
|
15
|
+
yield(paths)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def every(duration)
|
20
|
+
EventMachine::PeriodicTimer.new(duration) do
|
21
|
+
log_trigger "every #{duration} seconds"
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def after(duration)
|
27
|
+
EventMachine::Timer.new(duration) do
|
28
|
+
log_trigger "after #{duration} seconds"
|
29
|
+
yield
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_start(&blk)
|
34
|
+
after(0, &blk)
|
35
|
+
end
|
36
|
+
|
37
|
+
def on_stop(&blk)
|
38
|
+
::Sidekick::STOP_CALLBACKS << blk
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
data/lib/template
CHANGED
@@ -1,31 +1,34 @@
|
|
1
1
|
|
2
|
-
stop "
|
2
|
+
stop "File generated. Now please fill it in."
|
3
3
|
|
4
4
|
# Now delete the line above, and set up some actions.
|
5
5
|
# Here are some samples:
|
6
6
|
|
7
7
|
|
8
|
-
#
|
8
|
+
# watch('**.rb') do |paths|
|
9
|
+
# log 'code change'
|
10
|
+
# restart_passenger
|
11
|
+
# rake 'docs'
|
12
|
+
# end
|
9
13
|
|
10
|
-
#
|
14
|
+
# after(5) { notify sh 'fortune' }
|
11
15
|
|
12
16
|
# every(60*60) { notify 'You are now one hour older.' }
|
13
17
|
|
14
|
-
#
|
18
|
+
# on_stop { notify 'Goodbye' }
|
15
19
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# restart_passenger
|
19
|
-
# rake 'doc'
|
20
|
-
# end
|
20
|
+
# auto_compile 'assets/css/*.sass', 'public/css/:name.css'
|
21
|
+
# auto_compile 'assets/js/*.coffee', 'public/js/:name.js'
|
21
22
|
|
23
|
+
# passenger_server 3002
|
22
24
|
|
23
|
-
# more sample actions:
|
24
25
|
|
25
|
-
# needs 'httparty', 'to look up your location'
|
26
|
-
# loc = HTTParty.get('http://ipinfodb.com/ip_query.php')
|
27
|
-
# notify "You are in #{loc['Response']['City']}"
|
28
26
|
|
27
|
+
# def report_location
|
28
|
+
# needs 'httparty', 'to look up your location'
|
29
|
+
# loc = HTTParty.get('http://ipinfodb.com/ip_query.php')
|
30
|
+
# notify "You are in #{loc['Response']['City']}"
|
31
|
+
# end
|
29
32
|
|
30
33
|
|
31
34
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 6
|
8
|
-
-
|
9
|
-
version: 0.6.
|
8
|
+
- 3
|
9
|
+
version: 0.6.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jostein Berre Eliassen,
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-11-
|
17
|
+
date: 2010-11-12 00:00:00 +01:00
|
18
18
|
default_executable: sidekick
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -56,7 +56,7 @@ dependencies:
|
|
56
56
|
version: "0"
|
57
57
|
type: :runtime
|
58
58
|
version_requirements: *id003
|
59
|
-
description: Automatically run common development tasks on events, as
|
59
|
+
description: Automatically run common development tasks on events, as prescribed in a local .sidekick file. Easy, powerful DSL. Powered by EventMachine.
|
60
60
|
email: post@jostein.be
|
61
61
|
executables:
|
62
62
|
- sidekick
|
@@ -76,14 +76,14 @@ files:
|
|
76
76
|
- VERSION
|
77
77
|
- bin/sidekick
|
78
78
|
- lib/sidekick.rb
|
79
|
-
- lib/sidekick/
|
80
|
-
- lib/sidekick/
|
81
|
-
- lib/sidekick/
|
82
|
-
- lib/sidekick/
|
83
|
-
- lib/sidekick/
|
84
|
-
- lib/sidekick/
|
85
|
-
- lib/sidekick/
|
86
|
-
- lib/sidekick/
|
79
|
+
- lib/sidekick/actions/compile.rb
|
80
|
+
- lib/sidekick/actions/passenger.rb
|
81
|
+
- lib/sidekick/actions/rake.rb
|
82
|
+
- lib/sidekick/actions/shell.rb
|
83
|
+
- lib/sidekick/actions/sidekick_itself.rb
|
84
|
+
- lib/sidekick/actions/system.rb
|
85
|
+
- lib/sidekick/actions/triggers.rb
|
86
|
+
- lib/sidekick/actions/user_interaction.rb
|
87
87
|
- lib/template
|
88
88
|
- test/fixtures/page.haml
|
89
89
|
- test/fixtures/site.coffee
|
@@ -121,7 +121,7 @@ rubyforge_project:
|
|
121
121
|
rubygems_version: 1.3.7
|
122
122
|
signing_key:
|
123
123
|
specification_version: 3
|
124
|
-
summary: Automatically run common development tasks on events
|
124
|
+
summary: Automatically run common development tasks on events.
|
125
125
|
test_files:
|
126
126
|
- test/helper.rb
|
127
127
|
- test/test_sidekick.rb
|
data/lib/sidekick/triggers.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Sidekick::Triggers
|
4
|
-
|
5
|
-
extend ::Sidekick::Helpers
|
6
|
-
|
7
|
-
register :watch do |callback, glob|
|
8
|
-
needs 'em-dir-watcher', 'to watch file changes'
|
9
|
-
|
10
|
-
EMDirWatcher.watch(
|
11
|
-
File.expand_path('.'),
|
12
|
-
:include_only => [glob],
|
13
|
-
:grace_period => 0.2
|
14
|
-
) do |paths|
|
15
|
-
log "watch #{paths.inspect}"
|
16
|
-
callback.call(paths)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
register :every do |callback, duration|
|
21
|
-
EventMachine::PeriodicTimer.new(duration) do
|
22
|
-
log "every #{duration} seconds"
|
23
|
-
callback.call
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
|