Class: Jets::Commands::Base
Direct Known Subclasses
Class Method Summary collapse
-
.autocomplete(full_command) ⇒ Object
If this fails to match then it’l just 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.
-
.subclasses ⇒ Object
Track all command subclasses.
Class Method Details
.autocomplete(full_command) ⇒ Object
If this fails to match then it’l just return the original full command
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/jets/commands/base.rb', line 129 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.
88 89 90 91 92 93 94 |
# File 'lib/jets/commands/base.rb', line 88 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)
32 33 34 35 36 37 |
# File 'lib/jets/commands/base.rb', line 32 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.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/jets/commands/base.rb', line 55 def eager_load! path = File.("../../", __FILE__) Dir.glob("#{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.sub!(/Task$/, "Tasks") # special rule here for Tasks class # 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['DEBUG'] class_name.constantize # dont have to worry about order. end end |
.help_list(all = false) ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/jets/commands/base.rb', line 101 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
44 45 46 47 48 49 50 |
# File 'lib/jets/commands/base.rb', line 44 def inherited(base) super if base.name self.subclasses << base end end |
.klass_from_namespace(namespace) ⇒ Object
118 119 120 121 122 123 124 125 126 |
# File 'lib/jets/commands/base.rb', line 118 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.constantize end end |
.namespace_from_class(klass) ⇒ Object
96 97 98 99 |
# File 'lib/jets/commands/base.rb', line 96 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
76 77 78 79 80 81 82 83 84 85 |
# File 'lib/jets/commands/base.rb', line 76 def namespaced_commands eager_load! subclasses.map do |klass| 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.
23 24 25 26 |
# File 'lib/jets/commands/base.rb', line 23 def perform(full_command, thor_args) config = {} # doesnt seem like config is used dispatch(nil, thor_args, nil, config) end |
.subclasses ⇒ Object
Track all command subclasses.
40 41 42 |
# File 'lib/jets/commands/base.rb', line 40 def subclasses @subclasses ||= [] end |