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



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

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”


150
151
152
# File 'lib/jets/cli.rb', line 150

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

#jets_project?Boolean

Returns:

  • (Boolean)


145
146
147
# File 'lib/jets/cli.rb', line 145

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



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

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?
  rake_task_found = Jets::Commands::RakeCommand.namespaced_commands.include?(full_command)
  if rake_task_found
    return Jets::Commands::RakeCommand
  end
end

#main_helpObject



164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/jets/cli.rb', line 164

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



194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/jets/cli.rb', line 194

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



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

def meth
  return nil unless full_command

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

#namespaceObject



154
155
156
157
158
159
160
161
162
# File 'lib/jets/cli.rb', line 154

def namespace
  return nil unless full_command

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

#rake_listObject



182
183
184
185
186
187
188
# File 'lib/jets/cli.rb', line 182

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

#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
# 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].include?(command)
  env = nil if env&.starts_with?('-')
  return unless env
  ENV['JETS_ENV'] = env ? env : 'development'
end

#show_all_tasksObject



190
191
192
# File 'lib/jets/cli.rb', line 190

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



76
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
# File 'lib/jets/cli.rb', line 76

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



178
179
180
# File 'lib/jets/cli.rb', line 178

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