thor 0.11.5 → 0.11.6

Sign up to get free protection for your applications and to get access to all the features.
data/Thorfile CHANGED
@@ -34,7 +34,6 @@ class Default < Thor
34
34
  require 'jeweler'
35
35
  Jeweler::Tasks.new do |s|
36
36
  s.name = GEM_NAME
37
- s.version = "0.11.4"
38
37
  s.rubyforge_project = "textmate"
39
38
  s.platform = Gem::Platform::RUBY
40
39
  s.summary = "A scripting framework that replaces rake, sake and rubigen"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.11.5
1
+ 0.11.6
@@ -135,7 +135,7 @@ class Thor
135
135
  args, opts = given_args, {}
136
136
  end
137
137
 
138
- task ||= Task.dynamic(meth)
138
+ task ||= Thor::Task::Dynamic.new(meth)
139
139
  trailing = args[Range.new(arguments.size, -1)]
140
140
  new(args, opts, config).invoke(task, trailing || [])
141
141
  end
@@ -8,23 +8,8 @@ class Thor
8
8
  module Actions
9
9
  attr_accessor :behavior
10
10
 
11
- # On inclusion, add some options to base.
12
- #
13
11
  def self.included(base) #:nodoc:
14
12
  base.extend ClassMethods
15
- return unless base.respond_to?(:class_option)
16
-
17
- base.class_option :pretend, :type => :boolean, :aliases => "-p", :group => :runtime,
18
- :desc => "Run but do not make any changes"
19
-
20
- base.class_option :force, :type => :boolean, :aliases => "-f", :group => :runtime,
21
- :desc => "Overwrite files that already exist"
22
-
23
- base.class_option :skip, :type => :boolean, :aliases => "-s", :group => :runtime,
24
- :desc => "Skip files that already exist"
25
-
26
- base.class_option :quiet, :type => :boolean, :aliases => "-q", :group => :runtime,
27
- :desc => "Supress status output"
28
13
  end
29
14
 
30
15
  module ClassMethods
@@ -49,6 +34,22 @@ class Thor
49
34
  paths += from_superclass(:source_paths, [])
50
35
  paths
51
36
  end
37
+
38
+ # Add runtime options that help actions execution.
39
+ #
40
+ def add_runtime_options!
41
+ class_option :pretend, :type => :boolean, :aliases => "-p", :group => :runtime,
42
+ :desc => "Run but do not make any changes"
43
+
44
+ class_option :force, :type => :boolean, :aliases => "-f", :group => :runtime,
45
+ :desc => "Overwrite files that already exist"
46
+
47
+ class_option :skip, :type => :boolean, :aliases => "-s", :group => :runtime,
48
+ :desc => "Skip files that already exist"
49
+
50
+ class_option :quiet, :type => :boolean, :aliases => "-q", :group => :runtime,
51
+ :desc => "Supress status output"
52
+ end
52
53
  end
53
54
 
54
55
  # Extends initializer to add more configuration options.
@@ -100,7 +100,7 @@ class Thor
100
100
  FileUtils.chmod_R(mode, path) unless options[:pretend]
101
101
  end
102
102
 
103
- # Prepend text to a file.
103
+ # Prepend text to a file. Since it depends on inject_into_file, it's reversible.
104
104
  #
105
105
  # ==== Parameters
106
106
  # path<String>:: path of the file to be changed
@@ -111,19 +111,17 @@ class Thor
111
111
  #
112
112
  # prepend_file 'config/environments/test.rb', 'config.gem "rspec"'
113
113
  #
114
- def prepend_file(path, data=nil, config={}, &block)
115
- return unless behavior == :invoke
116
- path = File.expand_path(path, destination_root)
117
- say_status :prepend, relative_to_original_destination_root(path), config.fetch(:verbose, true)
118
-
119
- unless options[:pretend]
120
- content = data || block.call
121
- content << File.read(path)
122
- File.open(path, 'wb') { |file| file.write(content) }
123
- end
114
+ # prepend_file 'config/environments/test.rb' do
115
+ # 'config.gem "rspec"'
116
+ # end
117
+ #
118
+ def prepend_file(path, *args, &block)
119
+ config = args.last.is_a?(Hash) ? args.pop : {}
120
+ config.merge!(:after => /\A/)
121
+ inject_into_file(path, *(args << config), &block)
124
122
  end
125
123
 
126
- # Append text to a file.
124
+ # Append text to a file. Since it depends on inject_into_file, it's reversible.
127
125
  #
128
126
  # ==== Parameters
129
127
  # path<String>:: path of the file to be changed
@@ -134,11 +132,37 @@ class Thor
134
132
  #
135
133
  # append_file 'config/environments/test.rb', 'config.gem "rspec"'
136
134
  #
137
- def append_file(path, data=nil, config={}, &block)
138
- return unless behavior == :invoke
139
- path = File.expand_path(path, destination_root)
140
- say_status :append, relative_to_original_destination_root(path), config.fetch(:verbose, true)
141
- File.open(path, 'ab') { |file| file.write(data || block.call) } unless options[:pretend]
135
+ # append_file 'config/environments/test.rb' do
136
+ # 'config.gem "rspec"'
137
+ # end
138
+ #
139
+ def append_file(path, *args, &block)
140
+ config = args.last.is_a?(Hash) ? args.pop : {}
141
+ config.merge!(:before => /\z/)
142
+ inject_into_file(path, *(args << config), &block)
143
+ end
144
+
145
+ # Injects text right after the class definition. Since it depends on
146
+ # inject_into_file, it's reversible.
147
+ #
148
+ # ==== Parameters
149
+ # path<String>:: path of the file to be changed
150
+ # klass<String|Class>:: the class to be manipulated
151
+ # data<String>:: the data to append to the class, can be also given as a block.
152
+ # config<Hash>:: give :verbose => false to not log the status.
153
+ #
154
+ # ==== Examples
155
+ #
156
+ # inject_into_class "app/controllers/application_controller.rb", " filter_parameter :password\n"
157
+ #
158
+ # inject_into_class "app/controllers/application_controller.rb", ApplicationController do
159
+ # " filter_parameter :password\n"
160
+ # end
161
+ #
162
+ def inject_into_class(path, klass, *args, &block)
163
+ config = args.last.is_a?(Hash) ? args.pop : {}
164
+ config.merge!(:after => /class #{klass}\n|class #{klass} .*\n/)
165
+ inject_into_file(path, *(args << config), &block)
142
166
  end
143
167
 
144
168
  # Run a regular expression replacement on a file.
@@ -3,10 +3,8 @@ require 'thor/actions/empty_directory'
3
3
  class Thor
4
4
  module Actions
5
5
 
6
- # Injects the given content into a file. Different from append_file,
7
- # prepend_file and gsub_file, this method is reversible. By this reason,
8
- # the flag can only be strings. gsub_file is your friend if you need to
9
- # deal with more complex cases.
6
+ # Injects the given content into a file. Different from gsub_file, this
7
+ # method is reversible.
10
8
  #
11
9
  # ==== Parameters
12
10
  # destination<String>:: Relative path to the destination root
@@ -16,11 +14,11 @@ class Thor
16
14
  #
17
15
  # ==== Examples
18
16
  #
19
- # inject_into_file "config/environment.rb", "config.gem thor", :after => "Rails::Initializer.run do |config|\n"
17
+ # inject_into_file "config/environment.rb", "config.gem :thor", :after => "Rails::Initializer.run do |config|\n"
20
18
  #
21
19
  # inject_into_file "config/environment.rb", :after => "Rails::Initializer.run do |config|\n" do
22
20
  # gems = ask "Which gems would you like to add?"
23
- # gems.split(" ").map{ |gem| " config.gem #{gem}" }.join("\n")
21
+ # gems.split(" ").map{ |gem| " config.gem :#{gem}" }.join("\n")
24
22
  # end
25
23
  #
26
24
  def inject_into_file(destination, *args, &block)
@@ -29,40 +27,65 @@ class Thor
29
27
  else
30
28
  data, config = args.shift, args.shift
31
29
  end
32
-
33
- log_status = args.empty? || args.pop
34
30
  action InjectIntoFile.new(self, destination, data, config)
35
31
  end
36
32
 
37
33
  class InjectIntoFile < EmptyDirectory #:nodoc:
38
- attr_reader :flag, :replacement
34
+ attr_reader :replacement, :flag, :behavior
39
35
 
40
36
  def initialize(base, destination, data, config)
41
37
  super(base, destination, { :verbose => true }.merge(config))
42
38
 
43
- data = data.call if data.is_a?(Proc)
44
-
45
- @replacement = if @config.key?(:after)
46
- @flag = @config.delete(:after)
47
- @flag + data
39
+ @behavior, @flag = if @config.key?(:after)
40
+ [:after, @config.delete(:after)]
48
41
  else
49
- @flag = @config.delete(:before)
50
- data + @flag
42
+ [:before, @config.delete(:before)]
51
43
  end
44
+
45
+ @replacement = data.is_a?(Proc) ? data.call : data
46
+ @flag = Regexp.escape(@flag) unless @flag.is_a?(Regexp)
52
47
  end
53
48
 
54
49
  def invoke!
55
- say_status :inject, config[:verbose]
56
- replace!(flag, replacement)
50
+ say_status :invoke
51
+
52
+ content = if @behavior == :after
53
+ '\0' + replacement
54
+ else
55
+ replacement + '\0'
56
+ end
57
+
58
+ replace!(/#{flag}/, content)
57
59
  end
58
60
 
59
61
  def revoke!
60
- say_status :deinject, config[:verbose]
61
- replace!(replacement, flag)
62
+ say_status :revoke
63
+
64
+ regexp = if @behavior == :after
65
+ content = '\1\2'
66
+ /(#{flag})(.*)(#{Regexp.escape(replacement)})/m
67
+ else
68
+ content = '\2\3'
69
+ /(#{Regexp.escape(replacement)})(.*)(#{flag})/m
70
+ end
71
+
72
+ replace!(regexp, content)
62
73
  end
63
74
 
64
75
  protected
65
76
 
77
+ def say_status(behavior)
78
+ status = if flag == /\A/
79
+ behavior == :invoke ? :prepend : :unprepend
80
+ elsif flag == /\z/
81
+ behavior == :invoke ? :append : :unappend
82
+ else
83
+ behavior == :invoke ? :inject : :deinject
84
+ end
85
+
86
+ super(status, config[:verbose])
87
+ end
88
+
66
89
  # Adds the content to the file.
67
90
  #
68
91
  def replace!(regexp, string)
@@ -355,6 +355,7 @@ class Thor
355
355
  else
356
356
  config[:shell].error e.message
357
357
  end
358
+ exit(1) if exit_on_failure?
358
359
  end
359
360
 
360
361
  protected
@@ -491,6 +492,12 @@ class Thor
491
492
  end
492
493
  end
493
494
 
495
+ # A flag that makes the process exit with status 1 if any error happens.
496
+ #
497
+ def exit_on_failure?
498
+ false
499
+ end
500
+
494
501
  # SIGNATURE: Sets the baseclass. This is where the superclass lookup
495
502
  # finishes.
496
503
  def baseclass #:nodoc:
@@ -153,7 +153,7 @@ class Thor
153
153
  raise "Expected Thor class, got #{klass}" unless klass <= Thor::Base
154
154
 
155
155
  task ||= klass.default_task if klass <= Thor
156
- task = klass.all_tasks[task.to_s] || Task.dynamic(task) if task && !task.is_a?(Thor::Task)
156
+ task = klass.all_tasks[task.to_s] || Thor::Task::Dynamic.new(task) if task && !task.is_a?(Thor::Task)
157
157
  task
158
158
  end
159
159
 
@@ -175,6 +175,10 @@ class Thor::Runner < Thor #:nodoc:
175
175
  File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
176
176
  end
177
177
 
178
+ def self.exit_on_failure?
179
+ true
180
+ end
181
+
178
182
  # Load the thorfiles. If relevant_to is supplied, looks for specific files
179
183
  # in the thor_root instead of loading them all.
180
184
  #
@@ -34,12 +34,11 @@ class Thor
34
34
  # ==== Example
35
35
  # say("I know you knew that.")
36
36
  #
37
- def say(message="", color=nil, force_new_line=false)
37
+ def say(message="", color=nil, force_new_line=(message.to_s !~ /( |\t)$/))
38
38
  message = message.to_s
39
- new_line = force_new_line || !(message[-1, 1] == " " || message[-1, 1] == "\t")
40
39
  message = set_color(message, color) if color
41
40
 
42
- if new_line
41
+ if force_new_line
43
42
  $stdout.puts(message)
44
43
  else
45
44
  $stdout.print(message)
@@ -1,11 +1,19 @@
1
1
  class Thor
2
2
  class Task < Struct.new(:name, :description, :usage, :options)
3
3
 
4
- # Creates a dynamic task. Dynamic tasks are created on demand to allow method
5
- # missing calls (since a method missing does not have a task object for it).
4
+ # A dynamic task that handles method missing scenarios.
6
5
  #
7
- def self.dynamic(name)
8
- new(name, "A dynamically-generated task", name.to_s)
6
+ class Dynamic < Task
7
+ def initialize(name)
8
+ super(name.to_s, "A dynamically-generated task", name.to_s)
9
+ end
10
+
11
+ def run(instance, args=[])
12
+ unless (instance.methods & [name.to_s, name.to_sym]).empty?
13
+ raise Error, "could not find Thor class or task '#{name}'"
14
+ end
15
+ super
16
+ end
9
17
  end
10
18
 
11
19
  def initialize(name, description, usage, options=nil)
@@ -37,8 +45,6 @@ class Thor
37
45
  # injected in the usage.
38
46
  #
39
47
  def formatted_usage(klass=nil, namespace=false, show_options=true)
40
- formatted = ''
41
-
42
48
  formatted = if namespace.is_a?(String)
43
49
  "#{namespace}:"
44
50
  elsif klass && namespace
@@ -77,7 +83,7 @@ class Thor
77
83
  #
78
84
  def public_method?(instance) #:nodoc:
79
85
  collection = instance.private_methods + instance.protected_methods
80
- !(collection).include?(name.to_s) && !(collection).include?(name.to_sym) # For Ruby 1.9
86
+ (collection & [name.to_s, name.to_sym]).empty?
81
87
  end
82
88
 
83
89
  # Clean everything that comes from the Thor gempath and remove the caller.
@@ -137,17 +137,18 @@ class Thor
137
137
  # inherit from Thor or Thor::Group.
138
138
  #
139
139
  def self.namespace_to_thor_class_and_task(namespace, raise_if_nil=true)
140
- klass, task_name = Thor::Util.find_by_namespace(namespace), nil
140
+ if namespace.include?(?:)
141
+ pieces = namespace.split(":")
142
+ task = pieces.pop
143
+ klass = Thor::Util.find_by_namespace(pieces.join(":"))
144
+ end
141
145
 
142
- if klass.nil? && namespace.include?(?:)
143
- namespace = namespace.split(":")
144
- task_name = namespace.pop
145
- klass = Thor::Util.find_by_namespace(namespace.join(":"))
146
+ unless klass
147
+ klass, task = Thor::Util.find_by_namespace(namespace), nil
146
148
  end
147
149
 
148
150
  raise Error, "could not find Thor class or task '#{namespace}'" if raise_if_nil && klass.nil?
149
-
150
- return klass, task_name
151
+ return klass, task
151
152
  end
152
153
 
153
154
  # Receives a path and load the thor file in the path. The file is evaluated
@@ -1,5 +1,7 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
+ class Application; end
4
+
3
5
  describe Thor::Actions do
4
6
  def runner(options={})
5
7
  @runner ||= MyCounter.new([1], options, { :destination_root => destination_root })
@@ -193,12 +195,6 @@ describe Thor::Actions do
193
195
  File.open(file).read.must == "__start__\nREADME\n__end__\nEND\n"
194
196
  end
195
197
 
196
- it "does not append if pretending" do
197
- runner(:pretend => true)
198
- action :append_file, "doc/README", "END\n"
199
- File.open(file).read.must == "__start__\nREADME\n__end__\n"
200
- end
201
-
202
198
  it "accepts a block" do
203
199
  action(:append_file, "doc/README"){ "END\n" }
204
200
  File.open(file).read.must == "__start__\nREADME\n__end__\nEND\n"
@@ -207,10 +203,6 @@ describe Thor::Actions do
207
203
  it "logs status" do
208
204
  action(:append_file, "doc/README", "END").must == " append doc/README\n"
209
205
  end
210
-
211
- it "does not log status if required" do
212
- action(:append_file, "doc/README", nil, :verbose => false){ "END" }.must be_empty
213
- end
214
206
  end
215
207
 
216
208
  describe "#prepend_file" do
@@ -219,12 +211,6 @@ describe Thor::Actions do
219
211
  File.open(file).read.must == "START\n__start__\nREADME\n__end__\n"
220
212
  end
221
213
 
222
- it "does not prepend if pretending" do
223
- runner(:pretend => true)
224
- action :prepend_file, "doc/README", "START\n"
225
- File.open(file).read.must == "__start__\nREADME\n__end__\n"
226
- end
227
-
228
214
  it "accepts a block" do
229
215
  action(:prepend_file, "doc/README"){ "START\n" }
230
216
  File.open(file).read.must == "START\n__start__\nREADME\n__end__\n"
@@ -233,9 +219,30 @@ describe Thor::Actions do
233
219
  it "logs status" do
234
220
  action(:prepend_file, "doc/README", "START").must == " prepend doc/README\n"
235
221
  end
222
+ end
236
223
 
237
- it "does not log status if required" do
238
- action(:prepend_file, "doc/README", "START", :verbose => false).must be_empty
224
+ describe "#inject_into_class" do
225
+ def file
226
+ File.join(destination_root, "application.rb")
227
+ end
228
+
229
+ it "appends content to a class" do
230
+ action :inject_into_class, "application.rb", Application, " filter_parameters :password\n"
231
+ File.open(file).read.must == "class Application < Base\n filter_parameters :password\nend\n"
232
+ end
233
+
234
+ it "accepts a block" do
235
+ action(:inject_into_class, "application.rb", Application){ " filter_parameters :password\n" }
236
+ File.open(file).read.must == "class Application < Base\n filter_parameters :password\nend\n"
237
+ end
238
+
239
+ it "logs status" do
240
+ action(:inject_into_class, "application.rb", Application, " filter_parameters :password\n").must == " inject application.rb\n"
241
+ end
242
+
243
+ it "does not append if class name does not match" do
244
+ action :inject_into_class, "application.rb", "App", " filter_parameters :password\n"
245
+ File.open(file).read.must == "class Application < Base\nend\n"
239
246
  end
240
247
  end
241
248
  end
@@ -61,17 +61,43 @@ describe Thor::Actions::InjectIntoFile do
61
61
  it "deinjects the destination file after injection" do
62
62
  invoke! "doc/README", "\nmore content", :after => "__start__"
63
63
  revoke! "doc/README", "\nmore content", :after => "__start__"
64
-
65
64
  File.read(file).must == "__start__\nREADME\n__end__\n"
66
65
  end
67
66
 
68
67
  it "deinjects the destination file before injection" do
69
- invoke! "doc/README", "\nmore content", :before => "__start__"
70
- revoke! "doc/README", "\nmore content", :before => "__start__"
71
-
68
+ invoke! "doc/README", "more content\n", :before => "__start__"
69
+ revoke! "doc/README", "more content\n", :before => "__start__"
72
70
  File.read(file).must == "__start__\nREADME\n__end__\n"
73
71
  end
74
72
 
73
+ it "deinjects even with double after injection" do
74
+ invoke! "doc/README", "\nmore content", :after => "__start__"
75
+ invoke! "doc/README", "\nanother stuff", :after => "__start__"
76
+ revoke! "doc/README", "\nmore content", :after => "__start__"
77
+ File.read(file).must == "__start__\nanother stuff\nREADME\n__end__\n"
78
+ end
79
+
80
+ it "deinjects even with double before injection" do
81
+ invoke! "doc/README", "more content\n", :before => "__start__"
82
+ invoke! "doc/README", "another stuff\n", :before => "__start__"
83
+ revoke! "doc/README", "more content\n", :before => "__start__"
84
+ File.read(file).must == "another stuff\n__start__\nREADME\n__end__\n"
85
+ end
86
+
87
+ it "deinjects when prepending" do
88
+ invoke! "doc/README", "more content\n", :after => /\A/
89
+ invoke! "doc/README", "another stuff\n", :after => /\A/
90
+ revoke! "doc/README", "more content\n", :after => /\A/
91
+ File.read(file).must == "another stuff\n__start__\nREADME\n__end__\n"
92
+ end
93
+
94
+ it "deinjects when appending" do
95
+ invoke! "doc/README", "more content\n", :before => /\z/
96
+ invoke! "doc/README", "another stuff\n", :before => /\z/
97
+ revoke! "doc/README", "more content\n", :before => /\z/
98
+ File.read(file).must == "__start__\nREADME\n__end__\nanother stuff\n"
99
+ end
100
+
75
101
  it "shows progress information to the user" do
76
102
  invoke!("doc/README", "\nmore content", :after => "__start__")
77
103
  revoke!("doc/README", "\nmore content", :after => "__start__").must == " deinject doc/README\n"
@@ -0,0 +1,2 @@
1
+ class Application < Base
2
+ end
@@ -30,6 +30,7 @@ describe Thor::Runner do
30
30
  end
31
31
 
32
32
  it "raises error if a class/task cannot be found" do
33
+ mock(Thor::Runner).exit(1)
33
34
  content = capture(:stderr){ Thor::Runner.start(["help", "unknown"]) }
34
35
  content.must =~ /could not find Thor class or task 'unknown'/
35
36
  end
@@ -67,6 +68,7 @@ describe Thor::Runner do
67
68
  end
68
69
 
69
70
  it "raises an error if class/task can't be found" do
71
+ mock(Thor::Runner).exit(1)
70
72
  ARGV.replace ["unknown"]
71
73
  capture(:stderr){ Thor::Runner.start }.must =~ /could not find Thor class or task 'unknown'/
72
74
  end
@@ -180,10 +182,8 @@ describe Thor::Runner do
180
182
 
181
183
  it "displays the modules installed in a pretty way" do
182
184
  stdout = capture(:stdout) { Thor::Runner.start(["installed"]) }
183
-
184
185
  stdout.must =~ /random\s*amazing/
185
186
  stdout.must =~ /amazing:describe NAME \[\-\-forcefully\]\s+# say that someone is amazing/m
186
- stdout.must =~ /amazing:hello\s+# say hello/m
187
187
  end
188
188
  end
189
189
 
@@ -57,6 +57,11 @@ describe Thor::Shell::Basic do
57
57
  mock($stdout).print("Running... ")
58
58
  shell.say("Running... ")
59
59
  end
60
+
61
+ it "prints a message to the user without new line" do
62
+ mock($stdout).print("Running...")
63
+ shell.say("Running...", nil, false)
64
+ end
60
65
  end
61
66
 
62
67
  describe "#say_status" do
@@ -41,10 +41,16 @@ describe Thor::Task do
41
41
 
42
42
  describe "#dynamic" do
43
43
  it "creates a dynamic task with the given name" do
44
- Thor::Task.dynamic('task').name.must == 'task'
45
- Thor::Task.dynamic('task').description.must == 'A dynamically-generated task'
46
- Thor::Task.dynamic('task').usage.must == 'task'
47
- Thor::Task.dynamic('task').options.must == {}
44
+ Thor::Task::Dynamic.new('task').name.must == 'task'
45
+ Thor::Task::Dynamic.new('task').description.must == 'A dynamically-generated task'
46
+ Thor::Task::Dynamic.new('task').usage.must == 'task'
47
+ Thor::Task::Dynamic.new('task').options.must == {}
48
+ end
49
+
50
+ it "does not invoke an existing method" do
51
+ lambda {
52
+ Thor::Task::Dynamic.new('to_s').run([])
53
+ }.must raise_error(Thor::Error, "could not find Thor class or task 'to_s'")
48
54
  end
49
55
  end
50
56
 
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.11.5
4
+ version: 0.11.6
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: 2009-08-05 00:00:00 +02:00
13
+ date: 2009-09-09 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  requirements: []
85
85
 
86
86
  rubyforge_project: textmate
87
- rubygems_version: 1.3.2
87
+ rubygems_version: 1.3.5
88
88
  signing_key:
89
89
  specification_version: 3
90
90
  summary: A scripting framework that replaces rake, sake and rubigen
@@ -105,6 +105,7 @@ test_files:
105
105
  - spec/shell/color_spec.rb
106
106
  - spec/group_spec.rb
107
107
  - spec/thor_spec.rb
108
+ - spec/fixtures/application.rb
108
109
  - spec/fixtures/doc/config.rb
109
110
  - spec/fixtures/bundle/execute.rb
110
111
  - spec/util_spec.rb