From 947f3f2f277191fdad04b22782665c39bb2c9784 Mon Sep 17 00:00:00 2001 From: James Conant Date: Sun, 23 Jun 2019 23:00:37 -0400 Subject: [PATCH] Add scaffold generator * scaffolds: models, resources, controllers, routes * change resource templates to .erb for better syntax highlighting support resolves: https://github.com/cerebris/jsonapi-resources/issues/1265 --- .gitignore | 3 + lib/generators/jsonapi/USAGE | 28 ++++ .../jsonapi/controller_generator.rb | 2 +- lib/generators/jsonapi/scaffold_generator.rb | 120 ++++++++++++++++++ .../templates/application_controller.erb | 2 + .../jsonapi/templates/application_record.erb | 3 + .../templates/application_resource.erb | 2 + .../jsonapi/templates/controller.erb | 4 + ...i_controller.rb => jsonapi_controller.erb} | 0 ...onapi_resource.rb => jsonapi_resource.erb} | 0 lib/generators/jsonapi/templates/model.erb | 4 + lib/generators/jsonapi/templates/resource.erb | 5 + lib/generators/jsonapi/templates/route.erb | 1 + 13 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 lib/generators/jsonapi/scaffold_generator.rb create mode 100644 lib/generators/jsonapi/templates/application_controller.erb create mode 100644 lib/generators/jsonapi/templates/application_record.erb create mode 100644 lib/generators/jsonapi/templates/application_resource.erb create mode 100644 lib/generators/jsonapi/templates/controller.erb rename lib/generators/jsonapi/templates/{jsonapi_controller.rb => jsonapi_controller.erb} (100%) rename lib/generators/jsonapi/templates/{jsonapi_resource.rb => jsonapi_resource.erb} (100%) create mode 100644 lib/generators/jsonapi/templates/model.erb create mode 100644 lib/generators/jsonapi/templates/resource.erb create mode 100644 lib/generators/jsonapi/templates/route.erb diff --git a/.gitignore b/.gitignore index 6cc125d63..5afb105ed 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ .config .yardoc .ruby-version +.tool-versions +.idea Gemfile.lock InstalledFiles _yardoc @@ -21,3 +23,4 @@ coverage test/log test_db test_db-journal +vendor \ No newline at end of file diff --git a/lib/generators/jsonapi/USAGE b/lib/generators/jsonapi/USAGE index 4cebf40e6..65f738353 100644 --- a/lib/generators/jsonapi/USAGE +++ b/lib/generators/jsonapi/USAGE @@ -11,3 +11,31 @@ Examples: This will create: app/controllers/posts_controller.rb + + rails generate jsonapi:scaffold PoolParty + + This will create: + app/models/pool_party.rb + app/resources/application_resource.rb + app/resources/pool_party_resource.rb + app/controller/pool_parties_controller.rb + app/config/routes/pool_parties.rb + + This will modify: + app/controller/application_controller.rb + config/routes.rb + + rails generate jsonapi:scaffold Api::V1::PoolParty + + This will create: + app/models/api/v1/application_record.rb + app/models/api/v1/pool_party.rb + app/resources/api/v1/application_resource.rb + app/resources/api/v1/pool_party_resource.rb + app/controller/api/v1/application_controller.rb + app/controller/api/v1/pool_parties_controller.rb + app/config/routes/api/v1/pool_parties.rb + + This will modify: + app/controller/application_controller.rb + config/routes.rb diff --git a/lib/generators/jsonapi/controller_generator.rb b/lib/generators/jsonapi/controller_generator.rb index 41ee4eb1e..ecc139e7c 100644 --- a/lib/generators/jsonapi/controller_generator.rb +++ b/lib/generators/jsonapi/controller_generator.rb @@ -2,7 +2,7 @@ module Jsonapi class ControllerGenerator < Rails::Generators::NamedBase source_root File.expand_path('../templates', __FILE__) - def create_resource + def create_controller template_file = File.join( 'app/controllers', class_path, diff --git a/lib/generators/jsonapi/scaffold_generator.rb b/lib/generators/jsonapi/scaffold_generator.rb new file mode 100644 index 000000000..8619539c8 --- /dev/null +++ b/lib/generators/jsonapi/scaffold_generator.rb @@ -0,0 +1,120 @@ +module Jsonapi + class ScaffoldGenerator < Rails::Generators::NamedBase + source_root File.expand_path('templates', __dir__) + + def copy_application_record_file + if namespace_path.present? + @application_record_class = application_record_class + path = namespaced_file_path(models_path, 'application_record.rb') + template 'application_record.erb', path + end + end + + def copy_model_file + @application_record_class = application_record_class + @class_name = full_namespace_class(file_name.camelize) + path = namespaced_file_path(models_path, file_name + '.rb') + template 'model.erb', path + end + + def copy_application_resource_file + @application_resource_class = application_resource_class + path = namespaced_file_path(resources_path, 'application_resource.rb') + template 'application_resource.erb', path + end + + def copy_resource_file + @application_resource_class = application_resource_class + @class_name = full_namespace_class(file_name.camelize + 'Resource') + path = namespaced_file_path(resources_path, file_name + '_resource.rb') + template 'resource.erb', path + end + + def copy_application_controller_file + path = namespaced_file_path(controllers_path, 'application_controller.rb') + @application_controller_class = application_controller_class + + if namespace_path.present? + template 'application_controller.erb', path + end + + inject_into_class(path, 'ApplicationController', 'include JSONAPI::ActsAsResourceController') + end + + def copy_controller_file + @application_controller_class = application_controller_class + @class_name = full_namespace_class(file_name.camelize.pluralize + 'Controller') + path = namespaced_file_path(controllers_path, file_name.pluralize + '_controller.rb') + template 'controller.erb', path + end + + def copy_route_file + dynamic_routes_method = <<~ROUTE + def draw_resource_route(route_name) + instance_eval(File.read(Rails.root.join("config/routes/\#{route_name}.rb"))) + end\n + ROUTE + + prepend_to_file 'config/routes.rb', dynamic_routes_method + + @route_content = recursive_routes(class_path.dup) + + route "draw_resource_route '#{file_path.pluralize}'" + + template "route.erb", namespaced_file_path('config/routes/', file_name.pluralize + '.rb') + end + + private + + def models_path + 'app/models/' + end + + def resources_path + 'app/resources/' + end + + def controllers_path + 'app/controllers/' + end + + def namespace_path + class_path.map { |cp| cp + '/' }.join + end + + def namespaced_file_path(prefix, file) + prefix + namespace_path + file + end + + def namespace_class + class_path.map(&:camelize).map { |cp| cp + '::' }.join + end + + def full_namespace_class(class_suffix) + namespace_class + class_suffix + end + + def application_record_class + full_namespace_class('ApplicationRecord') + end + + def application_resource_class + full_namespace_class('ApplicationResource') + end + + def application_controller_class + full_namespace_class('ApplicationController') + end + + def recursive_routes(path_elements, tab_count = 1) + if path_elements.count == 0 + "jsonapi_resources :#{plural_name}" + else + namespace = path_elements.shift + start_tabs = "\t" * tab_count + end_tabs = "\t" * (tab_count - 1) + "namespace :#{namespace} do\n#{start_tabs}#{recursive_routes(path_elements, tab_count + 1)}\n#{end_tabs}end" + end + end + end +end diff --git a/lib/generators/jsonapi/templates/application_controller.erb b/lib/generators/jsonapi/templates/application_controller.erb new file mode 100644 index 000000000..27e816f84 --- /dev/null +++ b/lib/generators/jsonapi/templates/application_controller.erb @@ -0,0 +1,2 @@ +class <%= @application_controller_class %> < ApplicationController +end diff --git a/lib/generators/jsonapi/templates/application_record.erb b/lib/generators/jsonapi/templates/application_record.erb new file mode 100644 index 000000000..1e978c3f4 --- /dev/null +++ b/lib/generators/jsonapi/templates/application_record.erb @@ -0,0 +1,3 @@ +class <%= @application_record_class %> < ApplicationRecord + self.abstract_class = true +end diff --git a/lib/generators/jsonapi/templates/application_resource.erb b/lib/generators/jsonapi/templates/application_resource.erb new file mode 100644 index 000000000..3be31af67 --- /dev/null +++ b/lib/generators/jsonapi/templates/application_resource.erb @@ -0,0 +1,2 @@ +class <%= @application_resource_class %> < JSONAPI::Resource +end diff --git a/lib/generators/jsonapi/templates/controller.erb b/lib/generators/jsonapi/templates/controller.erb new file mode 100644 index 000000000..c31cc1113 --- /dev/null +++ b/lib/generators/jsonapi/templates/controller.erb @@ -0,0 +1,4 @@ +<% module_namespacing do -%> +class <%= class_name.pluralize %>Controller < <%= @application_controller_class %> +end +<% end -%> diff --git a/lib/generators/jsonapi/templates/jsonapi_controller.rb b/lib/generators/jsonapi/templates/jsonapi_controller.erb similarity index 100% rename from lib/generators/jsonapi/templates/jsonapi_controller.rb rename to lib/generators/jsonapi/templates/jsonapi_controller.erb diff --git a/lib/generators/jsonapi/templates/jsonapi_resource.rb b/lib/generators/jsonapi/templates/jsonapi_resource.erb similarity index 100% rename from lib/generators/jsonapi/templates/jsonapi_resource.rb rename to lib/generators/jsonapi/templates/jsonapi_resource.erb diff --git a/lib/generators/jsonapi/templates/model.erb b/lib/generators/jsonapi/templates/model.erb new file mode 100644 index 000000000..423eb0ee4 --- /dev/null +++ b/lib/generators/jsonapi/templates/model.erb @@ -0,0 +1,4 @@ +<% module_namespacing do -%> +class <%= class_name %> < <%= @application_record_class %> +end +<% end -%> diff --git a/lib/generators/jsonapi/templates/resource.erb b/lib/generators/jsonapi/templates/resource.erb new file mode 100644 index 000000000..ea82ed9b7 --- /dev/null +++ b/lib/generators/jsonapi/templates/resource.erb @@ -0,0 +1,5 @@ +<% module_namespacing do -%> +class <%= class_name %>Resource < <%= @application_resource_class %> + model_name self.to_s.gsub('Resource', '') +end +<% end -%> diff --git a/lib/generators/jsonapi/templates/route.erb b/lib/generators/jsonapi/templates/route.erb new file mode 100644 index 000000000..559ed308c --- /dev/null +++ b/lib/generators/jsonapi/templates/route.erb @@ -0,0 +1 @@ +<%= @route_content %>