thor 0.13.3 → 0.13.4
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/CHANGELOG.rdoc +1 -0
- data/lib/thor/actions.rb +5 -4
- data/lib/thor/actions/file_manipulation.rb +1 -1
- data/lib/thor/group.rb +12 -15
- data/lib/thor/invocation.rb +5 -0
- data/lib/thor/parser/arguments.rb +4 -0
- data/lib/thor/parser/options.rb +19 -5
- data/lib/thor/shell.rb +8 -3
- data/lib/thor/version.rb +1 -1
- data/spec/actions/file_manipulation_spec.rb +9 -0
- data/spec/actions_spec.rb +8 -8
- data/spec/parser/options_spec.rb +18 -1
- data/spec/shell_spec.rb +9 -0
- data/spec/spec_helper.rb +1 -0
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
data/lib/thor/actions.rb
CHANGED
@@ -184,7 +184,7 @@ class Thor
|
|
184
184
|
shell.padding -= 1 if verbose
|
185
185
|
end
|
186
186
|
|
187
|
-
# Executes a command.
|
187
|
+
# Executes a command returning the contents of the command.
|
188
188
|
#
|
189
189
|
# ==== Parameters
|
190
190
|
# command<String>:: the command to be executed.
|
@@ -209,7 +209,7 @@ class Thor
|
|
209
209
|
end
|
210
210
|
|
211
211
|
say_status :run, desc, config.fetch(:verbose, true)
|
212
|
-
|
212
|
+
`#{command}` unless options[:pretend]
|
213
213
|
end
|
214
214
|
|
215
215
|
# Executes a ruby script (taking into account WIN32 platform quirks).
|
@@ -220,7 +220,7 @@ class Thor
|
|
220
220
|
#
|
221
221
|
def run_ruby_script(command, config={})
|
222
222
|
return unless behavior == :invoke
|
223
|
-
run
|
223
|
+
run command, config.merge(:with => Thor::Util.ruby_command)
|
224
224
|
end
|
225
225
|
|
226
226
|
# Run a thor command. A hash of options can be given and it's converted to
|
@@ -243,12 +243,13 @@ class Thor
|
|
243
243
|
def thor(task, *args)
|
244
244
|
config = args.last.is_a?(Hash) ? args.pop : {}
|
245
245
|
verbose = config.key?(:verbose) ? config.delete(:verbose) : true
|
246
|
+
pretend = config.key?(:pretend) ? config.delete(:pretend) : false
|
246
247
|
|
247
248
|
args.unshift task
|
248
249
|
args.push Thor::Options.to_switches(config)
|
249
250
|
command = args.join(' ').strip
|
250
251
|
|
251
|
-
run command, :with => :thor, :verbose => verbose
|
252
|
+
run command, :with => :thor, :verbose => verbose, :pretend => pretend
|
252
253
|
end
|
253
254
|
|
254
255
|
protected
|
@@ -48,7 +48,7 @@ class Thor
|
|
48
48
|
#
|
49
49
|
def get(source, destination=nil, config={}, &block)
|
50
50
|
source = File.expand_path(find_in_source_paths(source.to_s)) unless source =~ /^http\:\/\//
|
51
|
-
render =
|
51
|
+
render = open(source).binmode.read
|
52
52
|
|
53
53
|
destination ||= if block_given?
|
54
54
|
block.arity == 1 ? block.call(render) : block.call
|
data/lib/thor/group.rb
CHANGED
@@ -253,22 +253,19 @@ class Thor::Group
|
|
253
253
|
# Shortcut to invoke with padding and block handling. Use internally by
|
254
254
|
# invoke and invoke_from_option class methods.
|
255
255
|
def _invoke_for_class_method(klass, task=nil, *args, &block) #:nodoc:
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
256
|
+
with_padding do
|
257
|
+
if block
|
258
|
+
case block.arity
|
259
|
+
when 3
|
260
|
+
block.call(self, klass, task)
|
261
|
+
when 2
|
262
|
+
block.call(self, klass)
|
263
|
+
when 1
|
264
|
+
instance_exec(klass, &block)
|
265
|
+
end
|
266
|
+
else
|
267
|
+
invoke klass, task, *args
|
266
268
|
end
|
267
|
-
else
|
268
|
-
invoke klass, task, *args
|
269
269
|
end
|
270
|
-
|
271
|
-
shell.padding -= 1
|
272
|
-
result
|
273
270
|
end
|
274
271
|
end
|
data/lib/thor/invocation.rb
CHANGED
data/lib/thor/parser/options.rb
CHANGED
@@ -3,9 +3,9 @@ class Thor
|
|
3
3
|
# under Ruby's license.
|
4
4
|
#
|
5
5
|
class Options < Arguments #:nodoc:
|
6
|
-
LONG_RE = /^(--\w+
|
6
|
+
LONG_RE = /^(--\w+(?:-\w+)*)$/
|
7
7
|
SHORT_RE = /^(-[a-z])$/i
|
8
|
-
EQ_RE = /^(--\w+
|
8
|
+
EQ_RE = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
|
9
9
|
SHORT_SQ_RE = /^-([a-z]{2,})$/i # Allow either -x -v or -xv style for single char args
|
10
10
|
SHORT_NUM = /^(-[a-z])#{NUMERIC}$/i
|
11
11
|
|
@@ -68,7 +68,7 @@ class Thor
|
|
68
68
|
switch = normalize_switch(switch)
|
69
69
|
option = switch_option(switch)
|
70
70
|
@assigns[option.human_name] = parse_peek(switch, option)
|
71
|
-
elsif
|
71
|
+
elsif current_is_switch_formatted?
|
72
72
|
@unknown << shift
|
73
73
|
else
|
74
74
|
shift
|
@@ -99,6 +99,19 @@ class Thor
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
+
def switch_formatted?(arg)
|
103
|
+
case arg
|
104
|
+
when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
|
105
|
+
true
|
106
|
+
else
|
107
|
+
false
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def current_is_switch_formatted?
|
112
|
+
switch_formatted? peek
|
113
|
+
end
|
114
|
+
|
102
115
|
def switch?(arg)
|
103
116
|
switch_option(arg) || @shorts.key?(arg)
|
104
117
|
end
|
@@ -135,13 +148,14 @@ class Thor
|
|
135
148
|
# Parse the value at the peek analyzing if it requires an input or not.
|
136
149
|
#
|
137
150
|
def parse_peek(switch, option)
|
138
|
-
|
151
|
+
if current_is_switch_formatted? || last?
|
139
152
|
if option.boolean?
|
140
153
|
# No problem for boolean types
|
141
154
|
elsif no_or_skip?(switch)
|
142
155
|
return nil # User set value to nil
|
143
156
|
elsif option.string? && !option.required?
|
144
|
-
|
157
|
+
# Return the default if there is one, else the human name
|
158
|
+
return option.default || option.human_name
|
145
159
|
else
|
146
160
|
raise MalformattedArgumentError, "No value provided for option '#{switch}'"
|
147
161
|
end
|
data/lib/thor/shell.rb
CHANGED
@@ -45,19 +45,16 @@ class Thor
|
|
45
45
|
|
46
46
|
# Holds the shell for the given Thor instance. If no shell is given,
|
47
47
|
# it gets a default shell from Thor::Base.shell.
|
48
|
-
#
|
49
48
|
def shell
|
50
49
|
@shell ||= Thor::Base.shell.new
|
51
50
|
end
|
52
51
|
|
53
52
|
# Sets the shell for this thor class.
|
54
|
-
#
|
55
53
|
def shell=(shell)
|
56
54
|
@shell = shell
|
57
55
|
end
|
58
56
|
|
59
57
|
# Common methods that are delegated to the shell.
|
60
|
-
#
|
61
58
|
SHELL_DELEGATED_METHODS.each do |method|
|
62
59
|
module_eval <<-METHOD, __FILE__, __LINE__
|
63
60
|
def #{method}(*args)
|
@@ -66,6 +63,14 @@ class Thor
|
|
66
63
|
METHOD
|
67
64
|
end
|
68
65
|
|
66
|
+
# Yields the given block with padding.
|
67
|
+
def with_padding
|
68
|
+
shell.padding += 1
|
69
|
+
yield
|
70
|
+
ensure
|
71
|
+
shell.padding -= 1
|
72
|
+
end
|
73
|
+
|
69
74
|
protected
|
70
75
|
|
71
76
|
# Allow shell to be shared between invocations.
|
data/lib/thor/version.rb
CHANGED
@@ -105,6 +105,15 @@ describe Thor::Actions do
|
|
105
105
|
it "logs status" do
|
106
106
|
action(:get, "doc/README", "docs/README").must == " create docs/README\n"
|
107
107
|
end
|
108
|
+
|
109
|
+
it "accepts http remote sources" do
|
110
|
+
body = "__start__\nHTTPFILE\n__end__\n"
|
111
|
+
FakeWeb.register_uri(:get, 'http://example.com/file.txt', :body => body)
|
112
|
+
action :get, 'http://example.com/file.txt' do |content|
|
113
|
+
content.must == body
|
114
|
+
end
|
115
|
+
FakeWeb.clean_registry
|
116
|
+
end
|
108
117
|
end
|
109
118
|
|
110
119
|
describe "#template" do
|
data/spec/actions_spec.rb
CHANGED
@@ -220,7 +220,7 @@ describe Thor::Actions do
|
|
220
220
|
|
221
221
|
describe "#run" do
|
222
222
|
before(:each) do
|
223
|
-
runner.should_receive(
|
223
|
+
runner.should_receive(:`).with("ls")
|
224
224
|
end
|
225
225
|
|
226
226
|
it "executes the command given" do
|
@@ -244,7 +244,7 @@ describe Thor::Actions do
|
|
244
244
|
describe "#run_ruby_script" do
|
245
245
|
before(:each) do
|
246
246
|
Thor::Util.stub!(:ruby_command).and_return("/opt/jruby")
|
247
|
-
runner.should_receive(
|
247
|
+
runner.should_receive(:`).with("/opt/jruby script.rb")
|
248
248
|
end
|
249
249
|
|
250
250
|
it "executes the ruby script" do
|
@@ -262,30 +262,30 @@ describe Thor::Actions do
|
|
262
262
|
|
263
263
|
describe "#thor" do
|
264
264
|
it "executes the thor command" do
|
265
|
-
runner.should_receive(
|
265
|
+
runner.should_receive(:`).with("thor list")
|
266
266
|
action :thor, :list, :verbose => true
|
267
267
|
end
|
268
268
|
|
269
269
|
it "converts extra arguments to command arguments" do
|
270
|
-
runner.should_receive(
|
270
|
+
runner.should_receive(:`).with("thor list foo bar")
|
271
271
|
action :thor, :list, "foo", "bar"
|
272
272
|
end
|
273
273
|
|
274
274
|
it "converts options hash to switches" do
|
275
|
-
runner.should_receive(
|
275
|
+
runner.should_receive(:`).with("thor list foo bar --foo")
|
276
276
|
action :thor, :list, "foo", "bar", :foo => true
|
277
277
|
|
278
|
-
runner.should_receive(
|
278
|
+
runner.should_receive(:`).with("thor list --foo 1 2 3")
|
279
279
|
action :thor, :list, :foo => [1,2,3]
|
280
280
|
end
|
281
281
|
|
282
282
|
it "logs status" do
|
283
|
-
runner.should_receive(
|
283
|
+
runner.should_receive(:`).with("thor list")
|
284
284
|
action(:thor, :list).must == " run thor list from \".\"\n"
|
285
285
|
end
|
286
286
|
|
287
287
|
it "does not log status if required" do
|
288
|
-
runner.should_receive(
|
288
|
+
runner.should_receive(:`).with("thor list --foo 1 2 3")
|
289
289
|
action(:thor, :list, :foo => [1,2,3], :verbose => false).must be_empty
|
290
290
|
end
|
291
291
|
end
|
data/spec/parser/options_spec.rb
CHANGED
@@ -103,6 +103,18 @@ describe Thor::Options do
|
|
103
103
|
parse("--bar", "baz", "--baz", "unknown")
|
104
104
|
lambda { check_unknown! }.must raise_error(Thor::UnknownArgumentError, "Unknown switches '--baz'")
|
105
105
|
end
|
106
|
+
|
107
|
+
it "skips leading non-switches" do
|
108
|
+
create(:foo => "baz")
|
109
|
+
|
110
|
+
parse("asdf", "--foo", "bar").must == {"foo" => "bar"}
|
111
|
+
end
|
112
|
+
|
113
|
+
it "correctly recognizes things that look kind of like options, but aren't, as not options" do
|
114
|
+
create(:foo => "baz")
|
115
|
+
parse("--asdf---asdf", "baz", "--foo", "--asdf---dsf--asdf").must == {"foo" => "--asdf---dsf--asdf"}
|
116
|
+
check_unknown!
|
117
|
+
end
|
106
118
|
|
107
119
|
describe "with no input" do
|
108
120
|
it "and no switches returns an empty hash" do
|
@@ -165,9 +177,14 @@ describe Thor::Options do
|
|
165
177
|
end
|
166
178
|
|
167
179
|
it "accepts a --switch format on non required types" do
|
168
|
-
create "--foo" =>
|
180
|
+
create "--foo" => :string
|
169
181
|
parse("--foo")["foo"].must == "foo"
|
170
182
|
end
|
183
|
+
|
184
|
+
it "accepts a --switch format on non required types with default values" do
|
185
|
+
create "--baz" => :string, "--foo" => "bar"
|
186
|
+
parse("--baz", "bang", "--foo")["foo"].must == "bar"
|
187
|
+
end
|
171
188
|
|
172
189
|
it "overwrites earlier values with later values" do
|
173
190
|
parse("--foo=bar", "--foo", "12")["foo"].must == "12"
|
data/spec/shell_spec.rb
CHANGED
@@ -22,4 +22,13 @@ describe Thor::Shell do
|
|
22
22
|
MyCounter.new([1,2]).shell.must be_kind_of(Thor::Base.shell)
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
describe "with_padding" do
|
27
|
+
it "uses padding for inside block outputs" do
|
28
|
+
base = MyCounter.new([1,2])
|
29
|
+
base.with_padding do
|
30
|
+
capture(:stdout){ base.say_status :padding, "cool" }.strip.must == "padding cool"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
25
34
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.13.
|
4
|
+
version: 0.13.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yehuda Katz
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2010-02-
|
13
|
+
date: 2010-02-26 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|