Class: Jets::CLI

Inherits:
Object
  • Object
show all
Defined in:
lib/jets/cli.rb

Constant Summary collapse

ALIASES =
{
  "g"  => "generate",
  "c"  => "console",
  "s"  => "server",
  "db" => "dbconsole",
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(given_args = ARGV, **config) ⇒ CLI

Returns a new instance of CLI.



12
13
14
15
# File 'lib/jets/cli.rb', line 12

def initialize(given_args=ARGV, **config)
  @given_args = given_args.dup
  @config = config
end

Class Method Details

.start(given_args = ARGV) ⇒ Object



4
5
6
# File 'lib/jets/cli.rb', line 4

def self.start(given_args=ARGV)
  new(given_args).start
end

.thor_tasksObject



8
9
10
# File 'lib/jets/cli.rb', line 8

def self.thor_tasks
  Jets::Commands::Base.namespaced_commands
end

Instance Method Details

#boot_jetsObject

The commands new and help do not call Jets.boot. Main reason is that Jets.boot should be run in a Jets project.

* jets new - need to generate a project outside a project folder.
* jets help - don't need to be in a project folder general help.

When you are inside a project folder though, more help commands are available and displayed.



41
42
43
44
45
46
47
48
# File 'lib/jets/cli.rb', line 41

def boot_jets
  set_jets_env_from_cli_arg!
  command = thor_args.first
  unless %w[new help].include?(command)
    Jets::Turbo.new.charge # handles Afterburner mode
    Jets.boot
  end
end

#full_commandObject



121
122
123
124
125
126
127
128
# File 'lib/jets/cli.rb', line 121

def full_command
  # Removes any args that starts with -, those are option args.
  # Also remove "help" flag.
  args = @given_args.reject {|o| o =~ /^-/ } - help_flags
  command = args[0] # first argument should always be the command
  command = ALIASES[command] || command
  Jets::Commands::Base.autocomplete(command)
end

#help_flagsObject

“-h”, “-?”, “–help”, “-D”, “help”


157
158
159
# File 'lib/jets/cli.rb', line 157

def help_flags
  Thor::HELP_MAPPINGS + ["help"]
end

#jets_project?Boolean

Returns:

  • (Boolean)


152
153
154
# File 'lib/jets/cli.rb', line 152

def jets_project?
  File.exist?("config/application.rb")
end

#lookup(full_command) ⇒ Object

  1. look up Thor tasks

  2. look up Rake tasks

  3. help menu with all commands when both Thor and Rake tasks are not found



133
134
135
136
137
138
139
140
141
142
# File 'lib/jets/cli.rb', line 133

def lookup(full_command)
  thor_task_found = Jets::Commands::Base.namespaced_commands.include?(full_command)
  if thor_task_found
    return Jets::Commands::Base.klass_from_namespace(namespace)
  end

  return unless jets_project?

  Jets::Commands::RakeCommand if rake_task_found
end

#main_helpObject



171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/jets/cli.rb', line 171

def main_help
  shell = Thor::Shell::Basic.new
  shell.say "Commands:"
  shell.print_table(thor_list, :indent => 2, :truncate => true)

  if jets_project? && !rake_list.empty?
    shell.say "\nCommands via rake:"
    shell.print_table(rake_list, :indent => 2, :truncate => true)
  end

  shell.say "\n"
  shell.say main_help_body
end

#main_help_bodyObject



201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/jets/cli.rb', line 201

def main_help_body
  <<-EOL
Add -h to any of the commands for more help.  Examples:

jets call -h
jets routes -h
jets deploy -h
jets status -h
jets dynamodb:create -h
jets db:create -h

EOL
end

#methObject



105
106
107
108
109
110
111
112
113
# File 'lib/jets/cli.rb', line 105

def meth
  return nil unless full_command

  if full_command.include?(':')
    full_command.split(':').pop
  else
    full_command
  end
end

#namespaceObject



161
162
163
164
165
166
167
168
169
# File 'lib/jets/cli.rb', line 161

def namespace
  return nil unless full_command

  if full_command.include?(':')
    words = full_command.split(':')
    words.pop
    words.join(':')
  end
end

#rake_listObject



189
190
191
192
193
194
195
# File 'lib/jets/cli.rb', line 189

def rake_list
  list = Jets::Commands::RakeCommand.formatted_rake_tasks(show_all_tasks)
  list.map do |array|
    array[0] = "jets #{array[0]}"
    array
  end
end

#rake_task_foundObject



144
145
146
147
148
149
150
# File 'lib/jets/cli.rb', line 144

def rake_task_found
  return false unless full_command # can be nil for subcommands and would break jets help without this check
  bracket_regex = /\[.*/ # matches everything after the first [
  command = full_command.sub(bracket_regex, '') # remove everything after the first [
  namespaced_commands = Jets::Commands::RakeCommand.namespaced_commands.map {|x| x.sub(bracket_regex, '') }
  namespaced_commands.include?(command)
end

#set_jets_env_from_cli_arg!Object

Adjust JETS_ENV before boot_jets is called for the ‘jets deploy` command. Must do this early in the process before Jets.boot because because `bundler_require` is called as part of the bootup process. It sets the Jets.env to whatever the JETS_ENV is at the time to require the right bundler group.

Defaults to development when not set.



62
63
64
65
66
67
68
69
70
71
# File 'lib/jets/cli.rb', line 62

def set_jets_env_from_cli_arg!
  # Pretty tricky, we need to use the raw @given_args as thor_args eventually calls Commands::Base#eager_load!
  # which uses Jets.env before we get a chance to override ENV['JETS_ENV']
  command, env = @given_args[0..1]

  return unless %w[deploy delete console c].include?(command)
  env = nil if env&.starts_with?('-')
  return unless env
  ENV['JETS_ENV'] = env ? env : 'development'
end

#show_all_tasksObject



197
198
199
# File 'lib/jets/cli.rb', line 197

def show_all_tasks
  @given_args.include?("--all") || @given_args.include?("-A")
end

#startObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/jets/cli.rb', line 17

def start
  # Needs to be at the beginning to avoid boot_jets which causes some load errors
  if version_requested?
    puts Jets.version
    return
  end

  # Need to boot jets at this point for commands like: jets routes, deploy, console, etc to work
  boot_jets
  command_class = lookup(full_command)
  if command_class
    command_class.perform(full_command, thor_args)
  else
    main_help
  end
end

#thor_argsObject

thor_args normalized the args Array to work with our Thor command subclasses.

  1. The namespace is stripe

  2. Help is shifted in front if a help flag is detected



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/jets/cli.rb', line 77

def thor_args
  args = @given_args.clone

  # jets generate is a special command requires doesn't puts out the help menu automatically when
  # `jets generate` is called without additional args.  We'll take it over early and fix it here.
  generate = full_command == "generate"

  if generate && ((args.size == 1 || help_flags.include?(args.last)) || args.size == 2)
    puts Jets::Generator.help
    exit
  end

  help_args = args & help_flags
  unless help_args.empty?
    # Allow using help flags at the end of the command to trigger help menu
    args -= help_flags # remove "help" and help flags from args
    args[0] = meth # first command will always be the meth now since
      # we removed the help flags
    args.unshift("help")
    args.compact!
    return args
  end

  # reassigns the command without the namespace if reached here
  args[0] = meth
  args.compact
end

#thor_listObject



185
186
187
# File 'lib/jets/cli.rb', line 185

def thor_list
  Jets::Commands::Base.help_list(show_all_tasks)
end

#version_requested?Boolean

Returns:

  • (Boolean)


50
51
52
53
54
55
# File 'lib/jets/cli.rb', line 50

def version_requested?
  #   jets --version
  #   jets -v
  version_flags = ["--version", "-v"]
  @given_args.length == 1 && !(@given_args & version_flags).empty?
end