require 'rails/generators/base' require 'securerandom' module CamaleonCms module Generators class GemThemeGenerator < Rails::Generators::Base source_root File.expand_path("../gem_theme_template", __FILE__) argument :plugin_name, :type => :string, :default => "my_theme" desc "This generator create all basic gem theme structure." def create_initializer_file plugin_dir = Rails.root.join("apps", "themes", get_plugin_name).to_s if behavior == :revoke FileUtils.rm_r(plugin_dir) append_to_file Rails.root.join("Gemfile") do "\n\ngem '#{get_plugin_name}', path: '#{plugin_dir}/'" end else plugin_app = File.join($camaleon_engine_dir, "lib", "generators", "camaleon_cms", "gem_theme_#{get_plugin_name}") FileUtils.rm_r(plugin_app) if Dir.exist?(plugin_app) FileUtils.mkdir_p(plugin_dir) system("cd #{Rails.root}; rails plugin new apps/themes/#{get_plugin_name} --full") FileUtils.cp_r(File.join($camaleon_engine_dir, "lib", "generators", "camaleon_cms", "gem_theme_template"), plugin_app) # tmp copy helper_path = File.join(plugin_app, "app", "helpers", "themes", get_plugin_name) views_path = File.join(plugin_app, "app", "views", "themes", get_plugin_name) FileUtils.mv(File.join(plugin_app, "app", "helpers", "themes", "my_plugin"), helper_path) rescue nil FileUtils.mv(File.join(plugin_app, "app", "views", "themes", "my_plugin"), views_path) rescue nil FileUtils.mv(File.join(plugin_app, "app", "assets", "images", "themes", "my_plugin"), File.join(plugin_app, "app", "assets", "images", "themes", get_plugin_name)) rescue nil FileUtils.mv(File.join(plugin_app, "app", "assets", "javascripts", "themes", "my_plugin"), File.join(plugin_app, "app", "assets", "javascripts", "themes", get_plugin_name)) rescue nil FileUtils.mv(File.join(plugin_app, "app", "assets", "stylesheets", "themes", "my_plugin"), File.join(plugin_app, "app", "assets", "stylesheets", "themes", get_plugin_name)) rescue nil # configuration t = fix_text(File.read(File.join(plugin_app, "config", "camaleon_theme.json"))) File.open(File.join(plugin_app, "config", "camaleon_theme.json"), "w"){|f| f << t } # helper t = fix_text(File.read(File.join(helper_path, "main_helper.rb"))) File.open(File.join(helper_path, "main_helper.rb"), "w"){|f| f << t } # controllers # t = fix_text(File.read(File.join(controller_path, "admin_controller.rb"))) # File.open(File.join(controller_path, "admin_controller.rb"), "w"){|f| f << t } # t = fix_text(File.read(File.join(controller_path, "front_controller.rb"))) # File.open(File.join(controller_path, "front_controller.rb"), "w"){|f| f << t } # models # model_file = File.join(model_path, "my_plugin.rb") # t = fix_text(File.read(model_file)) # File.open(model_file, "w"){|f| f << t } # FileUtils.mv(model_file, File.join(File.dirname(model_file), "#{get_plugin_name}.rb")) rescue nil directory(plugin_app, plugin_dir) append_to_file Rails.root.join("Gemfile") do "\n\ngem '#{get_plugin_name}', path: '#{plugin_dir}/'" end # destroy non used files FileUtils.rm_r(plugin_app) FileUtils.rm_r(File.join(plugin_dir, "app", "assets", "images", get_plugin_name)) FileUtils.rm_r(File.join(plugin_dir, "app", "assets", "javascripts", get_plugin_name)) FileUtils.rm_r(File.join(plugin_dir, "app", "assets", "stylesheets", get_plugin_name)) # remove TODO text from gem gemspec_file = File.join(plugin_dir, "#{get_plugin_name}.gemspec") t = File.read(gemspec_file).gsub("TODO", "") File.open(gemspec_file, "w"){|f| f << t } end end def fix_text(text = "") text.gsub("pluginTitle", get_plugin_title).gsub("PluginClass", get_plugin_class).gsub("pluginKey", get_plugin_name) end def self.next_migration_number(dir) Time.now.utc.strftime("%Y%m%d%H%M%S") end private def get_plugin_name plugin_name.underscore.singularize end def get_plugin_title plugin_name.titleize end def get_plugin_class get_plugin_name.classify end end end end