mirror of
https://github.com/discourse/discourse.git
synced 2025-03-04 11:30:55 +08:00

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.
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/#{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 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
|