diff --git a/core/lib/generators/cms_generator.rb b/core/lib/generators/cms_generator.rb
index 461127a168..060b314417 100644
--- a/core/lib/generators/cms_generator.rb
+++ b/core/lib/generators/cms_generator.rb
@@ -14,7 +14,7 @@ def generate
self.silence_puts = true
# Only pretend to do the next actions if this is Refinery to stay DRY
- if Rails.root == Refinery.root
+ if destination_path == Refinery.root
say_status :'-- pretending to make changes that happen in an actual installation --', nil, :yellow
old_pretend = self.options[:pretend]
new_options = self.options.dup
@@ -25,7 +25,7 @@ def generate
unless self.options[:update]
# First, effectively move / rename files that get in the way of Refinery CMS
%w(public/index.html app/views/layouts/application.html.erb).each do |roadblock|
- if (roadblock_path = Rails.root.join(roadblock)).file?
+ if (roadblock_path = destination_path.join(roadblock)).file?
create_file "#{roadblock}.backup",
:verbose => true do roadblock_path.read end
remove_file roadblock_path, :verbose => true
@@ -35,9 +35,11 @@ def generate
# Massage environment files
%w(development test production).map{|e| "config/environments/#{e}.rb"}.each do |env|
+ next unless destination_path.join(env).file?
+
gsub_file env, "config.assets.compile = false", "config.assets.compile = true", :verbose => false
- unless (env_file_contents = Rails.root.join(env).read) =~ %r{Refinery.rescue_not_found}
+ unless (env_file_contents = destination_path.join(env).read) =~ %r{Refinery.rescue_not_found}
append_file env, "Refinery.rescue_not_found = #{env.split('/').last.split('.rb').first == 'production'}\n"
end
@@ -50,7 +52,7 @@ def generate
end
# Stop pretending
- if Rails.root == Refinery.root
+ if destination_path == Refinery.root
say_status :'-- finished pretending --', nil, :yellow
new_options = self.options.dup
new_options[:pretend] = old_pretend
@@ -58,13 +60,13 @@ def generate
end
# Ensure .gitignore exists and append our rules to it.
- create_file ".gitignore" unless Rails.root.join('.gitignore').file?
+ create_file ".gitignore" unless destination_path.join('.gitignore').file?
our_ignore_rules = self.class.source_root.join('.gitignore').read
- our_ignore_rules = our_ignore_rules.split('# REFINERY CMS DEVELOPMENT').first if Rails.root != Refinery.root
+ our_ignore_rules = our_ignore_rules.split('# REFINERY CMS DEVELOPMENT').first if destination_path != Refinery.root
append_file ".gitignore", our_ignore_rules
# If the admin/base_controller.rb file exists, ensure it does not do the old inheritance
- if (admin_base = Rails.root.join('app', 'controllers', 'refinery', 'admin_controller.rb')).file?
+ if (admin_base = destination_path.join('app', 'controllers', 'refinery', 'admin_controller.rb')).file?
gsub_file admin_base,
"# You can extend refinery backend with your own functions here and they will likely not get overriden in an update.",
"",
@@ -75,7 +77,7 @@ def generate
end
# Append seeds.
- create_file "db/seeds.rb" unless Rails.root.join('db', 'seeds.rb').file?
+ create_file "db/seeds.rb" unless destination_path.join('db', 'seeds.rb').file?
append_file 'db/seeds.rb', :verbose => true do
self.class.source_root.join('db', 'seeds.rb').read
end
@@ -97,7 +99,13 @@ def generate
Pathname.glob(self.class.source_root.join('**', '*')).reject{|f|
f.directory? or f.to_s =~ /\/db\//
}.sort.each do |path|
- copy_file path, path.to_s.gsub(self.class.source_root.to_s, Rails.root.to_s)
+ copy_file path, path.to_s.gsub(self.class.source_root.to_s, destination_path.to_s)
+ end
+
+ # Create decorator directories
+ ['controllers', 'models'].each do |decorator_namespace|
+ src_file_path = "app/decorators/#{decorator_namespace}/refinery/.gitkeep"
+ copy_file self.class.source_root.join(src_file_path), destination_path.join(src_file_path)
end
# Ensure i18n exists and is up to date.
diff --git a/core/lib/generators/templates/app/decorators/controllers/refinery/.gitkeep b/core/lib/generators/templates/app/decorators/controllers/refinery/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core/lib/generators/templates/app/decorators/models/refinery/.gitkeep b/core/lib/generators/templates/app/decorators/models/refinery/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core/lib/refinery/core/engine.rb b/core/lib/refinery/core/engine.rb
new file mode 100644
index 0000000000..538e07c2f4
--- /dev/null
+++ b/core/lib/refinery/core/engine.rb
@@ -0,0 +1,90 @@
+module Refinery
+ module Core
+ class Engine < ::Rails::Engine
+ isolate_namespace ::Refinery
+
+ def self.load_decorators
+ Dir.glob(File.join(Rails.root, "app/decorators/**/*_decorator.rb")) do |c|
+ Rails.application.config.cache_classes ? require(c) : load(c)
+ end
+ end
+
+ config.autoload_paths += %W( #{config.root}/lib )
+
+ # Attach ourselves to the Rails application.
+ config.before_configuration do
+ ::Refinery::Core.attach_to_application!
+ end
+
+ refinery.after_inclusion &method(:load_decorators).to_proc
+
+ # Wrap errors in spans and cache vendored assets.
+ config.to_prepare do
+ # This wraps errors in span not div
+ ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
+ "#{html_tag}".html_safe
+ end
+ end
+
+ # set per_page globally
+ config.to_prepare do
+ WillPaginate.per_page = 20
+ end
+
+ # Register the plugin
+ config.after_initialize do
+ ::Refinery::Plugin.register do |plugin|
+ plugin.pathname = root
+ plugin.name = 'refinery_core'
+ plugin.class_name = 'RefineryEngine'
+ plugin.version = ::Refinery.version
+ plugin.hide_from_menu = true
+ plugin.always_allow_access = true
+ plugin.menu_match = /refinery\/(refinery_core)$/
+ end
+
+ # Register the dialogs plugin
+ ::Refinery::Plugin.register do |plugin|
+ plugin.pathname = root
+ plugin.name = 'refinery_dialogs'
+ plugin.version = ::Refinery.version
+ plugin.hide_from_menu = true
+ plugin.always_allow_access = true
+ plugin.menu_match = /refinery\/(refinery_)?dialogs/
+ end
+ end
+
+ initializer 'add catch all routes' do |app|
+ app.routes_reloader.paths << File.expand_path('../../catch_all_routes.rb', __FILE__)
+ end
+
+ initializer 'add presenters' do |app|
+ app.config.autoload_paths += [
+ Rails.root.join('app', 'presenters'),
+ Rails.root.join('vendor', '**', '**', 'app', 'presenters'),
+ Refinery.roots.map{|r| r.join('**', 'app', 'presenters')}
+ ].flatten
+ end
+
+ initializer 'configure acts_as_indexed' do |app|
+ ActsAsIndexed.configure do |config|
+ config.index_file = Rails.root.join('tmp', 'index')
+ config.index_file_depth = 3
+ config.min_word_size = 3
+ end
+ end
+
+ initializer "refinery.assets.precompile" do |app|
+ app.config.assets.precompile += [
+ "refinery/*",
+ "refinery/icons/*",
+ "wymeditor/lang/*",
+ "wymeditor/skins/refinery/*",
+ "wymeditor/skins/refinery/**/*",
+ "modernizr-min.js",
+ "dd_belatedpng.js"
+ ]
+ end
+ end
+ end
+end
diff --git a/core/lib/refinerycms-core.rb b/core/lib/refinerycms-core.rb
index a2a7ad9197..854b04a837 100644
--- a/core/lib/refinerycms-core.rb
+++ b/core/lib/refinerycms-core.rb
@@ -56,87 +56,8 @@ def root
end
::Rails::Engine.send :include, ::Refinery::Engine
-
- class Engine < ::Rails::Engine
- isolate_namespace ::Refinery
-
- config.autoload_paths += %W( #{config.root}/lib )
-
- # Attach ourselves to the Rails application.
- config.before_configuration do
- ::Refinery::Core.attach_to_application!
- end
-
- # Wrap errors in spans and cache vendored assets.
- config.to_prepare do
- # This wraps errors in span not div
- ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
- "#{html_tag}".html_safe
- end
- end
-
- # set per_page globally
- config.to_prepare do
- WillPaginate.per_page = 20
- end
-
- # Register the plugin
- config.after_initialize do
- ::Refinery::Plugin.register do |plugin|
- plugin.pathname = root
- plugin.name = 'refinery_core'
- plugin.class_name = 'RefineryEngine'
- plugin.version = ::Refinery.version
- plugin.hide_from_menu = true
- plugin.always_allow_access = true
- plugin.menu_match = /refinery\/(refinery_core)$/
- end
-
- # Register the dialogs plugin
- ::Refinery::Plugin.register do |plugin|
- plugin.pathname = root
- plugin.name = 'refinery_dialogs'
- plugin.version = ::Refinery.version
- plugin.hide_from_menu = true
- plugin.always_allow_access = true
- plugin.menu_match = /refinery\/(refinery_)?dialogs/
- end
- end
-
- initializer 'add catch all routes' do |app|
- app.routes_reloader.paths << File.expand_path('../refinery/catch_all_routes.rb', __FILE__)
- end
-
- initializer 'add presenters' do |app|
- app.config.autoload_paths += [
- Rails.root.join('app', 'presenters'),
- Rails.root.join('vendor', '**', '**', 'app', 'presenters'),
- Refinery.roots.map{|r| r.join('**', 'app', 'presenters')}
- ].flatten
- end
-
- initializer 'configure acts_as_indexed' do |app|
- ActsAsIndexed.configure do |config|
- config.index_file = Rails.root.join('tmp', 'index')
- config.index_file_depth = 3
- config.min_word_size = 3
- end
- end
-
- initializer "refinery.assets.precompile" do |app|
- app.config.assets.precompile += [
- "refinery/*",
- "refinery/icons/*",
- "wymeditor/lang/*",
- "wymeditor/skins/refinery/*",
- "wymeditor/skins/refinery/**/*",
- "modernizr-min.js",
- "dd_belatedpng.js"
- ]
- end
- end
end
-
end
+require 'refinery/core/engine'
::Refinery.engines << 'core'
diff --git a/core/refinerycms-core.gemspec b/core/refinerycms-core.gemspec
index 0809828272..7a8b39f127 100644
--- a/core/refinerycms-core.gemspec
+++ b/core/refinerycms-core.gemspec
@@ -360,6 +360,11 @@ Gem::Specification.new do |s|
'lib/generators/templates',
'lib/generators/templates/.gitignore',
'lib/generators/templates/app',
+ 'lib/generators/templates/app/decorators',
+ 'lib/generators/templates/app/decorators/controllers',
+ 'lib/generators/templates/app/decorators/controllers/refinery',
+ 'lib/generators/templates/app/decorators/models',
+ 'lib/generators/templates/app/decorators/models/refinery',
'lib/generators/templates/app/views',
'lib/generators/templates/app/views/sitemap',
'lib/generators/templates/app/views/sitemap/index.xml.builder',
@@ -384,6 +389,8 @@ Gem::Specification.new do |s|
'lib/refinery/base_presenter.rb',
'lib/refinery/catch_all_routes.rb',
'lib/refinery/configuration.rb',
+ 'lib/refinery/core',
+ 'lib/refinery/core/engine.rb',
'lib/refinery/crud.rb',
'lib/refinery/engine.rb',
'lib/refinery/helpers',
@@ -426,6 +433,8 @@ Gem::Specification.new do |s|
'spec/controllers/refinery/fast_controller_spec.rb',
'spec/controllers/refinery/sitemap_controller_spec.rb',
'spec/lib',
+ 'spec/lib/generators',
+ 'spec/lib/generators/cms_generator_spec.rb',
'spec/lib/refinery',
'spec/lib/refinery/activity_spec.rb',
'spec/lib/refinery/plugin_spec.rb',
diff --git a/core/spec/lib/generators/cms_generator_spec.rb b/core/spec/lib/generators/cms_generator_spec.rb
new file mode 100644
index 0000000000..df8020d0e1
--- /dev/null
+++ b/core/spec/lib/generators/cms_generator_spec.rb
@@ -0,0 +1,49 @@
+require 'spec_helper'
+require "generator_spec/test_case"
+
+module Refinery
+ describe CmsGenerator do
+ include GeneratorSpec::TestCase
+ destination File.expand_path("../../tmp", __FILE__)
+
+ before(:each) do
+ prepare_destination
+ run_generator
+ end
+
+ specify do
+ destination_root.should have_structure {
+ directory "app" do
+ directory "decorators" do
+ directory "controllers" do
+ directory "refinery" do
+ file ".gitkeep"
+ end
+ end
+ directory "models" do
+ directory "refinery" do
+ file ".gitkeep"
+ end
+ end
+ end
+ directory "views" do
+ directory "sitemap" do
+ file "index.xml.builder"
+ end
+ end
+ end
+ directory "db" do
+ file "seeds.rb"
+ end
+ directory "config" do
+ file "database.yml.mysql"
+ file "database.yml.postgresql"
+ file "database.yml.sqlite3"
+ directory "initializers" do
+ file "devise.rb"
+ end
+ end
+ }
+ end
+ end
+end