From d83f99fc2ec97fcab3a0d50f751ae96ff32eae96 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Sat, 27 Jul 2019 18:21:44 +0200 Subject: [PATCH] DEV: improves rails plugin generator (#7949) Fixes bugs, simplifies code, more default files. General idea, more is more here as it's easier to just delete things than reading and passing all the options. --- lib/generators/plugin/plugin_generator.rb | 104 +++++++++++------- .../discourse/adapters/adapter.js.es6.erb | 7 ++ .../controllers/controller-index.js.es6.erb | 4 + .../controllers/controller-show.js.es6.erb | 4 + .../controllers/controller.js.es6.erb | 1 + .../discourse/models/model.js.es6.erb | 3 + .../discourse/routes/route-index.js.es6.erb | 11 ++ .../discourse/routes/route-show.js.es6.erb | 11 ++ .../discourse/routes/route.js.es6.erb | 7 ++ .../templates/template-index.hbs.erb | 1 + .../discourse/templates/template-show.hbs.erb | 1 + .../discourse/templates/template.hbs.erb | 3 + .../plugin/templates/controller.rb.erb | 15 +++ lib/generators/plugin/templates/engine.rb.erb | 12 ++ .../plugin/templates/javascript.es6.erb | 16 --- .../plugin/templates/javascript.js.es6.erb | 13 +++ lib/generators/plugin/templates/plugin.rb.erb | 46 ++------ .../plugin/templates/plugin_controller.rb.erb | 10 ++ .../plugin/templates/route-map.js.es6.erb | 7 ++ .../plugin/templates/route_constraint.rb.erb | 5 + lib/generators/plugin/templates/routes.rb.erb | 7 ++ 21 files changed, 193 insertions(+), 95 deletions(-) create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/adapters/adapter.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-index.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-show.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/models/model.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-index.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-show.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/routes/route.js.es6.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-index.hbs.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-show.hbs.erb create mode 100644 lib/generators/plugin/templates/assets/javascripts/discourse/templates/template.hbs.erb create mode 100644 lib/generators/plugin/templates/controller.rb.erb create mode 100644 lib/generators/plugin/templates/engine.rb.erb delete mode 100644 lib/generators/plugin/templates/javascript.es6.erb create mode 100644 lib/generators/plugin/templates/javascript.js.es6.erb create mode 100644 lib/generators/plugin/templates/plugin_controller.rb.erb create mode 100644 lib/generators/plugin/templates/route-map.js.es6.erb create mode 100644 lib/generators/plugin/templates/route_constraint.rb.erb create mode 100644 lib/generators/plugin/templates/routes.rb.erb diff --git a/lib/generators/plugin/plugin_generator.rb b/lib/generators/plugin/plugin_generator.rb index a1926abbcac..2064f61291f 100644 --- a/lib/generators/plugin/plugin_generator.rb +++ b/lib/generators/plugin/plugin_generator.rb @@ -3,75 +3,99 @@ require 'rails/generators/named_base' class PluginGenerator < Rails::Generators::NamedBase + attr_writer :about attr_writer :github_username desc 'This generator creates a Discourse plugin skeleton' source_root File.expand_path('templates', __dir__) - class_option :controller, type: :boolean, desc: "Generate controller", default: true - class_option :spec, type: :boolean, desc: "Generate spec", default: true - class_option :acceptance, type: :boolean, desc: "Generate acceptance test", default: true - class_option :stylesheet, type: :boolean, desc: "Generate Stylesheet", default: true - class_option :javascript, type: :boolean, desc: "Generate Javascript initializer", default: true - class_option :scheduled_job, type: :boolean, desc: "Generate scheduled job", default: false - class_option :help, type: :boolean, desc: "Adds help comments in generated files", default: true + class_option :no_license, type: :boolean, desc: "No license", default: false - def create_acceptance_file - return unless @options['acceptance'] + def create_plugin + @about ||= ask("What is the purpose of your plugin?") + @github_username ||= ask("Github username?") - template 'acceptance-test.js.es6.erb', File.join('plugins', dasherized_name, "test/javascripts/acceptance", "#{dasherized_name}-test.js.es6") + readme_file + routes_file + engine_file + plugin_file + controller_file + license_file + stylesheet_file + javascript_file + settings_file + locales_file end - def create_spec_file - return if !@options['spec'] || !@options['controller'] - + def controller_file + template 'plugin_controller.rb.erb', File.join('plugins', dasherized_name, "app/controllers/#{dasherized_name}/#{underscored_name}_controller.rb") + template 'controller.rb.erb', File.join('plugins', dasherized_name, "app/controllers/#{dasherized_name}/actions_controller.rb") template 'controller_spec.rb.erb', File.join('plugins', dasherized_name, "spec/requests/actions_controller_spec.rb") end - def create_scheduled_job_file - return unless @options['scheduled_job'] - - path = File.join('plugins', dasherized_name, 'jobs/scheduled', "check_#{underscored_name}.rb") - template 'scheduled_job.rb.erb', path - end - - def create_readme_file - ensure_github_username - + def readme_file template 'README.md.erb', File.join('plugins', dasherized_name, "README.md") end - def create_license_file - ensure_github_username + def license_file + return if @options['no_license'] template 'LICENSE.erb', File.join('plugins', dasherized_name, "LICENSE") end - def create_plugin_file - ensure_github_username + def engine_file + template 'engine.rb.erb', File.join('plugins', dasherized_name, "lib", dasherized_name, "engine.rb") + end + def routes_file + template 'routes.rb.erb', File.join('plugins', dasherized_name, "config", "routes.rb") + template 'route_constraint.rb.erb', File.join('plugins', dasherized_name, "lib", "#{underscored_name}_constraint.rb") + end + + def plugin_file template 'plugin.rb.erb', File.join('plugins', dasherized_name, "plugin.rb") end - def create_stylesheet_file - return unless @options['stylesheet'] - + def stylesheet_file template 'stylesheet.scss.erb', File.join('plugins', dasherized_name, 'assets/stylesheets/common', "#{dasherized_name}.scss") + template 'stylesheet.scss.erb', File.join('plugins', dasherized_name, 'assets/stylesheets/desktop', "#{dasherized_name}.scss") + template 'stylesheet.scss.erb', File.join('plugins', dasherized_name, 'assets/stylesheets/mobile', "#{dasherized_name}.scss") end - def create_javascript_file - return unless @options['javascript'] + def javascript_file + template 'acceptance-test.js.es6.erb', File.join('plugins', dasherized_name, "test/javascripts/acceptance", "#{dasherized_name}-test.js.es6") + template 'javascript.js.es6.erb', File.join('plugins', dasherized_name, 'assets/javascripts/initializers', "#{dasherized_name}.js.es6") + template 'route-map.js.es6.erb', File.join('plugins', dasherized_name, 'assets/javascripts/discourse', "#{dasherized_name}-route-map.js.es6") - template 'javascript.es6.erb', File.join('plugins', dasherized_name, 'assets/javascripts/initializers', "#{dasherized_name}.es6") + folder = 'assets/javascripts/discourse/templates' + template "#{folder}/template.hbs.erb", path(folder, "actions.hbs") + template "#{folder}/template-show.hbs.erb", path(folder, "actions-show.hbs") + template "#{folder}/template-index.hbs.erb", path(folder, "actions-index.hbs") + + folder = 'assets/javascripts/discourse/routes' + template "#{folder}/route.js.es6.erb", path(folder, "#{dasherized_name}-actions.js.es6") + template "#{folder}/route-show.js.es6.erb", path(folder, "#{dasherized_name}-actions-show.js.es6") + template "#{folder}/route-index.js.es6.erb", path(folder, "#{dasherized_name}-actions-index.js.es6") + + folder = 'assets/javascripts/discourse/controllers' + template "#{folder}/controller.js.es6.erb", path(folder, "actions.js.es6") + template "#{folder}/controller-show.js.es6.erb", path(folder, "actions-show.js.es6") + template "#{folder}/controller-index.js.es6.erb", path(folder, "actions-index.js.es6") + + folder = 'assets/javascripts/discourse/models' + template "#{folder}/model.js.es6.erb", path(folder, "action.js.es6") + + folder = 'assets/javascripts/discourse/adapters' + template "#{folder}/adapter.js.es6.erb", path(folder, "action.js.es6") end - def create_settings_file + def settings_file template 'settings.yml.erb', File.join('plugins', dasherized_name, 'config', 'settings.yml') end - def create_locales_file - template 'client.en.yml.erb', File.join('plugins', dasherized_name, 'config/locales', 'client.en.yml') + def locales_file + template 'client.en.yml.erb', path('config/locales/client.en.yml') template 'server.en.yml.erb', File.join('plugins', dasherized_name, 'config/locales', 'server.en.yml') end @@ -83,10 +107,6 @@ class PluginGenerator < Rails::Generators::NamedBase end end - def ensure_github_username - @github_username ||= ask("Github username?") - end - def underscored_name name.underscore end @@ -98,4 +118,8 @@ class PluginGenerator < Rails::Generators::NamedBase def classified_name name.tableize.classify end + + def path(*args) + File.join('plugins', dasherized_name, args) + end end diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/adapters/adapter.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/adapters/adapter.js.es6.erb new file mode 100644 index 00000000000..f952121c62d --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/adapters/adapter.js.es6.erb @@ -0,0 +1,7 @@ +import RestAdapter from "discourse/adapters/rest"; + +export default RestAdapter.extend({ + basePath() { + return "/<%= dasherized_name %>/"; + } +}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-index.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-index.js.es6.erb new file mode 100644 index 00000000000..044750a7ed6 --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-index.js.es6.erb @@ -0,0 +1,4 @@ +export default Ember.Controller.extend({ + actions: { + } +}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-show.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-show.js.es6.erb new file mode 100644 index 00000000000..044750a7ed6 --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller-show.js.es6.erb @@ -0,0 +1,4 @@ +export default Ember.Controller.extend({ + actions: { + } +}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller.js.es6.erb new file mode 100644 index 00000000000..2d3f9600e21 --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/controllers/controller.js.es6.erb @@ -0,0 +1 @@ +export default Ember.Controller.extend({}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/models/model.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/models/model.js.es6.erb new file mode 100644 index 00000000000..0c432d3f71d --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/models/model.js.es6.erb @@ -0,0 +1,3 @@ +import RestModel from "discourse/models/rest"; + +export default RestModel.extend({}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-index.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-index.js.es6.erb new file mode 100644 index 00000000000..998eff2a6f7 --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-index.js.es6.erb @@ -0,0 +1,11 @@ +export default Discourse.Route.extend({ + controllerName: "actions-index", + + model(params) { + return this.store.findAll("action"); + }, + + renderTemplate() { + this.render("actions-index"); + } +}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-show.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-show.js.es6.erb new file mode 100644 index 00000000000..74274ebe3aa --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route-show.js.es6.erb @@ -0,0 +1,11 @@ +export default Discourse.Route.extend({ + controllerName: "actions-show", + + model(params) { + return this.store.find("action", params.id); + }, + + renderTemplate() { + this.render("actions-show"); + } +}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route.js.es6.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route.js.es6.erb new file mode 100644 index 00000000000..be3f4f1241e --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/routes/route.js.es6.erb @@ -0,0 +1,7 @@ +export default Discourse.Route.extend({ + controllerName: "actions", + + renderTemplate() { + this.render("actions"); + } +}); diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-index.hbs.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-index.hbs.erb new file mode 100644 index 00000000000..2f9b14cc039 --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-index.hbs.erb @@ -0,0 +1 @@ +controller-index.hbs diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-show.hbs.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-show.hbs.erb new file mode 100644 index 00000000000..c15471b8b9f --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template-show.hbs.erb @@ -0,0 +1 @@ +controller-show.hbs id: {{model.id}} diff --git a/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template.hbs.erb b/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template.hbs.erb new file mode 100644 index 00000000000..ed4d67a9483 --- /dev/null +++ b/lib/generators/plugin/templates/assets/javascripts/discourse/templates/template.hbs.erb @@ -0,0 +1,3 @@ +controller.hbs + +{{outlet}} diff --git a/lib/generators/plugin/templates/controller.rb.erb b/lib/generators/plugin/templates/controller.rb.erb new file mode 100644 index 00000000000..2c88888a516 --- /dev/null +++ b/lib/generators/plugin/templates/controller.rb.erb @@ -0,0 +1,15 @@ +module <%= classified_name %> + class ActionsController < ::ApplicationController + requires_plugin <%= classified_name %> + + before_action :ensure_logged_in + + def index + render_json_dump({ actions: [] }) + end + + def show + render_json_dump({ action: { id: params[:id] } }) + end + end +end diff --git a/lib/generators/plugin/templates/engine.rb.erb b/lib/generators/plugin/templates/engine.rb.erb new file mode 100644 index 00000000000..449db3929f1 --- /dev/null +++ b/lib/generators/plugin/templates/engine.rb.erb @@ -0,0 +1,12 @@ +module <%= classified_name %> + class Engine < ::Rails::Engine + engine_name "<%= classified_name %>".freeze + isolate_namespace <%= classified_name %> + + config.after_initialize do + Discourse::Application.routes.append do + mount ::<%= classified_name %>::Engine, at: "/<%= dasherized_name %>" + end + end + end +end diff --git a/lib/generators/plugin/templates/javascript.es6.erb b/lib/generators/plugin/templates/javascript.es6.erb deleted file mode 100644 index 37fb2881c6b..00000000000 --- a/lib/generators/plugin/templates/javascript.es6.erb +++ /dev/null @@ -1,16 +0,0 @@ -import { withPluginApi } from "discourse/lib/plugin-api"; - -function initialize<%= classified_name %>(api) { - <% if @options['help'] %> - // see app/assets/javascripts/discourse/lib/plugin-api - // for the functions available via the api object - <% end %> -} - -export default { - name: "<%= dasherized_name %>", - - initialize() { - withPluginApi("0.8.24", initialize<%= classified_name %>); - } -}; diff --git a/lib/generators/plugin/templates/javascript.js.es6.erb b/lib/generators/plugin/templates/javascript.js.es6.erb new file mode 100644 index 00000000000..5be3cfc104b --- /dev/null +++ b/lib/generators/plugin/templates/javascript.js.es6.erb @@ -0,0 +1,13 @@ +import { withPluginApi } from "discourse/lib/plugin-api"; + +function initialize<%= classified_name %>(api) { + // https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/lib/plugin-api.js.es6 +} + +export default { + name: "<%= dasherized_name %>", + + initialize() { + withPluginApi("0.8.31", initialize<%= classified_name %>); + } +}; diff --git a/lib/generators/plugin/templates/plugin.rb.erb b/lib/generators/plugin/templates/plugin.rb.erb index 4937d8dba72..d081152943c 100644 --- a/lib/generators/plugin/templates/plugin.rb.erb +++ b/lib/generators/plugin/templates/plugin.rb.erb @@ -1,51 +1,19 @@ # name: <%= name %> -# about: +# about: <%= @about %> # version: 0.1 # authors: <%= @github_username %> # url: https://github.com/<%= @github_username %> -<% if @options["stylesheet"] %> register_asset "stylesheets/common/<%= dasherized_name %>.scss" -<% end %> +register_asset "stylesheets/desktop/<%= dasherized_name %>.scss" +register_asset "stylesheets/mobile/<%= dasherized_name %>.scss" enabled_site_setting :<%= underscored_name %>_enabled -PLUGIN_NAME ||= "<%= name %>".freeze +PLUGIN_NAME ||= "<%= classified_name %>".freeze + +load File.expand_path('../lib/<%= dasherized_name %>/engine.rb', __FILE__) after_initialize do - <% if @options['help'] %> - # see lib/plugin/instance.rb for the methods available in this context - <% end %> - - module ::<%= classified_name %> - class Engine < ::Rails::Engine - engine_name PLUGIN_NAME - isolate_namespace <%= classified_name %> - end - end - - <% if @options["scheduled_job"] %> - require File.expand_path("../jobs/scheduled/check_<%= underscored_name %>.rb", __FILE__) - <% end %> - - <% if @options["controller"] %> - require_dependency "application_controller" - class <%= name %>::ActionsController < ::ApplicationController - requires_plugin PLUGIN_NAME - - before_action :ensure_logged_in - - def list - render json: success_json - end - end - - <%= name %>::Engine.routes.draw do - get "/list" => "actions#list" - end - - Discourse::Application.routes.append do - mount ::<%= name %>::Engine, at: "/<%= dasherized_name %>" - end - <% end %> + # https://github.com/discourse/discourse/blob/master/lib/plugin/instance.rb end diff --git a/lib/generators/plugin/templates/plugin_controller.rb.erb b/lib/generators/plugin/templates/plugin_controller.rb.erb new file mode 100644 index 00000000000..4f86ef504c5 --- /dev/null +++ b/lib/generators/plugin/templates/plugin_controller.rb.erb @@ -0,0 +1,10 @@ +module <%= classified_name %> + class <%= classified_name %>Controller < ::ApplicationController + requires_plugin <%= classified_name %> + + before_action :ensure_logged_in + + def index + end + end +end diff --git a/lib/generators/plugin/templates/route-map.js.es6.erb b/lib/generators/plugin/templates/route-map.js.es6.erb new file mode 100644 index 00000000000..76f1c73ed4e --- /dev/null +++ b/lib/generators/plugin/templates/route-map.js.es6.erb @@ -0,0 +1,7 @@ +export default function() { + this.route("<%= dasherized_name %>", function() { + this.route("actions", function() { + this.route("show", { path: "/:id" }); + }); + }); +}; diff --git a/lib/generators/plugin/templates/route_constraint.rb.erb b/lib/generators/plugin/templates/route_constraint.rb.erb new file mode 100644 index 00000000000..2954ac262f4 --- /dev/null +++ b/lib/generators/plugin/templates/route_constraint.rb.erb @@ -0,0 +1,5 @@ +class <%= classified_name %>Constraint + def matches?(request) + SiteSetting.<%= underscored_name %>_enabled + end +end diff --git a/lib/generators/plugin/templates/routes.rb.erb b/lib/generators/plugin/templates/routes.rb.erb new file mode 100644 index 00000000000..5a4d6c6d9ac --- /dev/null +++ b/lib/generators/plugin/templates/routes.rb.erb @@ -0,0 +1,7 @@ +require_dependency "<%= underscored_name %>_constraint" + +<%= classified_name %>::Engine.routes.draw do + get "/" => "<%= dasherized_name %>#index", constraints: <%= classified_name %>Constraint.new + get "/actions" => "actions#index", constraints: <%= classified_name %>Constraint.new + get "/actions/:id" => "actions#show", constraints: <%= classified_name %>Constraint.new +end