alchemy_cms 3.2.0.beta → 3.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +661 -863
  3. data/README.md +5 -63
  4. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +11 -10
  5. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +6 -0
  6. data/app/assets/stylesheets/alchemy/_extends.scss +0 -6
  7. data/app/assets/stylesheets/alchemy/_mixins.scss +6 -0
  8. data/app/assets/stylesheets/alchemy/buttons.scss +1 -1
  9. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  10. data/app/assets/stylesheets/alchemy/menubar.scss +1 -1
  11. data/app/assets/stylesheets/alchemy/selects.scss +5 -1
  12. data/app/assets/stylesheets/alchemy/upload.scss +1 -1
  13. data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
  14. data/app/controllers/alchemy/base_controller.rb +4 -57
  15. data/app/controllers/alchemy/messages_controller.rb +2 -2
  16. data/app/controllers/alchemy/pages_controller.rb +22 -31
  17. data/app/controllers/alchemy/pictures_controller.rb +2 -2
  18. data/app/helpers/alchemy/admin/base_helper.rb +7 -0
  19. data/app/helpers/alchemy/admin/elements_helper.rb +31 -15
  20. data/app/helpers/alchemy/admin/pages_helper.rb +17 -0
  21. data/app/helpers/alchemy/base_helper.rb +0 -28
  22. data/app/helpers/alchemy/pages_helper.rb +18 -12
  23. data/app/helpers/alchemy/url_helper.rb +2 -2
  24. data/app/models/alchemy/cell.rb +1 -1
  25. data/app/models/alchemy/content/factory.rb +12 -6
  26. data/app/models/alchemy/element.rb +3 -3
  27. data/app/models/alchemy/element/definitions.rb +1 -1
  28. data/app/models/alchemy/element_to_page.rb +7 -0
  29. data/app/models/alchemy/language.rb +1 -1
  30. data/app/models/alchemy/page.rb +8 -1
  31. data/app/models/alchemy/page/page_cells.rb +2 -2
  32. data/app/models/alchemy/page/page_elements.rb +23 -5
  33. data/app/models/alchemy/page/page_natures.rb +3 -3
  34. data/app/models/alchemy/page/page_scopes.rb +1 -1
  35. data/app/models/alchemy/picture.rb +1 -1
  36. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +1 -1
  37. data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
  38. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  39. data/app/views/alchemy/breadcrumb/_page.html.erb +3 -2
  40. data/app/views/alchemy/breadcrumb/_separator.html.erb +1 -0
  41. data/app/views/alchemy/breadcrumb/_wrapper.html.erb +13 -0
  42. data/app/views/alchemy/language_links/_language.html.erb +1 -1
  43. data/app/views/alchemy/navigation/_link.html.erb +1 -1
  44. data/app/views/alchemy/pages/show.rss.builder +5 -7
  45. data/app/views/layouts/alchemy/admin.html.erb +5 -0
  46. data/config/routes.rb +13 -10
  47. data/lib/alchemy/configuration_methods.rb +29 -0
  48. data/lib/alchemy/controller_actions.rb +12 -4
  49. data/lib/alchemy/engine.rb +3 -0
  50. data/lib/alchemy/errors.rb +1 -1
  51. data/lib/alchemy/essence.rb +14 -12
  52. data/lib/alchemy/on_page_layout.rb +58 -0
  53. data/lib/alchemy/page_layout.rb +1 -1
  54. data/lib/alchemy/permissions.rb +21 -16
  55. data/lib/alchemy/routing_constraints.rb +49 -0
  56. data/lib/alchemy/seeder.rb +4 -2
  57. data/lib/alchemy/ssl_protection.rb +30 -0
  58. data/lib/alchemy/test_support/essence_shared_examples.rb +118 -25
  59. data/lib/alchemy/test_support/factories.rb +5 -8
  60. data/lib/alchemy/test_support/integration_helpers.rb +16 -10
  61. data/lib/alchemy/upgrader/three_point_two.rb +34 -4
  62. data/lib/alchemy/version.rb +1 -1
  63. data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_editor.html.erb +0 -0
  64. data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_view.html.erb +0 -0
  65. data/lib/rails/generators/alchemy/{scaffold → install}/files/_standard.html.erb +0 -0
  66. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.de.yml +0 -0
  67. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.elements.css.scss +0 -0
  68. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.en.yml +0 -0
  69. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.es.yml +0 -0
  70. data/lib/rails/generators/alchemy/{scaffold → install}/files/application.html.erb +0 -0
  71. data/lib/rails/generators/alchemy/install/install_generator.rb +69 -0
  72. data/lib/rails/generators/alchemy/{scaffold/files/elements.yml → install/templates/elements.yml.tt} +2 -0
  73. data/lib/rails/generators/alchemy/{scaffold → install}/templates/page_layouts.yml.tt +2 -0
  74. data/lib/rails/generators/alchemy/views/views_generator.rb +41 -0
  75. data/lib/rails/templates/alchemy.rb +2 -2
  76. data/lib/tasks/alchemy/db.rake +0 -5
  77. data/lib/tasks/alchemy/install.rake +10 -5
  78. data/lib/tasks/alchemy/tidy.rake +2 -0
  79. data/spec/controllers/admin/attachments_controller_spec.rb +1 -1
  80. data/spec/controllers/admin/clipboard_controller_spec.rb +1 -1
  81. data/spec/controllers/admin/contents_controller_spec.rb +1 -1
  82. data/spec/controllers/admin/dashboard_controller_spec.rb +2 -2
  83. data/spec/controllers/admin/elements_controller_spec.rb +1 -1
  84. data/spec/controllers/admin/essence_files_controller_spec.rb +1 -1
  85. data/spec/controllers/admin/essence_pictures_controller_spec.rb +1 -1
  86. data/spec/controllers/admin/languages_controller_spec.rb +1 -1
  87. data/spec/controllers/admin/layoutpages_controller_spec.rb +1 -1
  88. data/spec/controllers/admin/pages_controller_spec.rb +4 -4
  89. data/spec/controllers/admin/pictures_controller_spec.rb +1 -1
  90. data/spec/controllers/admin/resources_controller_spec.rb +1 -1
  91. data/spec/controllers/admin/trash_controller_spec.rb +1 -1
  92. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +1 -1
  93. data/spec/controllers/attachments_controller_spec.rb +1 -1
  94. data/spec/controllers/base_controller_spec.rb +22 -0
  95. data/spec/controllers/elements_controller_spec.rb +1 -1
  96. data/spec/controllers/pages_controller_spec.rb +15 -16
  97. data/spec/controllers/pictures_controller_spec.rb +212 -162
  98. data/spec/dummy/app/controllers/login_controller.rb +5 -0
  99. data/spec/dummy/app/models/dummy_model.rb +3 -0
  100. data/spec/dummy/config/alchemy/cells.yml +4 -1
  101. data/spec/dummy/config/alchemy/elements.yml +8 -0
  102. data/spec/dummy/config/alchemy/page_layouts.yml +5 -1
  103. data/spec/dummy/config/routes.rb +1 -2
  104. data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +7 -0
  105. data/spec/dummy/db/schema.rb +30 -26
  106. data/spec/features/admin/dashboard_spec.rb +11 -9
  107. data/spec/features/admin/language_tree_feature_spec.rb +5 -6
  108. data/spec/features/admin/legacy_page_url_management_spec.rb +1 -1
  109. data/spec/features/admin/link_overlay_spec.rb +1 -1
  110. data/spec/features/admin/locale_select_feature_spec.rb +1 -1
  111. data/spec/features/admin/modules_integration_spec.rb +1 -1
  112. data/spec/features/admin/navigation_feature_spec.rb +1 -1
  113. data/spec/features/admin/page_creation_feature_spec.rb +1 -1
  114. data/spec/features/admin/page_editing_feature_spec.rb +3 -3
  115. data/spec/features/admin/picture_library_integration_spec.rb +1 -1
  116. data/spec/features/admin/resources_integration_spec.rb +1 -1
  117. data/spec/features/admin/site_select_feature_spec.rb +32 -0
  118. data/spec/features/admin/tinymce_feature_spec.rb +1 -3
  119. data/spec/features/page_feature_spec.rb +36 -27
  120. data/spec/features/security_spec.rb +1 -1
  121. data/spec/features/translation_integration_spec.rb +3 -3
  122. data/spec/helpers/admin/elements_helper_spec.rb +103 -26
  123. data/spec/helpers/admin/pages_helper_spec.rb +32 -1
  124. data/spec/helpers/base_helper_spec.rb +0 -45
  125. data/spec/helpers/pages_helper_spec.rb +18 -17
  126. data/spec/helpers/url_helper_spec.rb +8 -5
  127. data/spec/libraries/controller_actions_spec.rb +2 -2
  128. data/spec/libraries/on_page_layout_spec.rb +112 -0
  129. data/spec/libraries/page_layout_spec.rb +5 -1
  130. data/spec/libraries/permissions_spec.rb +13 -15
  131. data/spec/models/cell_spec.rb +4 -0
  132. data/spec/models/content_spec.rb +6 -0
  133. data/spec/models/dummy_model_spec.rb +11 -0
  134. data/spec/models/element_spec.rb +6 -1
  135. data/spec/models/element_to_page_spec.rb +14 -0
  136. data/spec/models/page_spec.rb +111 -19
  137. data/spec/routing/routing_spec.rb +120 -101
  138. data/spec/spec_helper.rb +3 -3
  139. metadata +36 -21
  140. data/app/views/alchemy/breadcrumb/_spacer.html.erb +0 -1
  141. data/lib/alchemy/capistrano.rb +0 -230
  142. data/lib/alchemy/test_support/auth_helpers.rb +0 -35
  143. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +0 -90
  144. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +0 -113
  145. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +0 -63
  146. data/spec/dummy/app/controllers/errors_controller.rb +0 -5
@@ -0,0 +1,49 @@
1
+ module Alchemy
2
+
3
+ # Routing constraints for Alchemy's strong catch all route.
4
+ #
5
+ # Alchemy has a very strong catch all route.
6
+ # But we don't want to handle all requests.
7
+ #
8
+ # For instance we only want to handle html requests and
9
+ # don't want to swallow the rails/info routes in development mode.
10
+ #
11
+ class RoutingConstraints
12
+ LOCALE_REGEXP = /[a-z]{2}(-[a-z]{2})?/
13
+
14
+ def matches?(request)
15
+ @request = request
16
+ @params = @request.params
17
+
18
+ handable_format? && no_rails_route?
19
+ rescue ArgumentError => e
20
+ handle_invalid_byte_sequence(e)
21
+ end
22
+
23
+ private
24
+
25
+ # We only want html requests to be handled by us.
26
+ #
27
+ # If an unknown format is requested we want to handle this,
28
+ # because it could be a legacy route that needs to be redirected.
29
+ #
30
+ def handable_format?
31
+ @request.format.symbol.nil? || (@request.format.symbol == :html)
32
+ end
33
+
34
+ # We don't want to handle the Rails info routes.
35
+ def no_rails_route?
36
+ return true if !%w(development test).include?(Rails.env)
37
+ (@params['urlname'] =~ /\Arails\//).nil?
38
+ end
39
+
40
+ # Handle invalid byte sequence in UTF-8 errors with 400 status.
41
+ def handle_invalid_byte_sequence(e)
42
+ if e.message =~ /invalid byte sequence/
43
+ raise ActionController::BadRequest
44
+ else
45
+ raise
46
+ end
47
+ end
48
+ end
49
+ end
@@ -6,8 +6,10 @@ module Alchemy
6
6
 
7
7
  class << self
8
8
 
9
- # This seed builds the necessary page structure for alchemy in your database.
10
- # Run the alchemy:db:seed rake task to seed your database.
9
+ # This seed builds the necessary page structure for Alchemy in your database.
10
+ #
11
+ # Call this from your db/seeds.rb file with the rake db:seed task.
12
+ #
11
13
  def seed!
12
14
  create_default_site
13
15
  create_root_page
@@ -0,0 +1,30 @@
1
+ module Alchemy
2
+ module SSLProtection
3
+ private
4
+
5
+ # Enforce ssl for login and all admin modules.
6
+ #
7
+ # Default is +false+
8
+ #
9
+ # === Usage
10
+ #
11
+ # # config/alchemy/config.yml
12
+ # ...
13
+ # require_ssl: true
14
+ # ...
15
+ #
16
+ # === Note
17
+ #
18
+ # You have to create a ssl certificate
19
+ # if you want to use the ssl protection.
20
+ #
21
+ def ssl_required?
22
+ !Rails.env.test? && Config.get(:require_ssl)
23
+ end
24
+
25
+ # Redirects current request to https.
26
+ def enforce_ssl
27
+ redirect_to url_for(request.params.merge(protocol: 'https'))
28
+ end
29
+ end
30
+ end
@@ -84,27 +84,67 @@ shared_examples_for "an essence" do
84
84
  end
85
85
 
86
86
  describe 'presence' do
87
- before do
88
- allow(essence).to receive(:description).and_return({'validate' => ['presence']})
89
- end
90
-
91
- context 'when the ingredient column is empty' do
87
+ context 'with string given as validation type' do
92
88
  before do
93
- essence.update(essence.ingredient_column.to_sym => nil)
89
+ allow(essence).to receive(:description).and_return({'validate' => ['presence']})
94
90
  end
95
91
 
96
- it 'should not be valid' do
97
- expect(essence).to_not be_valid
92
+ context 'when the ingredient column is empty' do
93
+ before do
94
+ essence.update(essence.ingredient_column.to_sym => nil)
95
+ end
96
+
97
+ it 'should not be valid' do
98
+ expect(essence).to_not be_valid
99
+ end
100
+ end
101
+
102
+ context 'when the ingredient column is not nil' do
103
+ before do
104
+ essence.update(essence.ingredient_column.to_sym => ingredient_value)
105
+ end
106
+
107
+ it 'should be valid' do
108
+ expect(essence).to be_valid
109
+ end
98
110
  end
99
111
  end
100
112
 
101
- context 'when the ingredient column is not nil' do
102
- before do
103
- essence.update(essence.ingredient_column.to_sym => ingredient_value)
113
+ context 'with hash given as validation type' do
114
+ context 'where the value is true' do
115
+ before do
116
+ allow(essence).to receive(:description).and_return({'validate' => [{'presence' => true}]})
117
+ end
118
+
119
+ context 'when the ingredient column is empty' do
120
+ before do
121
+ essence.update(essence.ingredient_column.to_sym => nil)
122
+ end
123
+
124
+ it 'should not be valid' do
125
+ expect(essence).to_not be_valid
126
+ end
127
+ end
128
+
129
+ context 'when the ingredient column is not nil' do
130
+ before do
131
+ essence.update(essence.ingredient_column.to_sym => ingredient_value)
132
+ end
133
+
134
+ it 'should be valid' do
135
+ expect(essence).to be_valid
136
+ end
137
+ end
104
138
  end
105
139
 
106
- it 'should be valid' do
107
- expect(essence).to be_valid
140
+ context 'where the value is false' do
141
+ before do
142
+ allow(essence).to receive(:description).and_return({'validate' => [{'presence' => false}]})
143
+ end
144
+
145
+ it 'should be valid' do
146
+ expect(essence).to be_valid
147
+ end
108
148
  end
109
149
  end
110
150
  end
@@ -112,22 +152,37 @@ shared_examples_for "an essence" do
112
152
  describe 'uniqueness' do
113
153
  before do
114
154
  allow(essence).to receive(:element).and_return(build_stubbed(:element))
115
- expect(essence).to receive(:description).at_least(:once).and_return({'validate' => ['uniqueness']})
116
155
  essence.update(essence.ingredient_column.to_sym => ingredient_value)
117
156
  end
118
157
 
119
- context 'when a duplicate exists' do
158
+ context 'with string given as validation type' do
120
159
  before do
121
- allow(essence).to receive(:duplicates).and_return([essence.dup])
160
+ expect(essence).to receive(:description).at_least(:once).and_return({'validate' => ['uniqueness']})
122
161
  end
123
162
 
124
- it 'should not be valid' do
125
- expect(essence).to_not be_valid
163
+ context 'when a duplicate exists' do
164
+ before do
165
+ allow(essence).to receive(:duplicates).and_return([essence.dup])
166
+ end
167
+
168
+ it 'should not be valid' do
169
+ expect(essence).to_not be_valid
170
+ end
171
+
172
+ context 'when validated essence is not public' do
173
+ before do
174
+ expect(essence).to receive(:public?).and_return(false)
175
+ end
176
+
177
+ it 'should be valid' do
178
+ expect(essence).to be_valid
179
+ end
180
+ end
126
181
  end
127
182
 
128
- context 'when validated essence is not public' do
183
+ context 'when no duplicate exists' do
129
184
  before do
130
- expect(essence).to receive(:public?).and_return(false)
185
+ expect(essence).to receive(:duplicates).and_return([])
131
186
  end
132
187
 
133
188
  it 'should be valid' do
@@ -136,13 +191,51 @@ shared_examples_for "an essence" do
136
191
  end
137
192
  end
138
193
 
139
- context 'when no duplicate exists' do
140
- before do
141
- expect(essence).to receive(:duplicates).and_return([])
194
+ context 'with hash given as validation type' do
195
+ context 'where the value is true' do
196
+ before do
197
+ expect(essence).to receive(:description).at_least(:once).and_return({'validate' => [{'uniqueness' => true}]})
198
+ end
199
+
200
+ context 'when a duplicate exists' do
201
+ before do
202
+ allow(essence).to receive(:duplicates).and_return([essence.dup])
203
+ end
204
+
205
+ it 'should not be valid' do
206
+ expect(essence).to_not be_valid
207
+ end
208
+
209
+ context 'when validated essence is not public' do
210
+ before do
211
+ expect(essence).to receive(:public?).and_return(false)
212
+ end
213
+
214
+ it 'should be valid' do
215
+ expect(essence).to be_valid
216
+ end
217
+ end
218
+ end
219
+
220
+ context 'when no duplicate exists' do
221
+ before do
222
+ expect(essence).to receive(:duplicates).and_return([])
223
+ end
224
+
225
+ it 'should be valid' do
226
+ expect(essence).to be_valid
227
+ end
228
+ end
142
229
  end
143
230
 
144
- it 'should be valid' do
145
- expect(essence).to be_valid
231
+ context 'where the value is false' do
232
+ before do
233
+ allow(essence).to receive(:description).and_return({'validate' => [{'uniqueness' => false}]})
234
+ end
235
+
236
+ it 'should be valid' do
237
+ expect(essence).to be_valid
238
+ end
146
239
  end
147
240
  end
148
241
  end
@@ -2,23 +2,20 @@ require 'factory_girl'
2
2
 
3
3
  FactoryGirl.define do
4
4
 
5
- factory :user, class: 'DummyUser' do
5
+ factory :alchemy_dummy_user, class: 'DummyUser' do
6
6
  sequence(:email) { |n| "john.#{n}@doe.com" }
7
7
  password 's3cr3t'
8
+ alchemy_roles ['member']
8
9
 
9
- factory :admin_user do
10
+ trait :as_admin do
10
11
  alchemy_roles ['admin']
11
12
  end
12
13
 
13
- factory :member_user do
14
- alchemy_roles ['member']
15
- end
16
-
17
- factory :author_user do
14
+ trait :as_author do
18
15
  alchemy_roles ['author']
19
16
  end
20
17
 
21
- factory :editor_user do
18
+ trait :as_editor do
22
19
  alchemy_roles ['editor']
23
20
  end
24
21
  end
@@ -3,24 +3,30 @@ module Alchemy
3
3
 
4
4
  # Helpers for integration specs
5
5
  #
6
- # This file is included in rspec integration/request tests.
6
+ # This file is included in spec_helper.rb
7
7
  #
8
8
  module IntegrationHelpers
9
9
 
10
- # Used in Capybara features specs. Stubs the current_alchemy_user
10
+ # Used to stub the current_alchemy_user
11
11
  #
12
- # It mocks an admin user, but you can pass in a user object that would be used as stub.
12
+ # Pass either a user object or a symbol in the format of ':as_admin'.
13
+ # The browser language is set to english ('en')
13
14
  #
14
- def authorize_as_admin(user=nil)
15
- # Ensure that phantomjs has always the same browser language.
16
- if Capybara.current_driver == :poltergeist
17
- page.driver.headers = { 'Accept-Language' => 'en' }
18
- end
19
- if !user
20
- user = mock_model('DummyUser', alchemy_roles: %w(admin), language: 'en')
15
+ def authorize_user(user_or_role = nil)
16
+ if user_or_role.is_a?(Alchemy.user_class)
17
+ user = user_or_role
18
+ else
19
+ user = build(:alchemy_dummy_user, user_or_role)
21
20
  end
21
+ set_phantomjs_browser_language("en")
22
22
  allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user)
23
23
  end
24
+
25
+ def set_phantomjs_browser_language(lang = nil)
26
+ if Capybara.current_driver == :poltergeist
27
+ page.driver.headers = {"Accept-Language" => lang}
28
+ end
29
+ end
24
30
  end
25
31
 
26
32
  end
@@ -22,6 +22,10 @@ class Alchemy::Upgrader::ThreePointTwoTask < Thor
22
22
  { after: sentinel, verbose: true }
23
23
  end
24
24
  end
25
+
26
+ def inject_seeder
27
+ append_file "./db/seeds.rb", "Alchemy::Seeder.seed!\n"
28
+ end
25
29
  end
26
30
  end
27
31
 
@@ -30,10 +34,36 @@ module Alchemy
30
34
  private
31
35
 
32
36
  def upgrade_acts_as_taggable_on_migrations
33
- # We can't invoke this rake task, because Rails will use wrong engine names otherwise
34
- `bundle exec rake railties:install:migrations`
35
- Alchemy::Upgrader::ThreePointTwoTask.new.patch_acts_as_taggable_on_migrations
36
- Rake::Task["db:migrate"].invoke
37
+ desc 'Installs acts_as_taggable_on migrations.'
38
+ if !`bundle exec rake railties:install:migrations FROM=acts_as_taggable_on_engine`.empty?
39
+ Alchemy::Upgrader::ThreePointTwoTask.new.patch_acts_as_taggable_on_migrations
40
+ end
41
+ `bundle exec rake db:migrate`
42
+ end
43
+
44
+ def inject_seeder
45
+ desc 'Add Alchemy seeder to `db/seeds.rb` file.'
46
+ Alchemy::Upgrader::ThreePointTwoTask.new.inject_seeder
47
+ end
48
+
49
+ def alchemy_3_2_todos
50
+ notice = <<-NOTE
51
+
52
+ Capistrano 2 deploy script removed
53
+ ----------------------------------
54
+
55
+ The Capistrano 2 based deploy script has been removed and replaced by an Capistrano 3 extension.
56
+
57
+ Please update your Gemfile:
58
+
59
+ group :development do
60
+ gem 'capistrano-alchemy', github: 'AlchemyCMS/capistrano-alchemy', branch: 'master', require: false
61
+ end
62
+
63
+ For more information please visit https://github.com/AlchemyCMS/capistrano-alchemy.
64
+
65
+ NOTE
66
+ todo notice, 'Alchemy v3.2 changes'
37
67
  end
38
68
  end
39
69
  end
@@ -1,5 +1,5 @@
1
1
  module Alchemy
2
- VERSION = "3.2.0.beta"
2
+ VERSION = "3.2.0.rc1"
3
3
 
4
4
  def self.version
5
5
  VERSION
@@ -0,0 +1,69 @@
1
+ require 'rails'
2
+
3
+ module Alchemy
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+
7
+ desc "Installs Alchemy into your App."
8
+
9
+ class_option :skip_demo_files,
10
+ type: :boolean,
11
+ default: false,
12
+ desc: "Skip creation of demo element, page and application layout."
13
+
14
+ source_root File.expand_path('files', File.dirname(__FILE__))
15
+
16
+ def create_view_dirs
17
+ %w(elements page_layouts).each do |dir|
18
+ empty_directory Rails.root.join("app/views/alchemy/#{dir}")
19
+ end
20
+ end
21
+
22
+ def copy_config
23
+ copy_file "#{config_path}/config.yml",
24
+ Rails.root.join("config/alchemy/config.yml")
25
+ end
26
+
27
+ def copy_yml_files
28
+ %w(elements page_layouts).each do |file|
29
+ template "#{current_path}/templates/#{file}.yml.tt",
30
+ Rails.root.join("config/alchemy/#{file}.yml")
31
+ end
32
+ end
33
+
34
+ def copy_demo_views
35
+ return if @options[:skip_demo_files]
36
+
37
+ copy_file "application.html.erb",
38
+ Rails.root.join("app/views/layouts/application.html.erb")
39
+ copy_file "alchemy.elements.css.scss",
40
+ Rails.root.join("app/assets/stylesheets/alchemy.elements.css.scss")
41
+
42
+ [
43
+ "_article_editor.html.erb",
44
+ "_article_view.html.erb"
45
+ ].each do |file|
46
+ copy_file file, Rails.root.join("app/views/alchemy/elements/#{file}")
47
+ end
48
+
49
+ copy_file "_standard.html.erb",
50
+ Rails.root.join("app/views/alchemy/page_layouts/_standard.html.erb")
51
+
52
+ %w(de en es).each do |locale|
53
+ copy_file "alchemy.#{locale}.yml",
54
+ Rails.root.join("config/locales/alchemy.#{locale}.yml")
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def config_path
61
+ @_config_path ||= File.expand_path('../../../../../config/alchemy', current_path)
62
+ end
63
+
64
+ def current_path
65
+ @_current_path ||= File.dirname(__FILE__)
66
+ end
67
+ end
68
+ end
69
+ end