shake 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gems +1 -0
- data/.gitignore +4 -0
- data/README.md +130 -101
- data/Rakefile +9 -0
- data/lib/shake.rb +4 -2
- data/shake.gemspec +12 -0
- data/test/mock.rb +4 -0
- data/test/unit/help_test.rb +44 -0
- metadata +30 -34
data/.gems
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
contest
|
data/.gitignore
ADDED
data/README.md
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
Shake
|
2
|
-
|
3
|
-
|
4
|
-
**Simple command runner.**
|
1
|
+
# Shake
|
2
|
+
#### Simple command runner.
|
5
3
|
|
6
4
|
Goals:
|
7
5
|
|
@@ -19,21 +17,23 @@ Why not Rake or Thor?
|
|
19
17
|
Shake was made with the idea of being easily-embeddable into your projects
|
20
18
|
for your command line runners. It's a single ~4kb Ruby file.
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
20
|
+
``` ruby
|
21
|
+
# Shakefile
|
22
|
+
# Place this file in your project somewhere
|
23
|
+
class Shake
|
24
|
+
task(:start) {
|
25
|
+
puts "Starting '#{params.join(' ')}'..."
|
26
|
+
}
|
28
27
|
|
29
|
-
|
28
|
+
task.description = "Starts something"
|
30
29
|
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
task(:stop) {
|
31
|
+
puts "Stopping..."
|
32
|
+
}
|
34
33
|
|
35
|
-
|
36
|
-
|
34
|
+
task.description = "Stops it"
|
35
|
+
end
|
36
|
+
```
|
37
37
|
|
38
38
|
In your shell:
|
39
39
|
|
@@ -56,13 +56,15 @@ Usage
|
|
56
56
|
|
57
57
|
Using the command `shake` will load your project's `Shakefile`.
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
59
|
+
``` ruby
|
60
|
+
# ~/project/Shakefile
|
61
|
+
class Shake
|
62
|
+
task(:deploy) do
|
63
|
+
puts "Deploying..."
|
64
|
+
system "ssh admin@server.com git pull && thin restart"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
```
|
66
68
|
|
67
69
|
And in your shell:
|
68
70
|
|
@@ -74,10 +76,12 @@ And in your shell:
|
|
74
76
|
|
75
77
|
Get the parameters with `params` (an array). Verify parameters with `wrong_usage`.
|
76
78
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
79
|
+
``` ruby
|
80
|
+
task(:init) do
|
81
|
+
wrong_usage if params.empty?
|
82
|
+
system "wget #{params.first}"
|
83
|
+
end
|
84
|
+
```
|
81
85
|
|
82
86
|
Example:
|
83
87
|
|
@@ -90,62 +94,74 @@ Example:
|
|
90
94
|
You may get params from it with `params.extract` or `params.delete`. Doing `extract`
|
91
95
|
will remove it from params.
|
92
96
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
97
|
+
``` ruby
|
98
|
+
task(:create) do
|
99
|
+
type = params.extract('-t') || 'default'
|
100
|
+
quiet = params.delete('-q')
|
101
|
+
file = params.shift
|
102
|
+
wrong_usage if params.any?
|
98
103
|
|
99
|
-
|
100
|
-
|
104
|
+
puts "Creating '#{file}' (quiet: #{!!quiet}, type: #{type})"
|
105
|
+
end
|
106
|
+
```
|
101
107
|
|
102
108
|
Example:
|
103
109
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
110
|
+
``` bash
|
111
|
+
$ shake create #=> Invalid
|
112
|
+
$ shake create foobar #=> Creating 'foobar' (quiet: false, type: default)
|
113
|
+
$ shake create foobar -q #=> Creating 'foobar' (quiet: true, type: default)
|
114
|
+
$ shake create foobar -t xyz #=> Creating 'foobar' (quiet: false, type: xyz)
|
115
|
+
```
|
108
116
|
|
109
|
-
|
117
|
+
### Common commands
|
110
118
|
|
111
119
|
Use `err` to print something to STDERR. Use `pass` to halt execution.
|
112
120
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
121
|
+
``` ruby
|
122
|
+
task(:delete) do
|
123
|
+
unless File.exists?(params.first)
|
124
|
+
err 'You can't delete something that doesn't exist!'
|
125
|
+
pass
|
126
|
+
end
|
118
127
|
|
119
|
-
|
120
|
-
|
128
|
+
FileUtils.rm_rf params.first
|
129
|
+
end
|
130
|
+
```
|
121
131
|
|
122
132
|
You may also pass parameters to `pass` to have it printed out before halting.
|
123
133
|
|
124
|
-
|
134
|
+
``` ruby
|
135
|
+
pass 'The target already exists.' if File.exists?(target)
|
136
|
+
```
|
125
137
|
|
126
138
|
### Default tasks
|
127
139
|
|
128
140
|
Use `default` to specify a default task. (The default task is usually `help`)
|
129
141
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
142
|
+
``` ruby
|
143
|
+
class Shake
|
144
|
+
task(:test) do
|
145
|
+
Dir['test/**/*_test.rb'].each { |f| load f }
|
146
|
+
end
|
134
147
|
|
135
|
-
|
136
|
-
|
148
|
+
default :test
|
149
|
+
end
|
137
150
|
|
138
|
-
|
151
|
+
# Typing `shake` will be the same as `shake test`
|
152
|
+
```
|
139
153
|
|
140
154
|
### Invalid commands
|
141
155
|
|
142
|
-
Use `invalid` to define what happens when
|
156
|
+
Use `invalid` to define what happens when you invoke a wrong command.
|
143
157
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
158
|
+
``` ruby
|
159
|
+
class Shake
|
160
|
+
invalid {
|
161
|
+
err "Invalid command. What's wrong with you?"
|
162
|
+
}
|
163
|
+
end
|
164
|
+
```
|
149
165
|
|
150
166
|
In your shell:
|
151
167
|
|
@@ -156,35 +172,41 @@ In your shell:
|
|
156
172
|
|
157
173
|
Tasks are executed in the class's context, so just define your helpers like so:
|
158
174
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
175
|
+
``` ruby
|
176
|
+
module Helpers
|
177
|
+
def say_status(what, str)
|
178
|
+
puts "%15s %s" % [ what, str ]
|
179
|
+
end
|
180
|
+
end
|
164
181
|
|
165
|
-
|
166
|
-
|
167
|
-
|
182
|
+
class Shake
|
183
|
+
extend Helpers
|
184
|
+
end
|
185
|
+
```
|
168
186
|
|
169
187
|
Then use them in your tasks.
|
170
188
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
189
|
+
``` ruby
|
190
|
+
class Shake
|
191
|
+
task(:info) do
|
192
|
+
say_status :info, "It's a fine day"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
```
|
176
196
|
|
177
197
|
### Manual invocation
|
178
198
|
|
179
199
|
You can use shake in your projects without using the `shake` command. (recommended!)
|
180
200
|
|
181
|
-
|
201
|
+
``` ruby
|
202
|
+
require 'shake'
|
182
203
|
|
183
|
-
|
184
|
-
|
204
|
+
# If you want to load your own project file (optional)
|
205
|
+
file = Shake.find_in_project('Projectfile') and load file
|
185
206
|
|
186
|
-
|
187
|
-
|
207
|
+
# Now define some tasks, and then:
|
208
|
+
Shake.run!
|
209
|
+
```
|
188
210
|
|
189
211
|
### Subclassing Shake
|
190
212
|
|
@@ -193,37 +215,44 @@ You may subclass shake for your own project.
|
|
193
215
|
By default, it will not have any of the default tasks (that is, `shake help`, and
|
194
216
|
the "invalid command" message). Use `include Defaults` if you want this behavior.
|
195
217
|
|
196
|
-
|
218
|
+
``` ruby
|
219
|
+
require 'shake'
|
197
220
|
|
198
|
-
|
199
|
-
|
221
|
+
class CLI < Shake
|
222
|
+
include Defaults # optional, see above
|
200
223
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
224
|
+
task(:flip) do
|
225
|
+
what = rand < 0.5 ? "heads" : "tails"
|
226
|
+
puts "The coin says #{what}"
|
227
|
+
end
|
228
|
+
end
|
206
229
|
|
207
|
-
|
230
|
+
CLI.run!
|
231
|
+
```
|
208
232
|
|
209
233
|
### Defining tasks
|
210
234
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
235
|
+
``` ruby
|
236
|
+
# In your Shakefile or something
|
237
|
+
class Shake
|
238
|
+
task(:reset) do
|
239
|
+
# ...
|
240
|
+
end
|
216
241
|
|
217
|
-
|
218
|
-
|
242
|
+
# These are optional
|
243
|
+
task.description = "Resets passwords."
|
244
|
+
task.usage = "reset USERNAME"
|
245
|
+
end
|
246
|
+
```
|
219
247
|
|
220
248
|
Alternatively:
|
221
249
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
task(:reset).description = "Resets passwords."
|
228
|
-
end
|
250
|
+
``` ruby
|
251
|
+
class Shake
|
252
|
+
task(:reset) do
|
253
|
+
# ...
|
254
|
+
end
|
229
255
|
|
256
|
+
task(:reset).description = "Resets passwords."
|
257
|
+
end
|
258
|
+
```
|
data/Rakefile
CHANGED
@@ -2,4 +2,13 @@ task :test do
|
|
2
2
|
Dir['test/**/*_test.rb'].each { |f| load f }
|
3
3
|
end
|
4
4
|
|
5
|
+
desc "Invokes the test suite in multiple RVM environments"
|
6
|
+
task :'test!' do
|
7
|
+
# Override this by adding RVM_TEST_ENVS=".." in .rvmrc
|
8
|
+
envs = ENV['RVM_TEST_ENVS'] || '1.9.2@shake,1.8.7@shake'
|
9
|
+
puts "* Testing in the following RVM environments: #{envs.gsub(',', ', ')}"
|
10
|
+
system "rvm #{envs} rake test"
|
11
|
+
end
|
12
|
+
|
13
|
+
|
5
14
|
task :default => :test
|
data/lib/shake.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
|
3
3
|
class Shake
|
4
|
-
VERSION = "0.1.
|
4
|
+
VERSION = "0.1.3"
|
5
5
|
|
6
6
|
Abort = Class.new(StandardError)
|
7
7
|
|
@@ -164,14 +164,16 @@ class Shake
|
|
164
164
|
err "Usage: #{executable} <command>"
|
165
165
|
err
|
166
166
|
err "Commands:"
|
167
|
-
tasks.each { |name, task| err " %-20s %s" % [ name, task.description ] }
|
167
|
+
tasks.each { |name, task| err " %-20s %s" % [ task.usage || name, task.description ] }
|
168
168
|
}
|
169
169
|
|
170
170
|
to.task(:help).description = "Shows a list of commands"
|
171
171
|
|
172
172
|
to.invalid {
|
173
173
|
if task(command)
|
174
|
+
usage = task(command).usage
|
174
175
|
err "Invalid usage."
|
176
|
+
err "Usage: `#{executable} #{usage}`\n" if usage
|
175
177
|
err "See `#{executable} help` for more info."
|
176
178
|
else
|
177
179
|
err "Unknown command: #{command}"
|
data/shake.gemspec
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "./lib/shake"
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = "shake"
|
4
|
+
s.version = Shake::VERSION
|
5
|
+
s.summary = %{Simple command line runner.}
|
6
|
+
s.description = %Q{Shake is a simple replacement for Thor/Rake.}
|
7
|
+
s.authors = ["Rico Sta. Cruz"]
|
8
|
+
s.email = ["rico@sinefunc.com"]
|
9
|
+
s.homepage = "http://github.com/rstacruz/shake"
|
10
|
+
s.files = `git ls-files`.strip.split("\n")
|
11
|
+
s.executables = Dir["bin/*"].map { |f| File.basename(f) }
|
12
|
+
end
|
data/test/mock.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class HelpTest < Test::Unit::TestCase
|
4
|
+
class Bake < ::Shake
|
5
|
+
include Shake::Defaults
|
6
|
+
|
7
|
+
task :build do
|
8
|
+
wrong_usage
|
9
|
+
puts "work!"
|
10
|
+
end
|
11
|
+
|
12
|
+
task.usage = "build SOMETHING"
|
13
|
+
task.description = "Builds."
|
14
|
+
|
15
|
+
task :destroy do
|
16
|
+
wrong_usage
|
17
|
+
puts "die!"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
test 'help' do
|
22
|
+
Bake.run 'help'
|
23
|
+
assert cout == ""
|
24
|
+
assert cerr.include? "build SOMETHING"
|
25
|
+
assert cerr.include? "Builds."
|
26
|
+
assert cerr.include? "destroy"
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'wrong_usage' do
|
30
|
+
Bake.run 'build'
|
31
|
+
|
32
|
+
assert ! cout.include?("work!")
|
33
|
+
assert cerr.include?("Invalid usage")
|
34
|
+
assert cerr.include?("shake build SOMETHING")
|
35
|
+
end
|
36
|
+
|
37
|
+
test 'wrong_usage 2' do
|
38
|
+
Bake.run 'destroy'
|
39
|
+
|
40
|
+
assert ! cout.include?("die!")
|
41
|
+
assert cerr.include?("Invalid usage")
|
42
|
+
assert ! cerr.include?("shake destroy")
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,65 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: shake
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Rico Sta. Cruz
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-02-20 00:00:00 +08:00
|
12
|
+
date: 2011-08-31 00:00:00.000000000 +08:00
|
14
13
|
default_executable:
|
15
14
|
dependencies: []
|
16
|
-
|
17
15
|
description: Shake is a simple replacement for Thor/Rake.
|
18
|
-
email:
|
16
|
+
email:
|
19
17
|
- rico@sinefunc.com
|
20
|
-
executables:
|
18
|
+
executables:
|
21
19
|
- shake
|
22
20
|
extensions: []
|
23
|
-
|
24
21
|
extra_rdoc_files: []
|
25
|
-
|
26
|
-
|
22
|
+
files:
|
23
|
+
- .gems
|
24
|
+
- .gitignore
|
25
|
+
- HISTORY.md
|
26
|
+
- README.md
|
27
|
+
- Rakefile
|
28
|
+
- bin/shake
|
29
|
+
- examples/example
|
30
|
+
- examples/example2
|
27
31
|
- lib/shake.rb
|
32
|
+
- shake.gemspec
|
28
33
|
- test/mock.rb
|
29
34
|
- test/test_helper.rb
|
35
|
+
- test/unit/help_test.rb
|
30
36
|
- test/unit/params_test.rb
|
31
37
|
- test/unit/shakefile_test.rb
|
32
38
|
- test/unit/subclass_test.rb
|
33
39
|
- test/unit/traverse_test.rb
|
34
|
-
- examples/example
|
35
|
-
- examples/example2
|
36
|
-
- HISTORY.md
|
37
|
-
- README.md
|
38
|
-
- Rakefile
|
39
|
-
- bin/shake
|
40
40
|
has_rdoc: true
|
41
41
|
homepage: http://github.com/rstacruz/shake
|
42
42
|
licenses: []
|
43
|
-
|
44
43
|
post_install_message:
|
45
44
|
rdoc_options: []
|
46
|
-
|
47
|
-
require_paths:
|
45
|
+
require_paths:
|
48
46
|
- lib
|
49
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
48
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
54
|
none: false
|
57
|
-
requirements:
|
58
|
-
- -
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version:
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
61
59
|
requirements: []
|
62
|
-
|
63
60
|
rubyforge_project:
|
64
|
-
rubygems_version: 1.
|
61
|
+
rubygems_version: 1.6.2
|
65
62
|
signing_key:
|
66
63
|
specification_version: 3
|
67
64
|
summary: Simple command line runner.
|
68
65
|
test_files: []
|
69
|
-
|