ergoserv/auxiliary_rails

View on GitHub
lib/generators/auxiliary_rails/api_resource_generator.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'rails'

module AuxiliaryRails
  class ApiResourceGenerator < ::Rails::Generators::NamedBase
    desc 'Stubs out a new API resource including an empty entity and spec.'

    class_option :api_module,
      type: :string,
      default: 'app',
      desc: 'API module name'
    class_option :api_version,
      type: :numeric,
      default: 1,
      desc: 'API version'
    class_option :skip_helper,
      type: :boolean,
      default: true,
      desc: 'Indicates if helper generation needs to be skipped'
    source_root File.expand_path('templates/apis', __dir__)

    def create_api_resource_file
      template 'api_resource_template.rb.erb',
        "app/#{api_module_path}/resources/#{plural_file_name}_resource.rb"
    end

    def create_api_entity_file
      template 'api_entity_template.rb.erb',
        "app/#{api_module_path}/entities/#{file_name}_entity.rb"
    end

    def create_api_helper_file
      return if options[:skip_helper]

      template 'api_helper_template.rb.erb',
        "app/#{api_module_path}/helpers/#{plural_file_name}_api_helper.rb"
    end

    def create_api_resource_spec_file
      template 'api_resource_spec_template.rb.erb',
        "spec/#{api_module_path}/resources/#{plural_file_name}_resource_spec.rb"
    end

    def say_instructions
      say "Mount resource in #{api_module_name}:"
      say "    mount #{resource_class_name}"
    end

    private

    def api_module_name
      "#{options[:api_module].camelize}V#{options[:api_version]}API"
    end

    def api_module_path
      "apis/#{options[:api_module]}_v#{options[:api_version]}_api"
    end

    def api_url_path
      api_name = 'api'
      api_name += "-#{options[:api_module]}" if options[:api_module] != 'app'
      "/#{api_name}/v#{options[:api_version]}/#{plural_name}"
    end

    def entity_class_name
      "#{api_module_name}::Entities::#{class_name}Entity"
    end

    def resource_class_name
      "#{api_module_name}::Resources::#{plural_name.camelize}Resource"
    end
  end
end