thor 0.9.8 → 0.9.9

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/lib/thor/runner.rb CHANGED
@@ -18,8 +18,17 @@ class Thor::Runner < Thor
18
18
  method_options :as => :optional, :relative => :boolean
19
19
  def install(name)
20
20
  initialize_thorfiles
21
+
22
+ base = name
23
+ package = :file
24
+
21
25
  begin
22
- contents = open(name).read
26
+ if File.directory?(File.expand_path(name))
27
+ base, package = File.join(name, "main.thor"), :directory
28
+ contents = open(base).read
29
+ else
30
+ contents = open(name).read
31
+ end
23
32
  rescue OpenURI::HTTPError
24
33
  raise Error, "Error opening URI `#{name}'"
25
34
  rescue Errno::ENOENT
@@ -35,9 +44,7 @@ class Thor::Runner < Thor
35
44
 
36
45
  return false unless response =~ /^\s*y/i
37
46
 
38
- constants = Thor::Util.constants_in_contents(contents)
39
-
40
- # name = name =~ /\.thor$/ || is_uri ? name : "#{name}.thor"
47
+ constants = Thor::Util.constants_in_contents(contents, base)
41
48
 
42
49
  as = options["as"] || begin
43
50
  first_line = contents.split("\n")[0]
@@ -63,8 +70,12 @@ class Thor::Runner < Thor
63
70
 
64
71
  puts "Storing thor file in your system repository"
65
72
 
66
- File.open(File.join(thor_root, yaml[as][:filename]), "w") do |file|
67
- file.puts contents
73
+ destination = File.join(thor_root, yaml[as][:filename])
74
+
75
+ if package == :file
76
+ File.open(destination, "w") {|f| f.puts contents }
77
+ else
78
+ FileUtils.cp_r(name, destination)
68
79
  end
69
80
 
70
81
  yaml[as][:filename] # Indicate sucess
@@ -78,7 +89,7 @@ class Thor::Runner < Thor
78
89
  puts "Uninstalling #{name}."
79
90
 
80
91
  file = File.join(thor_root, "#{yaml[name][:filename]}")
81
- File.delete(file)
92
+ FileUtils.rm_rf(file)
82
93
  yaml.delete(name)
83
94
  save_yaml(yaml)
84
95
 
@@ -121,8 +132,8 @@ class Thor::Runner < Thor
121
132
  search = ".*#{search}" if options["substring"]
122
133
  search = /^#{search}.*/i
123
134
  group = options[:group] || 'standard'
124
-
125
- classes = Thor.subclasses.select do |k|
135
+
136
+ classes = Thor.subclasses.select do |k|
126
137
  (options[:all] || k.group_name == group) &&
127
138
  Thor::Util.constant_to_thor_path(k.name) =~ search
128
139
  end
@@ -154,7 +165,10 @@ class Thor::Runner < Thor
154
165
  # C:\Documents and Settings\james\.thor
155
166
  #
156
167
  # If we don't #gsub the \ character, Dir.glob will fail.
157
- Dir["#{thor_root.gsub(/\\/, '/')}/**/*"]
168
+ files = Dir["#{thor_root.gsub(/\\/, '/')}/*"]
169
+ files.map! do |file|
170
+ File.directory?(file) ? File.join(file, "main.thor") : file
171
+ end
158
172
  end
159
173
 
160
174
  private
@@ -252,8 +266,9 @@ class Thor::Runner < Thor
252
266
  end
253
267
 
254
268
  def load_thorfile(path)
269
+ txt = File.read(path)
255
270
  begin
256
- load path
271
+ Thor::Tasks.class_eval txt, path
257
272
  rescue Object => e
258
273
  $stderr.puts "WARNING: unable to load thorfile #{path.inspect}: #{e.message}"
259
274
  end
@@ -272,8 +287,12 @@ class Thor::Runner < Thor
272
287
 
273
288
  # We want to load system-wide Thorfiles first
274
289
  # so the local Thorfiles will override them.
275
- (relevant_to ? thorfiles_relevant_to(relevant_to) :
290
+ files = (relevant_to ? thorfiles_relevant_to(relevant_to) :
276
291
  thor_root_glob) + thorfiles - ["#{thor_root}/thor.yml"]
292
+
293
+ files.map! do |file|
294
+ File.directory?(file) ? File.join(file, "main.thor") : file
295
+ end
277
296
  end
278
297
 
279
298
  def thorfiles_relevant_to(meth)
data/lib/thor/task.rb CHANGED
@@ -62,10 +62,6 @@ class Thor
62
62
  @_full_opts ||= Options.new((klass.opts || {}).merge(@options))
63
63
  end
64
64
 
65
- def options?
66
- @options.kind_of?(Hash) && !@options.empty?
67
- end
68
-
69
65
  def formatted_usage(namespace = false)
70
66
  (namespace ? self.namespace + ':' : '') + usage +
71
67
  (opts ? " " + opts.formatted_usage : "")
@@ -75,7 +71,6 @@ class Thor
75
71
 
76
72
  def parse_args(args)
77
73
  return [[], {}] if args.nil?
78
- return [args, {}] unless options?
79
74
  hash = full_opts.parse(args)
80
75
  list = full_opts.non_opts
81
76
  [list, hash]
data/lib/thor/tasks.rb CHANGED
@@ -22,7 +22,7 @@ class Thor
22
22
  old_stderr, $stderr = $stderr.dup, File.open(null, "w")
23
23
  package
24
24
  $stderr = old_stderr
25
- system %{#{sudo} #{gem} install pkg/#{spec.name}-#{spec.version} --no-rdoc --no-ri --no-update-sources}
25
+ system %{#{sudo} #{Gem.ruby} -S #{gem} install pkg/#{spec.name}-#{spec.version} --no-rdoc --no-ri --no-update-sources}
26
26
  end
27
27
  end
28
28
 
data/lib/thor/util.rb CHANGED
@@ -15,10 +15,24 @@ module ObjectSpace
15
15
  end
16
16
 
17
17
  class Thor
18
+ module Tasks; end
19
+
18
20
  module Util
19
21
 
22
+ def self.full_const_get(obj, name)
23
+ list = name.split("::")
24
+ list.shift if list.first.empty?
25
+ list.each do |x|
26
+ # This is required because const_get tries to look for constants in the
27
+ # ancestor chain, but we only want constants that are HERE
28
+ obj = obj.const_defined?(x) ? obj.const_get(x) : obj.const_missing(x)
29
+ end
30
+ obj
31
+ end
32
+
20
33
  def self.constant_to_thor_path(str, remove_default = true)
21
- str = snake_case(str.to_s).squeeze(":")
34
+ str = str.to_s.gsub(/^Thor::Tasks::/, "")
35
+ str = snake_case(str).squeeze(":")
22
36
  str.gsub!(/^default/, '') if remove_default
23
37
  str
24
38
  end
@@ -35,16 +49,20 @@ class Thor
35
49
  str.gsub(/:(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
36
50
  end
37
51
 
38
- def self.constants_in_contents(str)
52
+ def self.constants_in_contents(str, file = __FILE__)
39
53
  klasses = ObjectSpace.classes.dup
40
- Module.new.class_eval(str)
54
+ Module.new.class_eval(str, file)
41
55
  klasses = ObjectSpace.classes - klasses
42
56
  klasses = klasses.select {|k| k < Thor }
43
57
  klasses.map! {|k| k.to_s.gsub(/#<Module:\w+>::/, '')}
44
58
  end
45
59
 
46
- def self.make_constant(str)
47
- list = str.split("::").inject(Object) {|obj, x| obj.const_get(x)}
60
+ def self.make_constant(str, base = [Thor::Tasks, Object])
61
+ which = base.find do |obj|
62
+ full_const_get(obj, str) rescue nil
63
+ end
64
+ return full_const_get(which, str) if which
65
+ raise NameError, "uninitialized constant #{str}"
48
66
  end
49
67
 
50
68
  def self.snake_case(str)
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.9.8
4
+ version: 0.9.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yehuda Katz
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-21 00:00:00 +02:00
12
+ date: 2008-12-15 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -65,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
65
  requirements: []
66
66
 
67
67
  rubyforge_project: thor
68
- rubygems_version: 1.3.0
68
+ rubygems_version: 1.3.1
69
69
  signing_key:
70
70
  specification_version: 2
71
71
  summary: A gem that maps options to a class