discourse/lib/generators/plugin/plugin_generator.rb

126 lines
4.6 KiB
Ruby

# frozen_string_literal: true
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 :no_license, type: :boolean, desc: "No license", default: false
def create_plugin
@about ||= ask("What is the purpose of your plugin?")
@github_username ||= ask("Github username?")
readme_file
routes_file
engine_file
plugin_file
controller_file
license_file
stylesheet_file
javascript_file
settings_file
locales_file
end
def controller_file
template 'plugin_controller.rb.erb', File.join('plugins', dasherized_name, "app/controllers/#{underscored_name}/#{underscored_name}_controller.rb")
template 'controller.rb.erb', File.join('plugins', dasherized_name, "app/controllers/#{underscored_name}/actions_controller.rb")
template 'controller_spec.rb.erb', File.join('plugins', dasherized_name, "spec/requests/actions_controller_spec.rb")
end
def readme_file
template 'README.md.erb', File.join('plugins', dasherized_name, "README.md")
end
def license_file
return if @options['no_license']
template 'LICENSE.erb', File.join('plugins', dasherized_name, "LICENSE")
end
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 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 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")
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 settings_file
template 'settings.yml.erb', File.join('plugins', dasherized_name, 'config', 'settings.yml')
end
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
def create_gitignore_entry
plugin_entry = "!/plugins/#{dasherized_name}"
unless File.readlines(".gitignore").grep(/#{plugin_entry}/).size > 0
open('.gitignore', 'a') { |f| f.puts "\n#{plugin_entry}" }
end
end
def underscored_name
name.underscore
end
def dasherized_name
underscored_name.dasherize
end
def classified_name
name.tableize.classify
end
def path(*args)
File.join('plugins', dasherized_name, args)
end
end