vim-jar 0.0.2 → 0.0.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.
Files changed (91) hide show
  1. data/Gemfile.lock +4 -1
  2. data/bin/vim-jar +1 -57
  3. data/bundler/ruby/1.8/bin/rake2thor +19 -0
  4. data/bundler/ruby/1.8/bin/thor +19 -0
  5. data/bundler/ruby/1.8/gems/thor-0.14.6/CHANGELOG.rdoc +103 -0
  6. data/bundler/ruby/1.8/gems/thor-0.14.6/LICENSE +20 -0
  7. data/bundler/ruby/1.8/gems/thor-0.14.6/README.md +307 -0
  8. data/bundler/ruby/1.8/gems/thor-0.14.6/Thorfile +24 -0
  9. data/bundler/ruby/1.8/gems/thor-0.14.6/bin/rake2thor +86 -0
  10. data/bundler/ruby/1.8/gems/thor-0.14.6/bin/thor +6 -0
  11. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/actions/create_file.rb +105 -0
  12. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/actions/create_link.rb +57 -0
  13. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/actions/directory.rb +93 -0
  14. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/actions/empty_directory.rb +134 -0
  15. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/actions/file_manipulation.rb +270 -0
  16. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/actions/inject_into_file.rb +109 -0
  17. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/actions.rb +314 -0
  18. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/base.rb +579 -0
  19. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/core_ext/file_binary_read.rb +9 -0
  20. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  21. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/core_ext/ordered_hash.rb +100 -0
  22. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/error.rb +30 -0
  23. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/group.rb +273 -0
  24. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/invocation.rb +168 -0
  25. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/parser/argument.rb +67 -0
  26. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/parser/arguments.rb +161 -0
  27. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/parser/option.rb +120 -0
  28. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/parser/options.rb +173 -0
  29. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/parser.rb +4 -0
  30. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/rake_compat.rb +66 -0
  31. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/runner.rb +309 -0
  32. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/shell/basic.rb +290 -0
  33. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/shell/color.rb +108 -0
  34. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/shell/html.rb +121 -0
  35. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/shell.rb +88 -0
  36. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/task.rb +114 -0
  37. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/util.rb +229 -0
  38. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor/version.rb +3 -0
  39. data/bundler/ruby/1.8/gems/thor-0.14.6/lib/thor.rb +334 -0
  40. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/actions/create_file_spec.rb +170 -0
  41. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/actions/directory_spec.rb +136 -0
  42. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/actions/empty_directory_spec.rb +98 -0
  43. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/actions/file_manipulation_spec.rb +310 -0
  44. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/actions/inject_into_file_spec.rb +135 -0
  45. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/actions_spec.rb +322 -0
  46. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/base_spec.rb +269 -0
  47. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/core_ext/hash_with_indifferent_access_spec.rb +43 -0
  48. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/core_ext/ordered_hash_spec.rb +115 -0
  49. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/application.rb +2 -0
  50. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/bundle/execute.rb +6 -0
  51. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/bundle/main.thor +1 -0
  52. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/doc/%file_name%.rb.tt +1 -0
  53. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/doc/README +3 -0
  54. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/doc/block_helper.rb +3 -0
  55. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/doc/components/.empty_directory +0 -0
  56. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/doc/config.rb +1 -0
  57. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/group.thor +114 -0
  58. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/invoke.thor +112 -0
  59. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/path with spaces +0 -0
  60. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/script.thor +184 -0
  61. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/fixtures/task.thor +10 -0
  62. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/group_spec.rb +178 -0
  63. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/invocation_spec.rb +100 -0
  64. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/parser/argument_spec.rb +47 -0
  65. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/parser/arguments_spec.rb +64 -0
  66. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/parser/option_spec.rb +202 -0
  67. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/parser/options_spec.rb +319 -0
  68. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/rake_compat_spec.rb +68 -0
  69. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/register_spec.rb +92 -0
  70. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/runner_spec.rb +210 -0
  71. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/shell/basic_spec.rb +223 -0
  72. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/shell/color_spec.rb +41 -0
  73. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/shell/html_spec.rb +27 -0
  74. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/shell_spec.rb +47 -0
  75. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/spec_helper.rb +54 -0
  76. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/task_spec.rb +69 -0
  77. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/thor_spec.rb +334 -0
  78. data/bundler/ruby/1.8/gems/thor-0.14.6/spec/util_spec.rb +163 -0
  79. data/bundler/ruby/1.8/specifications/thor-0.14.6.gemspec +48 -0
  80. data/lib/vim-jar/cli.rb +84 -67
  81. data/lib/vim-jar/config.rb +9 -0
  82. data/lib/vim-jar/installer/git.rb +8 -7
  83. data/lib/vim-jar/plugin.rb +61 -18
  84. data/lib/vim-jar/version.rb +1 -1
  85. data/lib/vim-jar.rb +1 -0
  86. data/spec/vim-jar/config_spec.rb +17 -0
  87. data/spec/vim-jar/git-config +16 -0
  88. data/spec/vim-jar/gitmodules +6 -0
  89. data/spec/vim-jar/plugin_spec.rb +46 -0
  90. data/vim-jar.gemspec +1 -0
  91. metadata +104 -9
@@ -0,0 +1,161 @@
1
+ class Thor
2
+ class Arguments #:nodoc:
3
+ NUMERIC = /(\d*\.\d+|\d+)/
4
+
5
+ # Receives an array of args and returns two arrays, one with arguments
6
+ # and one with switches.
7
+ #
8
+ def self.split(args)
9
+ arguments = []
10
+
11
+ args.each do |item|
12
+ break if item =~ /^-/
13
+ arguments << item
14
+ end
15
+
16
+ return arguments, args[Range.new(arguments.size, -1)]
17
+ end
18
+
19
+ def self.parse(*args)
20
+ to_parse = args.pop
21
+ new(*args).parse(to_parse)
22
+ end
23
+
24
+ # Takes an array of Thor::Argument objects.
25
+ #
26
+ def initialize(arguments=[])
27
+ @assigns, @non_assigned_required = {}, []
28
+ @switches = arguments
29
+
30
+ arguments.each do |argument|
31
+ if argument.default
32
+ @assigns[argument.human_name] = argument.default
33
+ elsif argument.required?
34
+ @non_assigned_required << argument
35
+ end
36
+ end
37
+ end
38
+
39
+ def parse(args)
40
+ @pile = args.dup
41
+
42
+ @switches.each do |argument|
43
+ break unless peek
44
+ @non_assigned_required.delete(argument)
45
+ @assigns[argument.human_name] = send(:"parse_#{argument.type}", argument.human_name)
46
+ end
47
+
48
+ check_requirement!
49
+ @assigns
50
+ end
51
+
52
+ private
53
+
54
+ def no_or_skip?(arg)
55
+ arg =~ /^--(no|skip)-([-\w]+)$/
56
+ $2
57
+ end
58
+
59
+ def last?
60
+ @pile.empty?
61
+ end
62
+
63
+ def peek
64
+ @pile.first
65
+ end
66
+
67
+ def shift
68
+ @pile.shift
69
+ end
70
+
71
+ def unshift(arg)
72
+ unless arg.kind_of?(Array)
73
+ @pile.unshift(arg)
74
+ else
75
+ @pile = arg + @pile
76
+ end
77
+ end
78
+
79
+ def current_is_value?
80
+ peek && peek.to_s !~ /^-/
81
+ end
82
+
83
+ # Runs through the argument array getting strings that contains ":" and
84
+ # mark it as a hash:
85
+ #
86
+ # [ "name:string", "age:integer" ]
87
+ #
88
+ # Becomes:
89
+ #
90
+ # { "name" => "string", "age" => "integer" }
91
+ #
92
+ def parse_hash(name)
93
+ return shift if peek.is_a?(Hash)
94
+ hash = {}
95
+
96
+ while current_is_value? && peek.include?(?:)
97
+ key, value = shift.split(':')
98
+ hash[key] = value
99
+ end
100
+ hash
101
+ end
102
+
103
+ # Runs through the argument array getting all strings until no string is
104
+ # found or a switch is found.
105
+ #
106
+ # ["a", "b", "c"]
107
+ #
108
+ # And returns it as an array:
109
+ #
110
+ # ["a", "b", "c"]
111
+ #
112
+ def parse_array(name)
113
+ return shift if peek.is_a?(Array)
114
+ array = []
115
+
116
+ while current_is_value?
117
+ array << shift
118
+ end
119
+ array
120
+ end
121
+
122
+ # Check if the peek is numeric format and return a Float or Integer.
123
+ # Otherwise raises an error.
124
+ #
125
+ def parse_numeric(name)
126
+ return shift if peek.is_a?(Numeric)
127
+
128
+ unless peek =~ NUMERIC && $& == peek
129
+ raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
130
+ end
131
+
132
+ $&.index('.') ? shift.to_f : shift.to_i
133
+ end
134
+
135
+ # Parse string:
136
+ # for --string-arg, just return the current value in the pile
137
+ # for --no-string-arg, nil
138
+ #
139
+ def parse_string(name)
140
+ if no_or_skip?(name)
141
+ nil
142
+ else
143
+ shift
144
+ end
145
+ end
146
+
147
+ # Raises an error if @non_assigned_required array is not empty.
148
+ #
149
+ def check_requirement!
150
+ unless @non_assigned_required.empty?
151
+ names = @non_assigned_required.map do |o|
152
+ o.respond_to?(:switch_name) ? o.switch_name : o.human_name
153
+ end.join("', '")
154
+
155
+ class_name = self.class.name.split('::').last.downcase
156
+ raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
157
+ end
158
+ end
159
+
160
+ end
161
+ end
@@ -0,0 +1,120 @@
1
+ class Thor
2
+ class Option < Argument #:nodoc:
3
+ attr_reader :aliases, :group, :lazy_default
4
+
5
+ VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]
6
+
7
+ def initialize(name, description=nil, required=nil, type=nil, default=nil, banner=nil, lazy_default=nil, group=nil, aliases=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
+ end
13
+
14
+ # This parse quick options given as method_options. It makes several
15
+ # assumptions, but you can be more specific using the option method.
16
+ #
17
+ # parse :foo => "bar"
18
+ # #=> Option foo with default value bar
19
+ #
20
+ # parse [:foo, :baz] => "bar"
21
+ # #=> Option foo with default value bar and alias :baz
22
+ #
23
+ # parse :foo => :required
24
+ # #=> Required option foo without default value
25
+ #
26
+ # parse :foo => 2
27
+ # #=> Option foo with default value 2 and type numeric
28
+ #
29
+ # parse :foo => :numeric
30
+ # #=> Option foo without default value and type numeric
31
+ #
32
+ # parse :foo => true
33
+ # #=> Option foo with default value true and type boolean
34
+ #
35
+ # The valid types are :boolean, :numeric, :hash, :array and :string. If none
36
+ # is given a default type is assumed. This default type accepts arguments as
37
+ # string (--foo=value) or booleans (just --foo).
38
+ #
39
+ # By default all options are optional, unless :required is given.
40
+ #
41
+ def self.parse(key, value)
42
+ if key.is_a?(Array)
43
+ name, *aliases = key
44
+ else
45
+ name, aliases = key, []
46
+ end
47
+
48
+ name = name.to_s
49
+ default = value
50
+
51
+ type = case value
52
+ when Symbol
53
+ default = nil
54
+ if VALID_TYPES.include?(value)
55
+ value
56
+ elsif required = (value == :required)
57
+ :string
58
+ end
59
+ when TrueClass, FalseClass
60
+ :boolean
61
+ when Numeric
62
+ :numeric
63
+ when Hash, Array, String
64
+ value.class.name.downcase.to_sym
65
+ end
66
+
67
+ self.new(name.to_s, nil, required, type, default, nil, nil, nil, aliases)
68
+ end
69
+
70
+ def switch_name
71
+ @switch_name ||= dasherized? ? name : dasherize(name)
72
+ end
73
+
74
+ def human_name
75
+ @human_name ||= dasherized? ? undasherize(name) : name
76
+ end
77
+
78
+ def usage(padding=0)
79
+ sample = if banner && !banner.to_s.empty?
80
+ "#{switch_name}=#{banner}"
81
+ else
82
+ switch_name
83
+ end
84
+
85
+ sample = "[#{sample}]" unless required?
86
+
87
+ if aliases.empty?
88
+ (" " * padding) << sample
89
+ else
90
+ "#{aliases.join(', ')}, #{sample}"
91
+ end
92
+ end
93
+
94
+ VALID_TYPES.each do |type|
95
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
96
+ def #{type}?
97
+ self.type == #{type.inspect}
98
+ end
99
+ RUBY
100
+ end
101
+
102
+ protected
103
+
104
+ def validate!
105
+ raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
106
+ end
107
+
108
+ def dasherized?
109
+ name.index('-') == 0
110
+ end
111
+
112
+ def undasherize(str)
113
+ str.sub(/^-{1,2}/, '')
114
+ end
115
+
116
+ def dasherize(str)
117
+ (str.length > 1 ? "--" : "-") + str.gsub('_', '-')
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,173 @@
1
+ class Thor
2
+ # This is a modified version of Daniel Berger's Getopt::Long class, licensed
3
+ # under Ruby's license.
4
+ #
5
+ class Options < Arguments #:nodoc:
6
+ LONG_RE = /^(--\w+(?:-\w+)*)$/
7
+ SHORT_RE = /^(-[a-z])$/i
8
+ EQ_RE = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
9
+ SHORT_SQ_RE = /^-([a-z]{2,})$/i # Allow either -x -v or -xv style for single char args
10
+ SHORT_NUM = /^(-[a-z])#{NUMERIC}$/i
11
+
12
+ # Receives a hash and makes it switches.
13
+ def self.to_switches(options)
14
+ options.map do |key, value|
15
+ case value
16
+ when true
17
+ "--#{key}"
18
+ when Array
19
+ "--#{key} #{value.map{ |v| v.inspect }.join(' ')}"
20
+ when Hash
21
+ "--#{key} #{value.map{ |k,v| "#{k}:#{v}" }.join(' ')}"
22
+ when nil, false
23
+ ""
24
+ else
25
+ "--#{key} #{value.inspect}"
26
+ end
27
+ end.join(" ")
28
+ end
29
+
30
+ # Takes a hash of Thor::Option and a hash with defaults.
31
+ def initialize(hash_options={}, defaults={})
32
+ options = hash_options.values
33
+ super(options)
34
+
35
+ # Add defaults
36
+ defaults.each do |key, value|
37
+ @assigns[key.to_s] = value
38
+ @non_assigned_required.delete(hash_options[key])
39
+ end
40
+
41
+ @shorts, @switches, @unknown = {}, {}, []
42
+
43
+ options.each do |option|
44
+ @switches[option.switch_name] = option
45
+
46
+ option.aliases.each do |short|
47
+ @shorts[short.to_s] ||= option.switch_name
48
+ end
49
+ end
50
+ end
51
+
52
+ def parse(args)
53
+ @pile = args.dup
54
+
55
+ while peek
56
+ match, is_switch = current_is_switch?
57
+
58
+ if is_switch
59
+ case shift
60
+ when SHORT_SQ_RE
61
+ unshift($1.split('').map { |f| "-#{f}" })
62
+ next
63
+ when EQ_RE, SHORT_NUM
64
+ unshift($2)
65
+ switch = $1
66
+ when LONG_RE, SHORT_RE
67
+ switch = $1
68
+ end
69
+
70
+ switch = normalize_switch(switch)
71
+ option = switch_option(switch)
72
+ @assigns[option.human_name] = parse_peek(switch, option)
73
+ elsif match
74
+ @unknown << shift
75
+ else
76
+ shift
77
+ end
78
+ end
79
+
80
+ check_requirement!
81
+
82
+ assigns = Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
83
+ assigns.freeze
84
+ assigns
85
+ end
86
+
87
+ def check_unknown!
88
+ raise UnknownArgumentError, "Unknown switches '#{@unknown.join(', ')}'" unless @unknown.empty?
89
+ end
90
+
91
+ protected
92
+
93
+ # Returns true if the current value in peek is a registered switch.
94
+ #
95
+ def current_is_switch?
96
+ case peek
97
+ when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
98
+ [true, switch?($1)]
99
+ when SHORT_SQ_RE
100
+ [true, $1.split('').any? { |f| switch?("-#{f}") }]
101
+ else
102
+ [false, false]
103
+ end
104
+ end
105
+
106
+ def current_is_switch_formatted?
107
+ case peek
108
+ when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
109
+ true
110
+ else
111
+ false
112
+ end
113
+ end
114
+
115
+ def switch?(arg)
116
+ switch_option(normalize_switch(arg))
117
+ end
118
+
119
+ def switch_option(arg)
120
+ if match = no_or_skip?(arg)
121
+ @switches[arg] || @switches["--#{match}"]
122
+ else
123
+ @switches[arg]
124
+ end
125
+ end
126
+
127
+ # Check if the given argument is actually a shortcut.
128
+ #
129
+ def normalize_switch(arg)
130
+ (@shorts[arg] || arg).tr('_', '-')
131
+ end
132
+
133
+ # Parse boolean values which can be given as --foo=true, --foo or --no-foo.
134
+ #
135
+ def parse_boolean(switch)
136
+ if current_is_value?
137
+ if ["true", "TRUE", "t", "T", true].include?(peek)
138
+ shift
139
+ true
140
+ elsif ["false", "FALSE", "f", "F", false].include?(peek)
141
+ shift
142
+ false
143
+ else
144
+ true
145
+ end
146
+ else
147
+ @switches.key?(switch) || !no_or_skip?(switch)
148
+ end
149
+ end
150
+
151
+ # Parse the value at the peek analyzing if it requires an input or not.
152
+ #
153
+ def parse_peek(switch, option)
154
+ if current_is_switch_formatted? || last?
155
+ if option.boolean?
156
+ # No problem for boolean types
157
+ elsif no_or_skip?(switch)
158
+ return nil # User set value to nil
159
+ elsif option.string? && !option.required?
160
+ # Return the default if there is one, else the human name
161
+ return option.lazy_default || option.default || option.human_name
162
+ elsif option.lazy_default
163
+ return option.lazy_default
164
+ else
165
+ raise MalformattedArgumentError, "No value provided for option '#{switch}'"
166
+ end
167
+ end
168
+
169
+ @non_assigned_required.delete(option)
170
+ send(:"parse_#{option.type}", switch)
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,4 @@
1
+ require 'thor/parser/argument'
2
+ require 'thor/parser/arguments'
3
+ require 'thor/parser/option'
4
+ require 'thor/parser/options'
@@ -0,0 +1,66 @@
1
+ require 'rake'
2
+
3
+ class Thor
4
+ # Adds a compatibility layer to your Thor classes which allows you to use
5
+ # rake package tasks. For example, to use rspec rake tasks, one can do:
6
+ #
7
+ # require 'thor/rake_compat'
8
+ #
9
+ # class Default < Thor
10
+ # include Thor::RakeCompat
11
+ #
12
+ # Spec::Rake::SpecTask.new(:spec) do |t|
13
+ # t.spec_opts = ['--options', "spec/spec.opts"]
14
+ # t.spec_files = FileList['spec/**/*_spec.rb']
15
+ # end
16
+ # end
17
+ #
18
+ module RakeCompat
19
+ def self.rake_classes
20
+ @rake_classes ||= []
21
+ end
22
+
23
+ def self.included(base)
24
+ # Hack. Make rakefile point to invoker, so rdoc task is generated properly.
25
+ rakefile = File.basename(caller[0].match(/(.*):\d+/)[1])
26
+ Rake.application.instance_variable_set(:@rakefile, rakefile)
27
+ self.rake_classes << base
28
+ end
29
+ end
30
+ end
31
+
32
+ class Object #:nodoc:
33
+ alias :rake_task :task
34
+ alias :rake_namespace :namespace
35
+
36
+ def task(*args, &block)
37
+ task = rake_task(*args, &block)
38
+
39
+ if klass = Thor::RakeCompat.rake_classes.last
40
+ non_namespaced_name = task.name.split(':').last
41
+
42
+ description = non_namespaced_name
43
+ description << task.arg_names.map{ |n| n.to_s.upcase }.join(' ')
44
+ description.strip!
45
+
46
+ klass.desc description, task.comment || non_namespaced_name
47
+ klass.send :define_method, non_namespaced_name do |*args|
48
+ Rake::Task[task.name.to_sym].invoke(*args)
49
+ end
50
+ end
51
+
52
+ task
53
+ end
54
+
55
+ def namespace(name, &block)
56
+ if klass = Thor::RakeCompat.rake_classes.last
57
+ const_name = Thor::Util.camel_case(name.to_s).to_sym
58
+ klass.const_set(const_name, Class.new(Thor))
59
+ new_klass = klass.const_get(const_name)
60
+ Thor::RakeCompat.rake_classes << new_klass
61
+ end
62
+
63
+ rake_namespace(name, &block)
64
+ Thor::RakeCompat.rake_classes.pop
65
+ end
66
+ end