rawongithub/grapethor

View on GitHub
lib/grapethor/generators/api.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'thor/group'
require 'yaml'

module Grapethor
  class Api < Thor::Group
    include Thor::Actions
    include Grapethor::Utils

    attr_reader :api_version,
                :app_path

    namespace :api

    def self.exit_on_failure?
      true
    end

    def self.source_root
      File.join(__dir__, '..')
    end


    argument :version, type: :string,
                       desc: 'API version'

    class_option :path,  aliases: '-p',
                         type: :string,
                         default: '.',
                         desc: 'Relative path to application directory'


    def parse_args_and_opts
      @api_version = version.downcase
      @app_path    = options[:path]
    end


    def validate_target_app
      unless app_dir_exists?
        alert <<~MSG
                Directory '#{app_path}' does not seem to be generated by Grapethor or root application directory.\n
                Please 'cd' into application root diretory or use '--path' option.
              MSG
        exit
      end
    end


    def create_api
      report("Creating new API...") do
        directory 'templates/api', app_path
        directory "templates/api_#{app_test_framework}", app_path
        insert_into_file "#{app_path}/api/base.rb",
                         "\s\s\s\smount API#{api_version}::Base\n",
                         :before => "\s\s\s\s# mount API<VERSION>::Base\n"
      end
    end


    private

    def app_dir_exists?
      File.exist?("#{app_path}/api/base.rb")
    end

    def app_name
      @app_name ||= config_filename(app_path)['app_name']
    end

    def app_prefix
      @app_prefix ||= config_filename(app_path)['app_prefix']
    end

    def app_swagger?
      @app_swagger ||= config_filename(app_path)['app_swagger']
    end

    def app_test_framework
      @app_test_framework ||= config_filename(@app_path)['app_test_framework']
    end

  end
end