acquia_toolbelt 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. metadata +62 -130
  2. data/.gitignore +0 -4
  3. data/.ruby-version +0 -1
  4. data/.travis.yml +0 -7
  5. data/Gemfile +0 -3
  6. data/Gemfile.lock +0 -35
  7. data/LICENSE +0 -19
  8. data/README.md +0 -147
  9. data/Rakefile +0 -1
  10. data/acquia_toolbelt.gemspec +0 -32
  11. data/bin/acquia +0 -9
  12. data/lib/acquia_toolbelt.rb +0 -4
  13. data/lib/acquia_toolbelt/cli.rb +0 -103
  14. data/lib/acquia_toolbelt/cli/api.rb +0 -106
  15. data/lib/acquia_toolbelt/cli/auth.rb +0 -31
  16. data/lib/acquia_toolbelt/cli/database.rb +0 -208
  17. data/lib/acquia_toolbelt/cli/deploy.rb +0 -30
  18. data/lib/acquia_toolbelt/cli/domain.rb +0 -166
  19. data/lib/acquia_toolbelt/cli/environment.rb +0 -38
  20. data/lib/acquia_toolbelt/cli/file.rb +0 -23
  21. data/lib/acquia_toolbelt/cli/server.rb +0 -61
  22. data/lib/acquia_toolbelt/cli/site.rb +0 -28
  23. data/lib/acquia_toolbelt/cli/ssh.rb +0 -69
  24. data/lib/acquia_toolbelt/cli/svn.rb +0 -65
  25. data/lib/acquia_toolbelt/cli/task.rb +0 -71
  26. data/lib/acquia_toolbelt/cli/ui.rb +0 -29
  27. data/lib/acquia_toolbelt/error.rb +0 -4
  28. data/lib/acquia_toolbelt/thor.rb +0 -95
  29. data/lib/acquia_toolbelt/version.rb +0 -3
  30. data/lib/vendor/thor/CHANGELOG.md +0 -139
  31. data/lib/vendor/thor/Gemfile +0 -20
  32. data/lib/vendor/thor/LICENSE.md +0 -20
  33. data/lib/vendor/thor/README.md +0 -35
  34. data/lib/vendor/thor/lib/thor.rb +0 -474
  35. data/lib/vendor/thor/lib/thor/actions.rb +0 -318
  36. data/lib/vendor/thor/lib/thor/actions/create_file.rb +0 -105
  37. data/lib/vendor/thor/lib/thor/actions/create_link.rb +0 -60
  38. data/lib/vendor/thor/lib/thor/actions/directory.rb +0 -119
  39. data/lib/vendor/thor/lib/thor/actions/empty_directory.rb +0 -137
  40. data/lib/vendor/thor/lib/thor/actions/file_manipulation.rb +0 -317
  41. data/lib/vendor/thor/lib/thor/actions/inject_into_file.rb +0 -109
  42. data/lib/vendor/thor/lib/thor/base.rb +0 -654
  43. data/lib/vendor/thor/lib/thor/command.rb +0 -136
  44. data/lib/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +0 -80
  45. data/lib/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
  46. data/lib/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -100
  47. data/lib/vendor/thor/lib/thor/error.rb +0 -32
  48. data/lib/vendor/thor/lib/thor/group.rb +0 -282
  49. data/lib/vendor/thor/lib/thor/invocation.rb +0 -172
  50. data/lib/vendor/thor/lib/thor/parser.rb +0 -4
  51. data/lib/vendor/thor/lib/thor/parser/argument.rb +0 -74
  52. data/lib/vendor/thor/lib/thor/parser/arguments.rb +0 -171
  53. data/lib/vendor/thor/lib/thor/parser/option.rb +0 -121
  54. data/lib/vendor/thor/lib/thor/parser/options.rb +0 -218
  55. data/lib/vendor/thor/lib/thor/rake_compat.rb +0 -72
  56. data/lib/vendor/thor/lib/thor/runner.rb +0 -322
  57. data/lib/vendor/thor/lib/thor/shell.rb +0 -88
  58. data/lib/vendor/thor/lib/thor/shell/basic.rb +0 -422
  59. data/lib/vendor/thor/lib/thor/shell/color.rb +0 -148
  60. data/lib/vendor/thor/lib/thor/shell/html.rb +0 -127
  61. data/lib/vendor/thor/lib/thor/util.rb +0 -270
  62. data/lib/vendor/thor/lib/thor/version.rb +0 -3
  63. data/lib/vendor/thor/spec/actions/create_file_spec.rb +0 -170
  64. data/lib/vendor/thor/spec/actions/create_link_spec.rb +0 -95
  65. data/lib/vendor/thor/spec/actions/directory_spec.rb +0 -169
  66. data/lib/vendor/thor/spec/actions/empty_directory_spec.rb +0 -129
  67. data/lib/vendor/thor/spec/actions/file_manipulation_spec.rb +0 -382
  68. data/lib/vendor/thor/spec/actions/inject_into_file_spec.rb +0 -135
  69. data/lib/vendor/thor/spec/actions_spec.rb +0 -331
  70. data/lib/vendor/thor/spec/base_spec.rb +0 -291
  71. data/lib/vendor/thor/spec/command_spec.rb +0 -80
  72. data/lib/vendor/thor/spec/core_ext/hash_with_indifferent_access_spec.rb +0 -48
  73. data/lib/vendor/thor/spec/core_ext/ordered_hash_spec.rb +0 -115
  74. data/lib/vendor/thor/spec/exit_condition_spec.rb +0 -19
  75. data/lib/vendor/thor/spec/fixtures/application.rb +0 -2
  76. data/lib/vendor/thor/spec/fixtures/app{1}/README +0 -3
  77. data/lib/vendor/thor/spec/fixtures/bundle/execute.rb +0 -6
  78. data/lib/vendor/thor/spec/fixtures/bundle/main.thor +0 -1
  79. data/lib/vendor/thor/spec/fixtures/command.thor +0 -10
  80. data/lib/vendor/thor/spec/fixtures/doc/%file_name%.rb.tt +0 -1
  81. data/lib/vendor/thor/spec/fixtures/doc/COMMENTER +0 -11
  82. data/lib/vendor/thor/spec/fixtures/doc/README +0 -3
  83. data/lib/vendor/thor/spec/fixtures/doc/block_helper.rb +0 -3
  84. data/lib/vendor/thor/spec/fixtures/doc/components/.empty_directory +0 -0
  85. data/lib/vendor/thor/spec/fixtures/doc/config.rb +0 -1
  86. data/lib/vendor/thor/spec/fixtures/doc/config.yaml.tt +0 -1
  87. data/lib/vendor/thor/spec/fixtures/doc/excluding/%file_name%.rb.tt +0 -1
  88. data/lib/vendor/thor/spec/fixtures/enum.thor +0 -10
  89. data/lib/vendor/thor/spec/fixtures/group.thor +0 -128
  90. data/lib/vendor/thor/spec/fixtures/invoke.thor +0 -118
  91. data/lib/vendor/thor/spec/fixtures/path with spaces b/data/lib/vendor/thor/spec/fixtures/path with → spaces +0 -0
  92. data/lib/vendor/thor/spec/fixtures/preserve/script.sh +0 -3
  93. data/lib/vendor/thor/spec/fixtures/script.thor +0 -220
  94. data/lib/vendor/thor/spec/fixtures/subcommand.thor +0 -17
  95. data/lib/vendor/thor/spec/group_spec.rb +0 -222
  96. data/lib/vendor/thor/spec/helper.rb +0 -67
  97. data/lib/vendor/thor/spec/invocation_spec.rb +0 -108
  98. data/lib/vendor/thor/spec/parser/argument_spec.rb +0 -53
  99. data/lib/vendor/thor/spec/parser/arguments_spec.rb +0 -66
  100. data/lib/vendor/thor/spec/parser/option_spec.rb +0 -202
  101. data/lib/vendor/thor/spec/parser/options_spec.rb +0 -400
  102. data/lib/vendor/thor/spec/rake_compat_spec.rb +0 -72
  103. data/lib/vendor/thor/spec/register_spec.rb +0 -197
  104. data/lib/vendor/thor/spec/runner_spec.rb +0 -241
  105. data/lib/vendor/thor/spec/shell/basic_spec.rb +0 -330
  106. data/lib/vendor/thor/spec/shell/color_spec.rb +0 -95
  107. data/lib/vendor/thor/spec/shell/html_spec.rb +0 -31
  108. data/lib/vendor/thor/spec/shell_spec.rb +0 -47
  109. data/lib/vendor/thor/spec/subcommand_spec.rb +0 -30
  110. data/lib/vendor/thor/spec/thor_spec.rb +0 -499
  111. data/lib/vendor/thor/spec/util_spec.rb +0 -196
  112. data/lib/vendor/thor/thor.gemspec +0 -24
  113. data/script/setup_build +0 -6
  114. data/spec/auth_spec.rb +0 -8
  115. data/spec_helper.rb +0 -6
@@ -1,218 +0,0 @@
1
- class Thor
2
- class Options < Arguments #:nodoc:
3
- LONG_RE = /^(--\w+(?:-\w+)*)$/
4
- SHORT_RE = /^(-[a-z])$/i
5
- EQ_RE = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
6
- SHORT_SQ_RE = /^-([a-z]{2,})$/i # Allow either -x -v or -xv style for single char args
7
- SHORT_NUM = /^(-[a-z])#{NUMERIC}$/i
8
- OPTS_END = '--'.freeze
9
-
10
- # Receives a hash and makes it switches.
11
- def self.to_switches(options)
12
- options.map do |key, value|
13
- case value
14
- when true
15
- "--#{key}"
16
- when Array
17
- "--#{key} #{value.map{ |v| v.inspect }.join(' ')}"
18
- when Hash
19
- "--#{key} #{value.map{ |k,v| "#{k}:#{v}" }.join(' ')}"
20
- when nil, false
21
- ""
22
- else
23
- "--#{key} #{value.inspect}"
24
- end
25
- end.join(" ")
26
- end
27
-
28
- # Takes a hash of Thor::Option and a hash with defaults.
29
- #
30
- # If +stop_on_unknown+ is true, #parse will stop as soon as it encounters
31
- # an unknown option or a regular argument.
32
- def initialize(hash_options={}, defaults={}, stop_on_unknown=false)
33
- @stop_on_unknown = stop_on_unknown
34
- options = hash_options.values
35
- super(options)
36
-
37
- # Add defaults
38
- defaults.each do |key, value|
39
- @assigns[key.to_s] = value
40
- @non_assigned_required.delete(hash_options[key])
41
- end
42
-
43
- @shorts, @switches, @extra = {}, {}, []
44
-
45
- options.each do |option|
46
- @switches[option.switch_name] = option
47
-
48
- option.aliases.each do |short|
49
- name = short.to_s.sub(/^(?!\-)/, '-')
50
- @shorts[name] ||= option.switch_name
51
- end
52
- end
53
- end
54
-
55
- def remaining
56
- @extra
57
- end
58
-
59
- def peek
60
- return super unless @parsing_options
61
-
62
- result = super
63
- if result == OPTS_END
64
- shift
65
- @parsing_options = false
66
- super
67
- else
68
- result
69
- end
70
- end
71
-
72
- def parse(args)
73
- @pile = args.dup
74
- @parsing_options = true
75
-
76
- while peek
77
- if parsing_options?
78
- match, is_switch = current_is_switch?
79
- shifted = shift
80
-
81
- if is_switch
82
- case shifted
83
- when SHORT_SQ_RE
84
- unshift($1.split('').map { |f| "-#{f}" })
85
- next
86
- when EQ_RE, SHORT_NUM
87
- unshift($2)
88
- switch = $1
89
- when LONG_RE, SHORT_RE
90
- switch = $1
91
- end
92
-
93
- switch = normalize_switch(switch)
94
- option = switch_option(switch)
95
- @assigns[option.human_name] = parse_peek(switch, option)
96
- elsif @stop_on_unknown
97
- @parsing_options = false
98
- @extra << shifted
99
- @extra << shift while peek
100
- break
101
- elsif match
102
- @extra << shifted
103
- @extra << shift while peek && peek !~ /^-/
104
- else
105
- @extra << shifted
106
- end
107
- else
108
- @extra << shift
109
- end
110
- end
111
-
112
- check_requirement!
113
-
114
- assigns = Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
115
- assigns.freeze
116
- assigns
117
- end
118
-
119
- def check_unknown!
120
- # an unknown option starts with - or -- and has no more --'s afterward.
121
- unknown = @extra.select { |str| str =~ /^--?(?:(?!--).)*$/ }
122
- raise UnknownArgumentError, "Unknown switches '#{unknown.join(', ')}'" unless unknown.empty?
123
- end
124
-
125
- protected
126
-
127
- # Check if the current value in peek is a registered switch.
128
- #
129
- # Two booleans are returned. The first is true if the current value
130
- # starts with a hyphen; the second is true if it is a registered switch.
131
- def current_is_switch?
132
- case peek
133
- when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
134
- [true, switch?($1)]
135
- when SHORT_SQ_RE
136
- [true, $1.split('').any? { |f| switch?("-#{f}") }]
137
- else
138
- [false, false]
139
- end
140
- end
141
-
142
- def current_is_switch_formatted?
143
- case peek
144
- when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
145
- true
146
- else
147
- false
148
- end
149
- end
150
-
151
- def current_is_value?
152
- peek && (!parsing_options? || super)
153
- end
154
-
155
- def switch?(arg)
156
- switch_option(normalize_switch(arg))
157
- end
158
-
159
- def switch_option(arg)
160
- if match = no_or_skip?(arg)
161
- @switches[arg] || @switches["--#{match}"]
162
- else
163
- @switches[arg]
164
- end
165
- end
166
-
167
- # Check if the given argument is actually a shortcut.
168
- #
169
- def normalize_switch(arg)
170
- (@shorts[arg] || arg).tr('_', '-')
171
- end
172
-
173
- def parsing_options?
174
- peek
175
- @parsing_options
176
- end
177
-
178
- # Parse boolean values which can be given as --foo=true, --foo or --no-foo.
179
- #
180
- def parse_boolean(switch)
181
- if current_is_value?
182
- if ["true", "TRUE", "t", "T", true].include?(peek)
183
- shift
184
- true
185
- elsif ["false", "FALSE", "f", "F", false].include?(peek)
186
- shift
187
- false
188
- else
189
- true
190
- end
191
- else
192
- @switches.key?(switch) || !no_or_skip?(switch)
193
- end
194
- end
195
-
196
- # Parse the value at the peek analyzing if it requires an input or not.
197
- #
198
- def parse_peek(switch, option)
199
- if parsing_options? && (current_is_switch_formatted? || last?)
200
- if option.boolean?
201
- # No problem for boolean types
202
- elsif no_or_skip?(switch)
203
- return nil # User set value to nil
204
- elsif option.string? && !option.required?
205
- # Return the default if there is one, else the human name
206
- return option.lazy_default || option.default || option.human_name
207
- elsif option.lazy_default
208
- return option.lazy_default
209
- else
210
- raise MalformattedArgumentError, "No value provided for option '#{switch}'"
211
- end
212
- end
213
-
214
- @non_assigned_required.delete(option)
215
- send(:"parse_#{option.type}", switch)
216
- end
217
- end
218
- end
@@ -1,72 +0,0 @@
1
- require 'rake'
2
- require 'rake/dsl_definition'
3
-
4
- class Thor
5
- # Adds a compatibility layer to your Thor classes which allows you to use
6
- # rake package tasks. For example, to use rspec rake tasks, one can do:
7
- #
8
- # require 'thor/rake_compat'
9
- # require 'rspec/core/rake_task'
10
- #
11
- # class Default < Thor
12
- # include Thor::RakeCompat
13
- #
14
- # RSpec::Core::RakeTask.new(:spec) do |t|
15
- # t.spec_opts = ['--options', "./.rspec"]
16
- # t.spec_files = FileList['spec/**/*_spec.rb']
17
- # end
18
- # end
19
- #
20
- module RakeCompat
21
- include Rake::DSL if defined?(Rake::DSL)
22
-
23
- def self.rake_classes
24
- @rake_classes ||= []
25
- end
26
-
27
- def self.included(base)
28
- # Hack. Make rakefile point to invoker, so rdoc task is generated properly.
29
- rakefile = File.basename(caller[0].match(/(.*):\d+/)[1])
30
- Rake.application.instance_variable_set(:@rakefile, rakefile)
31
- self.rake_classes << base
32
- end
33
- end
34
- end
35
-
36
- # override task on (main), for compatibility with Rake 0.9
37
- self.instance_eval do
38
- alias rake_namespace namespace
39
-
40
- def task(*)
41
- task = super
42
-
43
- if klass = Thor::RakeCompat.rake_classes.last
44
- non_namespaced_name = task.name.split(':').last
45
-
46
- description = non_namespaced_name
47
- description << task.arg_names.map{ |n| n.to_s.upcase }.join(' ')
48
- description.strip!
49
-
50
- klass.desc description, Rake.application.last_description || non_namespaced_name
51
- Rake.application.last_description = nil
52
- klass.send :define_method, non_namespaced_name do |*args|
53
- Rake::Task[task.name.to_sym].invoke(*args)
54
- end
55
- end
56
-
57
- task
58
- end
59
-
60
- def namespace(name)
61
- if klass = Thor::RakeCompat.rake_classes.last
62
- const_name = Thor::Util.camel_case(name.to_s).to_sym
63
- klass.const_set(const_name, Class.new(Thor))
64
- new_klass = klass.const_get(const_name)
65
- Thor::RakeCompat.rake_classes << new_klass
66
- end
67
-
68
- super
69
- Thor::RakeCompat.rake_classes.pop
70
- end
71
- end
72
-
@@ -1,322 +0,0 @@
1
- require 'thor'
2
- require 'thor/group'
3
- require 'thor/core_ext/io_binary_read'
4
-
5
- require 'fileutils'
6
- require 'open-uri'
7
- require 'yaml'
8
- require 'digest/md5'
9
- require 'pathname'
10
-
11
- class Thor::Runner < Thor #:nodoc:
12
- map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
13
-
14
- # Override Thor#help so it can give information about any class and any method.
15
- #
16
- def help(meth = nil)
17
- if meth && !self.respond_to?(meth)
18
- initialize_thorfiles(meth)
19
- klass, command = Thor::Util.find_class_and_command_by_namespace(meth)
20
- self.class.handle_no_command_error(command, false) if klass.nil?
21
- klass.start(["-h", command].compact, :shell => self.shell)
22
- else
23
- super
24
- end
25
- end
26
-
27
- # If a command is not found on Thor::Runner, method missing is invoked and
28
- # Thor::Runner is then responsible for finding the command in all classes.
29
- #
30
- def method_missing(meth, *args)
31
- meth = meth.to_s
32
- initialize_thorfiles(meth)
33
- klass, command = Thor::Util.find_class_and_command_by_namespace(meth)
34
- self.class.handle_no_command_error(command, false) if klass.nil?
35
- args.unshift(command) if command
36
- klass.start(args, :shell => self.shell)
37
- end
38
-
39
- desc "install NAME", "Install an optionally named Thor file into your system commands"
40
- method_options :as => :string, :relative => :boolean, :force => :boolean
41
- def install(name)
42
- initialize_thorfiles
43
-
44
- # If a directory name is provided as the argument, look for a 'main.thor'
45
- # command in said directory.
46
- begin
47
- if File.directory?(File.expand_path(name))
48
- base, package = File.join(name, "main.thor"), :directory
49
- contents = open(base) {|input| input.read }
50
- else
51
- base, package = name, :file
52
- contents = open(name) {|input| input.read }
53
- end
54
- rescue OpenURI::HTTPError
55
- raise Error, "Error opening URI '#{name}'"
56
- rescue Errno::ENOENT
57
- raise Error, "Error opening file '#{name}'"
58
- end
59
-
60
- say "Your Thorfile contains:"
61
- say contents
62
-
63
- unless options["force"]
64
- return false if no?("Do you wish to continue [y/N]?")
65
- end
66
-
67
- as = options["as"] || begin
68
- first_line = contents.split("\n")[0]
69
- (match = first_line.match(/\s*#\s*module:\s*([^\n]*)/)) ? match[1].strip : nil
70
- end
71
-
72
- unless as
73
- basename = File.basename(name)
74
- as = ask("Please specify a name for #{name} in the system repository [#{basename}]:")
75
- as = basename if as.empty?
76
- end
77
-
78
- location = if options[:relative] || name =~ /^https?:\/\//
79
- name
80
- else
81
- File.expand_path(name)
82
- end
83
-
84
- thor_yaml[as] = {
85
- :filename => Digest::MD5.hexdigest(name + as),
86
- :location => location,
87
- :namespaces => Thor::Util.namespaces_in_content(contents, base)
88
- }
89
-
90
- save_yaml(thor_yaml)
91
- say "Storing thor file in your system repository"
92
- destination = File.join(thor_root, thor_yaml[as][:filename])
93
-
94
- if package == :file
95
- File.open(destination, "w") { |f| f.puts contents }
96
- else
97
- FileUtils.cp_r(name, destination)
98
- end
99
-
100
- thor_yaml[as][:filename] # Indicate success
101
- end
102
-
103
- desc "version", "Show Thor version"
104
- def version
105
- require 'thor/version'
106
- say "Thor #{Thor::VERSION}"
107
- end
108
-
109
- desc "uninstall NAME", "Uninstall a named Thor module"
110
- def uninstall(name)
111
- raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
112
- say "Uninstalling #{name}."
113
- FileUtils.rm_rf(File.join(thor_root, "#{thor_yaml[name][:filename]}"))
114
-
115
- thor_yaml.delete(name)
116
- save_yaml(thor_yaml)
117
-
118
- puts "Done."
119
- end
120
-
121
- desc "update NAME", "Update a Thor file from its original location"
122
- def update(name)
123
- raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
124
-
125
- say "Updating '#{name}' from #{thor_yaml[name][:location]}"
126
-
127
- old_filename = thor_yaml[name][:filename]
128
- self.options = self.options.merge("as" => name)
129
-
130
- if File.directory? File.expand_path(name)
131
- FileUtils.rm_rf(File.join(thor_root, old_filename))
132
-
133
- thor_yaml.delete(old_filename)
134
- save_yaml(thor_yaml)
135
-
136
- filename = install(name)
137
- else
138
- filename = install(thor_yaml[name][:location])
139
- end
140
-
141
- unless filename == old_filename
142
- File.delete(File.join(thor_root, old_filename))
143
- end
144
- end
145
-
146
- desc "installed", "List the installed Thor modules and commands"
147
- method_options :internal => :boolean
148
- def installed
149
- initialize_thorfiles(nil, true)
150
- display_klasses(true, options["internal"])
151
- end
152
-
153
- desc "list [SEARCH]", "List the available thor commands (--substring means .*SEARCH)"
154
- method_options :substring => :boolean, :group => :string, :all => :boolean, :debug => :boolean
155
- def list(search="")
156
- initialize_thorfiles
157
-
158
- search = ".*#{search}" if options["substring"]
159
- search = /^#{search}.*/i
160
- group = options[:group] || "standard"
161
-
162
- klasses = Thor::Base.subclasses.select do |k|
163
- (options[:all] || k.group == group) && k.namespace =~ search
164
- end
165
-
166
- display_klasses(false, false, klasses)
167
- end
168
-
169
- private
170
-
171
- def self.banner(command, all = false, subcommand = false)
172
- "thor " + command.formatted_usage(self, all, subcommand)
173
- end
174
-
175
- def thor_root
176
- Thor::Util.thor_root
177
- end
178
-
179
- def thor_yaml
180
- @thor_yaml ||= begin
181
- yaml_file = File.join(thor_root, "thor.yml")
182
- yaml = YAML.load_file(yaml_file) if File.exists?(yaml_file)
183
- yaml || {}
184
- end
185
- end
186
-
187
- # Save the yaml file. If none exists in thor root, creates one.
188
- #
189
- def save_yaml(yaml)
190
- yaml_file = File.join(thor_root, "thor.yml")
191
-
192
- unless File.exists?(yaml_file)
193
- FileUtils.mkdir_p(thor_root)
194
- yaml_file = File.join(thor_root, "thor.yml")
195
- FileUtils.touch(yaml_file)
196
- end
197
-
198
- File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
199
- end
200
-
201
- def self.exit_on_failure?
202
- true
203
- end
204
-
205
- # Load the Thorfiles. If relevant_to is supplied, looks for specific files
206
- # in the thor_root instead of loading them all.
207
- #
208
- # By default, it also traverses the current path until find Thor files, as
209
- # described in thorfiles. This look up can be skipped by supplying
210
- # skip_lookup true.
211
- #
212
- def initialize_thorfiles(relevant_to=nil, skip_lookup=false)
213
- thorfiles(relevant_to, skip_lookup).each do |f|
214
- Thor::Util.load_thorfile(f, nil, options[:debug]) unless Thor::Base.subclass_files.keys.include?(File.expand_path(f))
215
- end
216
- end
217
-
218
- # Finds Thorfiles by traversing from your current directory down to the root
219
- # directory of your system. If at any time we find a Thor file, we stop.
220
- #
221
- # We also ensure that system-wide Thorfiles are loaded first, so local
222
- # Thorfiles can override them.
223
- #
224
- # ==== Example
225
- #
226
- # If we start at /Users/wycats/dev/thor ...
227
- #
228
- # 1. /Users/wycats/dev/thor
229
- # 2. /Users/wycats/dev
230
- # 3. /Users/wycats <-- we find a Thorfile here, so we stop
231
- #
232
- # Suppose we start at c:\Documents and Settings\james\dev\thor ...
233
- #
234
- # 1. c:\Documents and Settings\james\dev\thor
235
- # 2. c:\Documents and Settings\james\dev
236
- # 3. c:\Documents and Settings\james
237
- # 4. c:\Documents and Settings
238
- # 5. c:\ <-- no Thorfiles found!
239
- #
240
- def thorfiles(relevant_to=nil, skip_lookup=false)
241
- thorfiles = []
242
-
243
- unless skip_lookup
244
- Pathname.pwd.ascend do |path|
245
- thorfiles = Thor::Util.globs_for(path).map { |g| Dir[g] }.flatten
246
- break unless thorfiles.empty?
247
- end
248
- end
249
-
250
- files = (relevant_to ? thorfiles_relevant_to(relevant_to) : Thor::Util.thor_root_glob)
251
- files += thorfiles
252
- files -= ["#{thor_root}/thor.yml"]
253
-
254
- files.map! do |file|
255
- File.directory?(file) ? File.join(file, "main.thor") : file
256
- end
257
- end
258
-
259
- # Load Thorfiles relevant to the given method. If you provide "foo:bar" it
260
- # will load all thor files in the thor.yaml that has "foo" e "foo:bar"
261
- # namespaces registered.
262
- #
263
- def thorfiles_relevant_to(meth)
264
- lookup = [ meth, meth.split(":")[0...-1].join(":") ]
265
-
266
- files = thor_yaml.select do |k, v|
267
- v[:namespaces] && !(v[:namespaces] & lookup).empty?
268
- end
269
-
270
- files.map { |k, v| File.join(thor_root, "#{v[:filename]}") }
271
- end
272
-
273
- # Display information about the given klasses. If with_module is given,
274
- # it shows a table with information extracted from the yaml file.
275
- #
276
- def display_klasses(with_modules=false, show_internal=false, klasses=Thor::Base.subclasses)
277
- klasses -= [Thor, Thor::Runner, Thor::Group] unless show_internal
278
-
279
- raise Error, "No Thor commands available" if klasses.empty?
280
- show_modules if with_modules && !thor_yaml.empty?
281
-
282
- list = Hash.new { |h,k| h[k] = [] }
283
- groups = klasses.select { |k| k.ancestors.include?(Thor::Group) }
284
-
285
- # Get classes which inherit from Thor
286
- (klasses - groups).each { |k| list[k.namespace.split(":").first] += k.printable_commands(false) }
287
-
288
- # Get classes which inherit from Thor::Base
289
- groups.map! { |k| k.printable_commands(false).first }
290
- list["root"] = groups
291
-
292
- # Order namespaces with default coming first
293
- list = list.sort{ |a,b| a[0].sub(/^default/, '') <=> b[0].sub(/^default/, '') }
294
- list.each { |n, commands| display_commands(n, commands) unless commands.empty? }
295
- end
296
-
297
- def display_commands(namespace, list) #:nodoc:
298
- list.sort!{ |a,b| a[0] <=> b[0] }
299
-
300
- say shell.set_color(namespace, :blue, true)
301
- say "-" * namespace.size
302
-
303
- print_table(list, :truncate => true)
304
- say
305
- end
306
- alias display_tasks display_commands
307
-
308
- def show_modules #:nodoc:
309
- info = []
310
- labels = ["Modules", "Namespaces"]
311
-
312
- info << labels
313
- info << [ "-" * labels[0].size, "-" * labels[1].size ]
314
-
315
- thor_yaml.each do |name, hash|
316
- info << [ name, hash[:namespaces].join(", ") ]
317
- end
318
-
319
- print_table info
320
- say ""
321
- end
322
- end