Class: Jets::Commands::Base
- Extended by:
- Memoist
- Defined in:
- lib/jets/commands/base.rb
Direct Known Subclasses
Clean, Clean::Log, Db, Dynamodb, Dynamodb::Migrate, Gems, Import, Main
Class Method Summary collapse
-
.autocomplete(full_command) ⇒ Object
If this fails to find a match then return the original full command.
-
.banner(command, namespace = nil, subcommand = false) ⇒ Object
Use Jets banner instead of Thor to account for namespaces in commands.
-
.dispatch(command, given_args, given_opts, config) ⇒ Object
Hacky way to handle error for ‘jets new’ when no project name is passed in to avoid this error:.
-
.eager_load! ⇒ Object
Useful for help menu when we need to have all the definitions loaded.
- .help_list(all = false) ⇒ Object
- .inherited(base) ⇒ Object
- .klass_from_namespace(namespace) ⇒ Object
- .namespace_from_class(klass) ⇒ Object
-
.namespaced_commands ⇒ Object
Fully qualifed task names.
-
.perform(full_command, thor_args) ⇒ Object
thor_args is an array of commands.
- .special_class_map(class_name) ⇒ Object
-
.subclasses ⇒ Object
Track all command subclasses.
Class Method Details
.autocomplete(full_command) ⇒ Object
If this fails to find a match then return the original full command
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/jets/commands/base.rb', line 142 def autocomplete(full_command) return nil if full_command.nil? # jets help eager_load! words = full_command.split(':') namespace = words[0..-2].join(':') if words.size > 1 command = words.last # Thor's normalize_command_name autocompletes the command but then we need to add the namespace back begin thor_subclass = klass_from_namespace(namespace) # could NameError command = thor_subclass.normalize_command_name(command) # could Thor::AmbiguousCommandError [namespace, command].compact.join(':') rescue NameError full_command # return original full_command rescue Thor::AmbiguousCommandError => e puts "Unable to autodetect the command name. #{e.}." full_command # return original full_command end end |
.banner(command, namespace = nil, subcommand = false) ⇒ Object
Use Jets banner instead of Thor to account for namespaces in commands.
92 93 94 95 96 97 98 |
# File 'lib/jets/commands/base.rb', line 92 def (command, namespace = nil, subcommand = false) namespace = namespace_from_class(self) command_name = command.usage # set with desc when defining tht Thor class namespaced_command = [namespace, command_name].compact.join(':') "jets #{namespaced_command}" end |
.dispatch(command, given_args, given_opts, config) ⇒ Object
Hacky way to handle error for ‘jets new’ when no project name is passed in to avoid this error:
required arguments 'project_name' (Thor::RequiredArgumentMissingError)
34 35 36 37 38 39 |
# File 'lib/jets/commands/base.rb', line 34 def dispatch(command, given_args, given_opts, config) if given_args.reject{|s| s =~ /^-/} == ['new'] # user forgot to pass a project name given_args = ['help', 'new'] end super end |
.eager_load! ⇒ Object
Useful for help menu when we need to have all the definitions loaded. Using constantize instead of require so we dont care about order. The eager load actually uses autoloading.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/jets/commands/base.rb', line 57 def eager_load! base_path = File.("../../", __FILE__) Dir.glob("#{base_path}/commands/**/*.rb").select do |path| next if !File.file?(path) or path =~ /templates/ or path =~ %r{/markdown/} class_name = path .sub(/\.rb$/,'') .sub(%r{.*/jets/commands}, 'jets/commands') .classify class_name = special_class_map(class_name) # NOTE: Weird thing where Jets::Commands::Db::Task => Thor::Command # because Task is a class available to Thor I believe. # puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG'] class_name.constantize # dont have to worry about order. end end |
.help_list(all = false) ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/jets/commands/base.rb', line 105 def help_list(all=false) # hack to show hidden comands when requested Thor::HiddenCommand.class_eval do def hidden?; false; end end if all list = [] eager_load! subclasses.each do |klass| commands = klass.printable_commands(true, false) commands.reject! { |array| array[0].include?(':help') } list += commands end list.sort_by! { |array| array[0] } end |
.inherited(base) ⇒ Object
46 47 48 49 50 51 52 |
# File 'lib/jets/commands/base.rb', line 46 def inherited(base) super if base.name self.subclasses << base end end |
.klass_from_namespace(namespace) ⇒ Object
122 123 124 125 126 127 128 129 130 131 |
# File 'lib/jets/commands/base.rb', line 122 def klass_from_namespace(namespace) if namespace.nil? Jets::Commands::Main else class_name = namespace.gsub(':','/') class_name = "Jets::Commands::#{class_name.classify}" class_name = special_class_map(class_name) class_name.constantize end end |
.namespace_from_class(klass) ⇒ Object
100 101 102 103 |
# File 'lib/jets/commands/base.rb', line 100 def namespace_from_class(klass) namespace = klass.to_s.sub('Jets::Commands::', '').underscore.gsub('/',':') namespace unless namespace == "main" end |
.namespaced_commands ⇒ Object
Fully qualifed task names. Examples:
build
process:controller
dynamodb:migrate:down
79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/jets/commands/base.rb', line 79 def namespaced_commands eager_load! subclasses.map do |klass| # This all_tasks is part of Thor not the lambda/dsl.rb klass.all_tasks.keys.map do |task_name| klass = klass.to_s.sub('Jets::Commands::','') namespace = klass =~ /^Main/ ? nil : klass.underscore.gsub('/',':') [namespace, task_name].compact.join(':') end end.flatten.sort end |
.perform(full_command, thor_args) ⇒ Object
thor_args is an array of commands. Examples:
["help"]
["dynamodb:migrate"]
Same signature as RakeCommand.perform. Not using full_command.
25 26 27 28 |
# File 'lib/jets/commands/base.rb', line 25 def perform(full_command, thor_args) config = {} # doesnt seem like config is used dispatch(nil, thor_args, nil, config) end |
.special_class_map(class_name) ⇒ Object
133 134 135 136 137 138 139 |
# File 'lib/jets/commands/base.rb', line 133 def special_class_map(class_name) map = { 'Jets::Commands::RakeTask' => 'Jets::Commands::RakeTasks', 'Jets::Commands::Gem' => 'Jets::Commands::Gems', } map[class_name] || class_name end |
.subclasses ⇒ Object
Track all command subclasses.
42 43 44 |
# File 'lib/jets/commands/base.rb', line 42 def subclasses @subclasses ||= [] end |