mirror of
https://github.com/discourse/discourse.git
synced 2024-12-02 03:03:44 +08:00
126 lines
4.6 KiB
Ruby
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
|