thor 0.15.2 → 0.15.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.
@@ -1,3 +1,28 @@
1
+ == 0.15.3, release 2012-06-18
2
+ * Support strict_args_position! for backwards compatibility
3
+ * Escape Dir glob characters in paths
4
+
5
+ == 0.15.2, released 2012-05-07
6
+ * Added print_in_columns
7
+ * Exposed terminal_width as a public API
8
+
9
+ == 0.15.1, release 2012-05-06
10
+ * Fix Ruby 1.8 truncation bug with unicode chars
11
+ * Fix shell delegate methods to pass their block
12
+ * Don't output trailing spaces when printing the last column in a table
13
+
14
+ == 0.15, released 2012-04-29
15
+ * Alias method_options to options
16
+ * Refactor say to allow multiple colors
17
+ * Exposed error as a public API
18
+ * Exposed file_collision as a public API
19
+ * Exposed print_wrapped as a public API
20
+ * Exposed set_color as a public API
21
+ * Fix number-formatting bugs in print_table
22
+ * Fix "indent" typo in print_table
23
+ * Fix Errno::EPIPE when piping tasks to `head`
24
+ * More friendly error messages
25
+
1
26
  == 0.14, released 2010-07-25
2
27
 
3
28
  * Added CreateLink class and #link_file method
@@ -71,7 +71,8 @@ class Thor
71
71
  protected
72
72
 
73
73
  def execute!
74
- lookup = config[:recursive] ? File.join(source, '**') : source
74
+ lookup = Util.escape_globs(source)
75
+ lookup = config[:recursive] ? File.join(lookup, '**') : lookup
75
76
  lookup = File.join(lookup, '{*,.[a-z]*}')
76
77
 
77
78
  Dir[lookup].sort.each do |file_source|
@@ -70,11 +70,12 @@ class Thor
70
70
  # arguments declared using #argument (this is primarily used
71
71
  # by Thor::Group). Tis will leave us with the remaining
72
72
  # positional arguments.
73
- thor_args = Thor::Arguments.new(self.class.arguments)
74
- thor_args.parse(args + opts.remaining).each { |k,v| send("#{k}=", v) }
75
- args = thor_args.remaining
73
+ to_parse = args
74
+ to_parse += opts.remaining unless self.class.strict_args_position?(config)
76
75
 
77
- @args = args
76
+ thor_args = Thor::Arguments.new(self.class.arguments)
77
+ thor_args.parse(to_parse).each { |k,v| send("#{k}=", v) }
78
+ @args = thor_args.remaining
78
79
  end
79
80
 
80
81
  class << self
@@ -141,6 +142,21 @@ class Thor
141
142
  !!check_unknown_options
142
143
  end
143
144
 
145
+ # If you want only strict string args (useful when cascading thor classes),
146
+ # call strict_args_position! This is disabled by default to allow dynamic
147
+ # invocations.
148
+ def strict_args_position!
149
+ @strict_args_position = true
150
+ end
151
+
152
+ def strict_args_position #:nodoc:
153
+ @strict_args_position ||= from_superclass(:strict_args_position, false)
154
+ end
155
+
156
+ def strict_args_position?(config) #:nodoc:
157
+ !!strict_args_position
158
+ end
159
+
144
160
  # Adds an argument to the class and creates an attr_accessor for it.
145
161
  #
146
162
  # Arguments are different from options in several aspects. The first one
@@ -196,8 +212,9 @@ class Thor
196
212
  "the non-required argument #{argument.human_name.inspect}."
197
213
  end if required
198
214
 
199
- arguments << Thor::Argument.new(name, options[:desc], required, options[:type],
200
- options[:default], options[:banner])
215
+ options[:required] = required
216
+
217
+ arguments << Thor::Argument.new(name, options)
201
218
  end
202
219
 
203
220
  # Returns this class arguments, looking up in the ancestors chain.
@@ -510,10 +527,9 @@ class Thor
510
527
  # ==== Parameters
511
528
  # name<Symbol>:: The name of the argument.
512
529
  # options<Hash>:: Described in both class_option and method_option.
530
+ # scope<Hash>:: Options hash that is being built up
513
531
  def build_option(name, options, scope) #:nodoc:
514
- scope[name] = Thor::Option.new(name, options[:desc], options[:required],
515
- options[:type], options[:default], options[:banner],
516
- options[:lazy_default], options[:group], options[:aliases], options[:hide])
532
+ scope[name] = Thor::Option.new(name, options)
517
533
  end
518
534
 
519
535
  # Receives a hash of options, parse them and add to the scope. This is a
@@ -576,7 +592,14 @@ class Thor
576
592
  default
577
593
  else
578
594
  value = superclass.send(method)
579
- value.dup if value
595
+
596
+ if value
597
+ if value.is_a?(TrueClass) || value.is_a?(Symbol)
598
+ value
599
+ else
600
+ value.dup
601
+ end
602
+ end
580
603
  end
581
604
  end
582
605
 
File without changes
@@ -180,7 +180,7 @@ class Thor::Group
180
180
  end
181
181
  next unless value
182
182
 
183
- klass, task = prepare_for_invocation(name, value)
183
+ klass, _ = prepare_for_invocation(name, value)
184
184
  next unless klass && klass.respond_to?(:class_options)
185
185
 
186
186
  value = value.to_s
@@ -5,18 +5,20 @@ class Thor
5
5
  attr_reader :name, :description, :required, :type, :default, :banner
6
6
  alias :human_name :name
7
7
 
8
- def initialize(name, description=nil, required=true, type=:string, default=nil, banner=nil)
8
+ def initialize(name, options={})
9
9
  class_name = self.class.name.split("::").last
10
10
 
11
+ type = options[:type]
12
+
11
13
  raise ArgumentError, "#{class_name} name can't be nil." if name.nil?
12
14
  raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s." if type && !valid_type?(type)
13
15
 
14
16
  @name = name.to_s
15
- @description = description
16
- @required = required || false
17
+ @description = options[:desc]
18
+ @required = options.key?(:required) ? options[:required] : true
17
19
  @type = (type || :string).to_sym
18
- @default = default
19
- @banner = banner || default_banner
20
+ @default = options[:default]
21
+ @banner = options[:banner] || default_banner
20
22
 
21
23
  validate! # Trigger specific validations
22
24
  end
@@ -4,12 +4,13 @@ class Thor
4
4
 
5
5
  VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]
6
6
 
7
- def initialize(name, description=nil, required=nil, type=nil, default=nil, banner=nil, lazy_default=nil, group=nil, aliases=nil, hide=nil)
8
- super(name, description, required, type, default, banner)
9
- @lazy_default = lazy_default
10
- @group = group.to_s.capitalize if group
11
- @aliases = [*aliases].compact
12
- @hide = hide
7
+ def initialize(name, options={})
8
+ options[:required] = false unless options.key?(:required)
9
+ super
10
+ @lazy_default = options[:lazy_default]
11
+ @group = options[:group].to_s.capitalize if options[:group]
12
+ @aliases = Array(options[:aliases])
13
+ @hide = options[:hide]
13
14
  end
14
15
 
15
16
  # This parse quick options given as method_options. It makes several
@@ -64,8 +65,7 @@ class Thor
64
65
  when Hash, Array, String
65
66
  value.class.name.downcase.to_sym
66
67
  end
67
-
68
- self.new(name.to_s, nil, required, type, default, nil, nil, nil, aliases)
68
+ self.new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
69
69
  end
70
70
 
71
71
  def switch_name
@@ -3,7 +3,8 @@ require 'tempfile'
3
3
  class Thor
4
4
  module Shell
5
5
  class Basic
6
- attr_accessor :base, :padding
6
+ attr_accessor :base
7
+ attr_reader :padding
7
8
 
8
9
  # Initialize base, mute and padding to nil.
9
10
  #
@@ -23,7 +24,7 @@ class Thor
23
24
  # Check if base is muted
24
25
  #
25
26
  def mute?
26
- @mute ||= false
27
+ @mute
27
28
  end
28
29
 
29
30
  # Sets the output padding, not allowing less than zero values.
@@ -113,13 +114,12 @@ class Thor
113
114
  colwidth = (array.map{|el| el.to_s.size}.max || 0) + 2
114
115
  array.each_with_index do |value, index|
115
116
  # Don't output trailing spaces when printing the last column
116
- if (((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?
117
+ if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
117
118
  stdout.puts value
118
119
  else
119
120
  stdout.printf("%-#{colwidth}s", value)
120
121
  end
121
122
  end
122
- stdout.puts
123
123
  end
124
124
 
125
125
  # Prints a table.
@@ -147,7 +147,7 @@ class Thor
147
147
  start.upto(colcount - 1) do |index|
148
148
  maxima = array.map {|row| row[index] ? row[index].to_s.size : 0 }.max
149
149
  maximas << maxima
150
- if index == colcount -1
150
+ if index == colcount - 1
151
151
  # Don't output 2 trailing spaces when printing the last column
152
152
  formats << "%-s"
153
153
  else
@@ -198,7 +198,7 @@ class Thor
198
198
  # If we don't #gsub the \ character, Dir.glob will fail.
199
199
  #
200
200
  def self.thor_root_glob
201
- files = Dir["#{thor_root}/*"]
201
+ files = Dir["#{escape_globs(thor_root)}/*"]
202
202
 
203
203
  files.map! do |file|
204
204
  File.directory?(file) ? File.join(file, "main.thor") : file
@@ -208,6 +208,7 @@ class Thor
208
208
  # Where to look for Thor files.
209
209
  #
210
210
  def self.globs_for(path)
211
+ path = escape_globs(path)
211
212
  ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
212
213
  end
213
214
 
@@ -244,5 +245,22 @@ class Thor
244
245
  end
245
246
  end
246
247
 
248
+ # Returns a string that has had any glob characters escaped.
249
+ # The glob characters are `* ? { } [ ]`.
250
+ #
251
+ # ==== Examples
252
+ #
253
+ # Thor::Util.escape_globs('[apps]') # => '\[apps\]'
254
+ #
255
+ # ==== Parameters
256
+ # String
257
+ #
258
+ # ==== Returns
259
+ # String
260
+ #
261
+ def self.escape_globs(path)
262
+ path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
263
+ end
264
+
247
265
  end
248
266
  end
@@ -1,3 +1,3 @@
1
1
  class Thor
2
- VERSION = "0.15.2"
2
+ VERSION = "0.15.3"
3
3
  end
@@ -121,6 +121,11 @@ describe Thor::Actions::Directory do
121
121
  end
122
122
  checked.should be_true
123
123
  end
124
+
125
+ it "works with glob characters in the path" do
126
+ content = invoke!("app{1}")
127
+ content.should =~ /create app\{1\}\/README/
128
+ end
124
129
  end
125
130
 
126
131
  describe "#revoke!" do
@@ -132,5 +137,13 @@ describe Thor::Actions::Directory do
132
137
  File.exists?(File.join(destination_root, "doc", "config.rb")).should be_false
133
138
  File.exists?(File.join(destination_root, "doc", "components")).should be_false
134
139
  end
140
+
141
+ it "works with glob characters in the path" do
142
+ invoke! "app{1}"
143
+ File.exists?(File.join(destination_root, "app{1}", "README")).should be_true
144
+
145
+ revoke! "app{1}"
146
+ File.exists?(File.join(destination_root, "app{1}", "README")).should be_false
147
+ end
135
148
  end
136
149
  end
@@ -0,0 +1,3 @@
1
+ __start__
2
+ README
3
+ __end__
@@ -3,8 +3,8 @@ require 'thor/parser'
3
3
 
4
4
  describe Thor::Argument do
5
5
 
6
- def argument(name, type=:string, default=nil, required=nil)
7
- @argument ||= Thor::Argument.new(name, nil, required || default.nil?, type, default)
6
+ def argument(name, options={})
7
+ @argument ||= Thor::Argument.new(name, options)
8
8
  end
9
9
 
10
10
  describe "errors" do
@@ -16,32 +16,32 @@ describe Thor::Argument do
16
16
 
17
17
  it "raises an error if type is unknown" do
18
18
  lambda {
19
- argument(:task, :unknown)
19
+ argument(:task, :type => :unknown)
20
20
  }.should raise_error(ArgumentError, "Type :unknown is not valid for arguments.")
21
21
  end
22
22
 
23
23
  it "raises an error if argument is required and have default values" do
24
24
  lambda {
25
- argument(:task, :string, "bar", true)
25
+ argument(:task, :type => :string, :default => "bar", :required => true)
26
26
  }.should raise_error(ArgumentError, "An argument cannot be required and have default value.")
27
27
  end
28
28
  end
29
29
 
30
30
  describe "#usage" do
31
31
  it "returns usage for string types" do
32
- argument(:foo, :string).usage.should == "FOO"
32
+ argument(:foo, :type => :string).usage.should == "FOO"
33
33
  end
34
34
 
35
35
  it "returns usage for numeric types" do
36
- argument(:foo, :numeric).usage.should == "N"
36
+ argument(:foo, :type => :numeric).usage.should == "N"
37
37
  end
38
38
 
39
39
  it "returns usage for array types" do
40
- argument(:foo, :array).usage.should == "one two three"
40
+ argument(:foo, :type => :array).usage.should == "one two three"
41
41
  end
42
42
 
43
43
  it "returns usage for hash types" do
44
- argument(:foo, :hash).usage.should == "key:value"
44
+ argument(:foo, :type => :hash).usage.should == "key:value"
45
45
  end
46
46
  end
47
47
  end
@@ -4,7 +4,8 @@ require 'thor/parser'
4
4
  describe Thor::Arguments do
5
5
  def create(opts={})
6
6
  arguments = opts.map do |type, default|
7
- Thor::Argument.new(type.to_s, nil, default.nil?, type, default)
7
+ options = {:required => default.nil?, :type => type, :default => default}
8
+ Thor::Argument.new(type.to_s, options)
8
9
  end
9
10
 
10
11
  arguments.sort!{ |a,b| b.name <=> a.name }
@@ -6,8 +6,8 @@ describe Thor::Option do
6
6
  Thor::Option.parse(key, value)
7
7
  end
8
8
 
9
- def option(name, *args)
10
- @option ||= Thor::Option.new(name, *args)
9
+ def option(name, options={})
10
+ @option ||= Thor::Option.new(name, options)
11
11
  end
12
12
 
13
13
  describe "#parse" do
@@ -130,14 +130,14 @@ describe Thor::Option do
130
130
  end
131
131
 
132
132
  it "can be required and have default values" do
133
- option = option("foo", nil, true, :string, "bar")
133
+ option = option("foo", :required => true, :type => :string, :default => "bar")
134
134
  option.default.should == "bar"
135
135
  option.should be_required
136
136
  end
137
137
 
138
138
  it "cannot be required and have type boolean" do
139
139
  lambda {
140
- option("foo", nil, true, :boolean)
140
+ option("foo", :required => true, :type => :boolean)
141
141
  }.should raise_error(ArgumentError, "An option cannot be boolean and required.")
142
142
  end
143
143
 
@@ -180,11 +180,11 @@ describe Thor::Option do
180
180
  end
181
181
 
182
182
  it "uses banner when supplied" do
183
- option(:foo, nil, false, :string, nil, "BAR").usage.should == "[--foo=BAR]"
183
+ option(:foo, :required => false, :type => :string, :banner => "BAR").usage.should == "[--foo=BAR]"
184
184
  end
185
185
 
186
186
  it "checkes when banner is an empty string" do
187
- option(:foo, nil, false, :string, nil, "").usage.should == "[--foo]"
187
+ option(:foo, :required => false, :type => :string, :banner => "").usage.should == "[--foo]"
188
188
  end
189
189
 
190
190
  describe "with required values" do
@@ -168,7 +168,8 @@ describe Thor::Options do
168
168
  end
169
169
 
170
170
  it "does not raises an error if the required option has a default value" do
171
- create :foo => Thor::Option.new("foo", nil, true, :string, "baz"), :bar => :boolean
171
+ options = {:required => true, :type => :string, :default => "baz"}
172
+ create :foo => Thor::Option.new("foo", options), :bar => :boolean
172
173
  lambda { parse("--bar") }.should_not raise_error
173
174
  end
174
175
  end
@@ -26,7 +26,8 @@ describe Thor::Task do
26
26
  end
27
27
 
28
28
  it "injects arguments into usage" do
29
- object = Struct.new(:namespace, :arguments).new("foo", [Thor::Argument.new(:bar, nil, true, :string)])
29
+ options = {:required => true, :type => :string}
30
+ object = Struct.new(:namespace, :arguments).new("foo", [Thor::Argument.new(:bar, options)])
30
31
  task(:foo => :required).formatted_usage(object).should == "foo:can_has BAR --foo=FOO"
31
32
  end
32
33
  end
@@ -382,6 +382,37 @@ HELP
382
382
  end
383
383
 
384
384
  klass.start(["unknown", "foo", "--bar", "baz", "bat", "--bam"]).should == ["foo", "--bar", "baz", "bat", "--bam"]
385
+ klass.start(["unknown", "--bar", "baz"]).should == ["--bar", "baz"]
386
+ end
387
+
388
+ it "does not pass through unknown options with strict args" do
389
+ klass = Class.new(Thor) do
390
+ strict_args_position!
391
+
392
+ desc "unknown", "passing unknown options"
393
+ def unknown(*args)
394
+ args
395
+ end
396
+ end
397
+
398
+ klass.start(["unknown", "--bar", "baz"]).should == []
399
+ klass.start(["unknown", "foo", "--bar", "baz"]).should == ["foo"]
400
+ end
401
+
402
+ it "strict args works in the inheritance chain" do
403
+ parent = Class.new(Thor) do
404
+ strict_args_position!
405
+ end
406
+
407
+ klass = Class.new(parent) do
408
+ desc "unknown", "passing unknown options"
409
+ def unknown(*args)
410
+ args
411
+ end
412
+ end
413
+
414
+ klass.start(["unknown", "--bar", "baz"]).should == []
415
+ klass.start(["unknown", "foo", "--bar", "baz"]).should == ["foo"]
385
416
  end
386
417
  end
387
418
  end
@@ -160,4 +160,37 @@ describe Thor::Util do
160
160
  Thor::Util.user_home.should == "/home/user/"
161
161
  end
162
162
  end
163
+
164
+ describe "#thor_root_glob" do
165
+ before do
166
+ ENV.stub!(:[])
167
+ Thor::Util.clear_user_home!
168
+ end
169
+
170
+ it "escapes globs in path" do
171
+ ENV.stub!(:[]).with("HOME").and_return("/home/user{1}/")
172
+ Dir.should_receive(:[]).with("/home/user\\{1\\}/.thor/*").and_return([])
173
+ Thor::Util.thor_root_glob.should == []
174
+ end
175
+ end
176
+
177
+ describe "#globs_for" do
178
+ it "escapes globs in path" do
179
+ Thor::Util.globs_for("/home/apps{1}").should == [
180
+ "/home/apps\\{1\\}/Thorfile",
181
+ "/home/apps\\{1\\}/*.thor",
182
+ "/home/apps\\{1\\}/tasks/*.thor",
183
+ "/home/apps\\{1\\}/lib/tasks/*.thor"
184
+ ]
185
+ end
186
+ end
187
+
188
+ describe "#escape_globs" do
189
+ it "escapes ? * { } [ ] glob characters" do
190
+ Thor::Util.escape_globs("apps?").should == "apps\\?"
191
+ Thor::Util.escape_globs("apps*").should == "apps\\*"
192
+ Thor::Util.escape_globs("apps {1}").should == "apps \\{1\\}"
193
+ Thor::Util.escape_globs("apps [1]").should == "apps \\[1\\]"
194
+ end
195
+ end
163
196
  end
metadata CHANGED
@@ -1,141 +1,141 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: thor
3
- version: !ruby/object:Gem::Version
4
- version: 0.15.2
3
+ version: !ruby/object:Gem::Version
4
+ hash: 37
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 15
9
+ - 3
10
+ version: 0.15.3
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Yehuda Katz
9
- - José Valim
14
+ - "Jos\xC3\xA9 Valim"
10
15
  autorequire:
11
16
  bindir: bin
12
17
  cert_chain: []
13
- date: 2012-05-07 00:00:00.000000000 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
18
+
19
+ date: 2012-06-18 00:00:00 +02:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
16
23
  name: bundler
17
- requirement: !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ~>
21
- - !ruby/object:Gem::Version
22
- version: '1.0'
23
- type: :development
24
24
  prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
26
  none: false
27
- requirements:
27
+ requirements:
28
28
  - - ~>
29
- - !ruby/object:Gem::Version
30
- version: '1.0'
31
- - !ruby/object:Gem::Dependency
32
- name: fakeweb
33
- requirement: !ruby/object:Gem::Requirement
34
- none: false
35
- requirements:
36
- - - ~>
37
- - !ruby/object:Gem::Version
38
- version: '1.3'
29
+ - !ruby/object:Gem::Version
30
+ hash: 15
31
+ segments:
32
+ - 1
33
+ - 0
34
+ version: "1.0"
39
35
  type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: fakeweb
40
39
  prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
40
+ requirement: &id002 !ruby/object:Gem::Requirement
42
41
  none: false
43
- requirements:
42
+ requirements:
44
43
  - - ~>
45
- - !ruby/object:Gem::Version
46
- version: '1.3'
47
- - !ruby/object:Gem::Dependency
48
- name: rake
49
- requirement: !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '0.9'
44
+ - !ruby/object:Gem::Version
45
+ hash: 9
46
+ segments:
47
+ - 1
48
+ - 3
49
+ version: "1.3"
55
50
  type: :development
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: rake
56
54
  prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ~>
61
- - !ruby/object:Gem::Version
62
- version: '0.9'
63
- - !ruby/object:Gem::Dependency
64
- name: rdoc
65
- requirement: !ruby/object:Gem::Requirement
55
+ requirement: &id003 !ruby/object:Gem::Requirement
66
56
  none: false
67
- requirements:
57
+ requirements:
68
58
  - - ~>
69
- - !ruby/object:Gem::Version
70
- version: '3.9'
59
+ - !ruby/object:Gem::Version
60
+ hash: 25
61
+ segments:
62
+ - 0
63
+ - 9
64
+ version: "0.9"
71
65
  type: :development
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: rdoc
72
69
  prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
76
- - - ~>
77
- - !ruby/object:Gem::Version
78
- version: '3.9'
79
- - !ruby/object:Gem::Dependency
80
- name: rspec
81
- requirement: !ruby/object:Gem::Requirement
70
+ requirement: &id004 !ruby/object:Gem::Requirement
82
71
  none: false
83
- requirements:
72
+ requirements:
84
73
  - - ~>
85
- - !ruby/object:Gem::Version
86
- version: '2.3'
74
+ - !ruby/object:Gem::Version
75
+ hash: 21
76
+ segments:
77
+ - 3
78
+ - 9
79
+ version: "3.9"
87
80
  type: :development
81
+ version_requirements: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec
88
84
  prerelease: false
89
- version_requirements: !ruby/object:Gem::Requirement
85
+ requirement: &id005 !ruby/object:Gem::Requirement
90
86
  none: false
91
- requirements:
87
+ requirements:
92
88
  - - ~>
93
- - !ruby/object:Gem::Version
94
- version: '2.3'
95
- - !ruby/object:Gem::Dependency
96
- name: simplecov
97
- requirement: !ruby/object:Gem::Requirement
98
- none: false
99
- requirements:
100
- - - ~>
101
- - !ruby/object:Gem::Version
102
- version: '0.4'
89
+ - !ruby/object:Gem::Version
90
+ hash: 5
91
+ segments:
92
+ - 2
93
+ - 3
94
+ version: "2.3"
103
95
  type: :development
96
+ version_requirements: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
104
99
  prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
100
+ requirement: &id006 !ruby/object:Gem::Requirement
106
101
  none: false
107
- requirements:
102
+ requirements:
108
103
  - - ~>
109
- - !ruby/object:Gem::Version
110
- version: '0.4'
111
- - !ruby/object:Gem::Dependency
112
- name: childlabor
113
- requirement: !ruby/object:Gem::Requirement
114
- none: false
115
- requirements:
116
- - - ! '>='
117
- - !ruby/object:Gem::Version
118
- version: '0'
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ - 4
109
+ version: "0.4"
119
110
  type: :development
111
+ version_requirements: *id006
112
+ - !ruby/object:Gem::Dependency
113
+ name: childlabor
120
114
  prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
115
+ requirement: &id007 !ruby/object:Gem::Requirement
122
116
  none: false
123
- requirements:
124
- - - ! '>='
125
- - !ruby/object:Gem::Version
126
- version: '0'
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ type: :development
125
+ version_requirements: *id007
127
126
  description: A scripting framework that replaces rake, sake and rubigen
128
127
  email: ruby-thor@googlegroups.com
129
- executables:
128
+ executables:
130
129
  - rake2thor
131
130
  - thor
132
131
  extensions: []
133
- extra_rdoc_files:
132
+
133
+ extra_rdoc_files:
134
134
  - CHANGELOG.rdoc
135
135
  - LICENSE.md
136
136
  - README.md
137
137
  - Thorfile
138
- files:
138
+ files:
139
139
  - .autotest
140
140
  - .document
141
141
  - .gemtest
@@ -158,6 +158,7 @@ files:
158
158
  - lib/thor/actions/file_manipulation.rb
159
159
  - lib/thor/actions/inject_into_file.rb
160
160
  - lib/thor/base.rb
161
+ - lib/thor/core_ext/dir_escape.rb
161
162
  - lib/thor/core_ext/file_binary_read.rb
162
163
  - lib/thor/core_ext/hash_with_indifferent_access.rb
163
164
  - lib/thor/core_ext/ordered_hash.rb
@@ -190,6 +191,7 @@ files:
190
191
  - spec/core_ext/ordered_hash_spec.rb
191
192
  - spec/exit_condition_spec.rb
192
193
  - spec/fixtures/application.rb
194
+ - spec/fixtures/app{1}/README
193
195
  - spec/fixtures/bundle/execute.rb
194
196
  - spec/fixtures/bundle/main.thor
195
197
  - spec/fixtures/doc/%file_name%.rb.tt
@@ -222,32 +224,43 @@ files:
222
224
  - spec/thor_spec.rb
223
225
  - spec/util_spec.rb
224
226
  - thor.gemspec
227
+ has_rdoc: true
225
228
  homepage: http://github.com/wycats/thor
226
229
  licenses: []
230
+
227
231
  post_install_message:
228
- rdoc_options:
232
+ rdoc_options:
229
233
  - --charset=UTF-8
230
- require_paths:
234
+ require_paths:
231
235
  - lib
232
- required_ruby_version: !ruby/object:Gem::Requirement
236
+ required_ruby_version: !ruby/object:Gem::Requirement
233
237
  none: false
234
- requirements:
235
- - - ! '>='
236
- - !ruby/object:Gem::Version
237
- version: '0'
238
- required_rubygems_version: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ hash: 3
242
+ segments:
243
+ - 0
244
+ version: "0"
245
+ required_rubygems_version: !ruby/object:Gem::Requirement
239
246
  none: false
240
- requirements:
241
- - - ! '>='
242
- - !ruby/object:Gem::Version
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ hash: 23
251
+ segments:
252
+ - 1
253
+ - 3
254
+ - 6
243
255
  version: 1.3.6
244
256
  requirements: []
257
+
245
258
  rubyforge_project:
246
- rubygems_version: 1.8.24
259
+ rubygems_version: 1.5.3
247
260
  signing_key:
248
261
  specification_version: 3
249
262
  summary: A scripting framework that replaces rake, sake and rubigen
250
- test_files:
263
+ test_files:
251
264
  - spec/actions/create_file_spec.rb
252
265
  - spec/actions/create_link_spec.rb
253
266
  - spec/actions/directory_spec.rb
@@ -260,6 +273,7 @@ test_files:
260
273
  - spec/core_ext/ordered_hash_spec.rb
261
274
  - spec/exit_condition_spec.rb
262
275
  - spec/fixtures/application.rb
276
+ - spec/fixtures/app{1}/README
263
277
  - spec/fixtures/bundle/execute.rb
264
278
  - spec/fixtures/bundle/main.thor
265
279
  - spec/fixtures/doc/%file_name%.rb.tt
@@ -291,4 +305,3 @@ test_files:
291
305
  - spec/task_spec.rb
292
306
  - spec/thor_spec.rb
293
307
  - spec/util_spec.rb
294
- has_rdoc: