Skip to content

Commit

Permalink
Review fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
zzaakiirr committed Aug 1, 2024
1 parent 0c4d2a6 commit ab93ec4
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 34 deletions.
4 changes: 2 additions & 2 deletions docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -444,9 +444,9 @@ cpflow run -a $APP_NAME --entrypoint /app/alternative-entrypoint.sh -- rails db:
cpflow setup-app -a $APP_NAME
```
### `generate`
### `terraform generate`
Generates terraform configuration files based on `controlplane.yml` and `templates/` config
- Generates terraform configuration files based on `controlplane.yml` and `templates/` config
```sh
cpflow terraform generate
Expand Down
3 changes: 2 additions & 1 deletion lib/command/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ class Base # rubocop:disable Metrics/ClassLength
VALIDATIONS_WITH_ADDITIONAL_OPTIONS = %w[templates].freeze
ALL_VALIDATIONS = VALIDATIONS_WITHOUT_ADDITIONAL_OPTIONS + VALIDATIONS_WITH_ADDITIONAL_OPTIONS

# Used to call the command (`cpflow SUBCOMMAND_NAME NAME`)
SUBCOMMAND_NAME = nil
# Used to call the command (`cpflow NAME`)
# NAME = ""
# Displayed when running `cpflow help` or `cpflow help NAME` (defaults to `NAME`)
Expand All @@ -38,7 +40,6 @@ class Base # rubocop:disable Metrics/ClassLength
WITH_INFO_HEADER = true
# Which validations to run before the command
VALIDATIONS = %w[config].freeze
SUBCOMMAND = nil

def initialize(config)
@config = config
Expand Down
11 changes: 3 additions & 8 deletions lib/command/terraform/generate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,13 @@

module Command
module Terraform
class Generate < ::Command::Base
SUBCOMMAND = "terraform"
class Generate < Base
SUBCOMMAND_NAME = "terraform"
NAME = "generate"
DESCRIPTION = "Generates terraform configuration files"
LONG_DESCRIPTION = <<~DESC
Generates terraform configuration files based on `controlplane.yml` and `templates/` config
- Generates terraform configuration files based on `controlplane.yml` and `templates/` config
DESC
EXAMPLES = <<~EX
```sh
cpflow terraform generate
```
EX
WITH_INFO_HEADER = false
VALIDATIONS = [].freeze

Expand Down
21 changes: 13 additions & 8 deletions lib/cpflow.rb
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,19 @@ def self.fix_help_option
matches = help_mappings & ARGV

# Help option works correctly for subcommands
return if matches && (ARGV & subcommand_names).any?
return if matches && subcommand?

matches.each do |match|
ARGV.delete(match)
ARGV.unshift(match)
end
end

def self.subcommand?
(subcommand_names & ARGV).any?
end
private_class_method :subcommand?

# Needed to silence deprecation warning
def self.exit_on_failure?
true
Expand Down Expand Up @@ -154,7 +159,7 @@ def self.all_base_commands
end

def self.subcommand_names
::Command::Base.all_commands.values.map { |command| command::SUBCOMMAND }.compact
Dir["#{__dir__}/command/*"].filter_map { |name| File.basename(name) if File.directory?(name) }
end

def self.process_option_params(params)
Expand All @@ -165,13 +170,13 @@ def self.process_option_params(params)
params
end

def self.klass_for(subcommand)
klass_name = subcommand.to_s.split("-").collect(&:capitalize).join
def self.klass_for(subcommand_name)
klass_name = subcommand_name.to_s.split("-").map(&:capitalize).join
return Cpflow.const_get(klass_name) if Cpflow.const_defined?(klass_name)

Cpflow.const_set(klass_name, Class.new(BaseSubCommand)).tap do |subcommand_klass|
desc subcommand, "#{subcommand.capitalize} commands"
subcommand subcommand, subcommand_klass
desc(subcommand_name, "#{subcommand_name.capitalize} commands")
subcommand(subcommand_name, subcommand_klass)
end
end
private_class_method :klass_for
Expand All @@ -188,6 +193,7 @@ def self.klass_for(subcommand)
deprecated = deprecated_commands[command_key]

name = command_class::NAME
subcommand_name = command_class::SUBCOMMAND_NAME
name_for_method = deprecated ? command_key : name.tr("-", "_")
usage = command_class::USAGE.empty? ? name : command_class::USAGE
requires_args = command_class::REQUIRES_ARGS
Expand All @@ -200,7 +206,6 @@ def self.klass_for(subcommand)
hide = command_class::HIDE || deprecated
with_info_header = command_class::WITH_INFO_HEADER
validations = command_class::VALIDATIONS
subcommand = command_class::SUBCOMMAND

long_description += "\n#{examples}" if examples.length.positive?

Expand All @@ -214,7 +219,7 @@ def self.klass_for(subcommand)

@commands_with_extra_options.push(name_for_method.to_sym) if accepts_extra_options

klass = subcommand ? klass_for(subcommand) : self
klass = subcommand_name ? klass_for(subcommand_name) : self

klass.class_eval do
desc(usage, description, hide: hide)
Expand Down
8 changes: 6 additions & 2 deletions script/update_command_docs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@ commands.keys.sort.each do |command_key|
next if command_class::HIDE

name = command_class::NAME
usage = command_class::USAGE.empty? ? name : command_class::USAGE
subcommand_name = command_class::SUBCOMMAND_NAME

full_command = [subcommand_name, name].compact.join(" ")

usage = command_class::USAGE.empty? ? full_command : command_class::USAGE
options = command_class::OPTIONS
long_description = command_class::LONG_DESCRIPTION
examples = command_class::EXAMPLES

command_str = "### `#{name}`\n\n"
command_str = "### `#{full_command}`\n\n"
command_str += "#{long_description.strip}\n\n"

if examples.empty?
Expand Down
11 changes: 7 additions & 4 deletions spec/cpflow_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,20 @@
end

it "handles subcommands correctly" do
result = run_cpflow_command("help")
result = run_cpflow_command("--help")

expect(result[:status]).to eq(0)

# Temporary solution, will be fixed with https://github.com/rails/thor/issues/742
basename = Cpflow::Cli.send(:basename)

Cpflow::Cli.subcommand_names.each do |subcommand|
expect(result[:stdout]).to include("#{package_name} #{subcommand}")
expect(result[:stdout]).to include("#{basename} #{subcommand}")

subcommand_result = run_cpflow_command(subcommand, "help")
subcommand_result = run_cpflow_command(subcommand, "--help")

expect(subcommand_result[:status]).to eq(0)
expect(subcommand_result[:stdout]).to include("#{package_name} #{subcommand} help [COMMAND]")
expect(subcommand_result[:stdout]).to include("#{basename} #{subcommand} help [COMMAND]")
end
end
end
9 changes: 0 additions & 9 deletions spec/support/command_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -157,9 +157,6 @@ def create_app_if_not_exists(app, deploy: false, image_before_deploy_count: 0, i
end

def run_cpflow_command(*args, raise_errors: false) # rubocop:disable Metrics/MethodLength
program_name_before = $PROGRAM_NAME
$PROGRAM_NAME = package_name

LogHelpers.write_command_to_log(args.join(" "))

result = {
Expand All @@ -185,8 +182,6 @@ def run_cpflow_command(*args, raise_errors: false) # rubocop:disable Metrics/Met
raise result.to_json if result[:status].nonzero? && raise_errors

result
ensure
$PROGRAM_NAME = program_name_before
end

def run_cpflow_command!(*args)
Expand Down Expand Up @@ -262,8 +257,4 @@ def spec_directory

File.dirname(current_directory)
end

def package_name
@package_name ||= Cpflow::Cli.instance_variable_get("@package_name")
end
end

0 comments on commit ab93ec4

Please sign in to comment.