class AppMap::Swagger::RakeTask

Constants

DEFAULT_APPMAP_DIR
DEFAULT_OUTPUT_DIR
DEFAULT_SWAGGERGEN

Attributes

appmap_dir[RW]
name[RW]
output_dir[RW]
project_name[RW]
project_version[RW]
swaggergen[RW]

Public Class Methods

new(*args, &task_block) click to toggle source
# File lib/appmap/swagger/rake_task.rb, line 17
def initialize(*args, &task_block)
  @name            = args.shift || :swagger
  @swaggergen      = DEFAULT_SWAGGERGEN
  @appmap_dir      = DEFAULT_APPMAP_DIR
  @output_dir      = DEFAULT_OUTPUT_DIR

  # https://www.rubydoc.info/docs/rails/Module#module_parent_name-instance_method
  module_parent_name = ->(cls) { cls.name =~ /::[^:]+\Z/ ? $`.freeze : nil }
  
  @project_name    = \
    if defined?(::Rails)
      [ module_parent_name.(::Rails.application.class).humanize.titleize, 'API' ].join(' ')
    else
      'MyProject API'
    end
  @project_version = 'v1.0'


  define(args, &task_block)
end

Public Instance Methods

run_task() click to toggle source
# File lib/appmap/swagger/rake_task.rb, line 42
def run_task
  FileUtils.mkdir_p output_dir

  do_fail = lambda do |msg|
    warn msg
    exit $?.exitstatus || 1
  end

  return do_fail.(%Q('node' not found; please install NodeJS)) unless system('node --version 2>&1 > /dev/null')
  return do_fail.(%Q('#{swaggergen}' not found; please install @appland/appmap-swagger from NPM)) unless File.exists?(swaggergen)

  warn swagger_command.join(' ') if verbose

  swagger_raw = `#{swagger_command.join(' ')}`.strip
  return do_fail.(%Q(Swagger generation failed: #{swagger_raw})) if $?.exitstatus != 0

  gen_swagger = YAML.load(swagger_raw)
  gen_swagger_full = AppMap::Swagger::MarkdownDescriptions.new(gen_swagger).perform
  gen_swagger_stable = AppMap::Swagger::Stable.new(gen_swagger).perform

  swagger = swagger_template.merge(gen_swagger_full)
  File.write File.join(output_dir, 'openapi.yaml'), YAML.dump(swagger)

  swagger = swagger_template.merge(gen_swagger_stable)
  File.write File.join(output_dir, 'openapi_stable.yaml'), YAML.dump(swagger)
end
swagger_command() click to toggle source
# File lib/appmap/swagger/rake_task.rb, line 85
def swagger_command
  [ 'node', swaggergen, 'generate', '--directory', appmap_dir ]
end
swagger_template() click to toggle source
# File lib/appmap/swagger/rake_task.rb, line 69
      def swagger_template
        YAML.load <<~TEMPLATE
        openapi: 3.0.1
        info:
          title: #{project_name}
          version: #{project_version}
        paths:
        components:
        servers:
        - url: http://{defaultHost}
          variables:
            defaultHost:
              default: localhost:3000
        TEMPLATE
      end
verbose() click to toggle source
# File lib/appmap/swagger/rake_task.rb, line 38
def verbose
  Rake.verbose == true
end

Private Instance Methods

define(args, &task_block) click to toggle source

This bit of black magic - github.com/rspec/rspec-core/blob/main/lib/rspec/core/rake_task.rb#L110

# File lib/appmap/swagger/rake_task.rb, line 92
def define(args, &task_block)
  desc "Generate Swagger from AppMaps" unless ::Rake.application.last_description

  task(name, *args) do |_, task_args|
    RakeFileUtils.__send__(:verbose, Rake.verbose == true) do
      task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block
      run_task
    end
  end
end