alchemy_cms 2.6.1 → 2.6.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,79 @@
1
+ module Alchemy
2
+ module Upgrader::TwoPointFive
3
+
4
+ private
5
+
6
+ def convert_picture_storage
7
+ desc "Convert the picture storage"
8
+ converted_images = []
9
+ images = Dir.glob Rails.root.join 'uploads/pictures/**/*.*'
10
+ if images.blank?
11
+ log "No pictures found", :skip
12
+ else
13
+ images.each do |image|
14
+ image_uid = image.gsub(/#{Rails.root.to_s}\/uploads\/pictures\//, '')
15
+ image_id = image_uid.split('/').last.split('.').first
16
+ picture = Alchemy::Picture.find_by_id(image_id)
17
+ if picture && picture.image_file_uid.blank?
18
+ picture.image_file_uid = image_uid
19
+ picture.image_file_size = File.new(image).size
20
+ if picture.save!
21
+ log "Converted #{image_uid}"
22
+ end
23
+ else
24
+ log "Picture with id #{image_id} not found or already converted.", :skip
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ def removed_standard_set_notice
31
+ warn = <<-WARN
32
+ We removed the standard set from Alchemy core!
33
+ In order to get the standard set back, install the `alchemy-demo_kit` gem.
34
+ WARN
35
+ todo warn
36
+ end
37
+
38
+ def renamed_t_method
39
+ warn = <<-WARN
40
+ We renamed alchemy's `t` method override into `_t` to avoid conflicts with Rails own t method!
41
+ If you use the `t` method to translate alchemy scoped keys, then you have to use the `_t` method from now on.
42
+ WARN
43
+ todo warn
44
+ end
45
+
46
+ def migrated_to_devise
47
+ warn = <<-WARN
48
+ We changed the authentication provider from Authlogic to Devise.
49
+
50
+ If you are upgrading from an old Alchemy version < 2.5.0, then you have to make changes to your Devise configuration.
51
+
52
+ 1. Run:
53
+
54
+ $ rails g alchemy:devise
55
+
56
+ And alter the encryptor to authlogic_sha512
57
+ and the stretches value from 10 to 20
58
+
59
+ # config/initializers/devise.rb
60
+ config.stretches = Rails.env.test? ? 1 : 20
61
+ config.encryptor = :authlogic_sha512
62
+
63
+ 2. Add the encryptable module to your Alchemy config.yml:
64
+
65
+ # config/alchemy/config.yml
66
+ devise_modules:
67
+ - :database_authenticatable
68
+ - :trackable
69
+ - :validatable
70
+ - :timeoutable
71
+ - :recoverable
72
+ - :encryptable
73
+
74
+ WARN
75
+ todo warn
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,25 @@
1
+ module Alchemy
2
+ module Upgrader::TwoPointFour
3
+
4
+ private
5
+
6
+ def removed_richmedia_essences_notice
7
+ warn = <<-WARN
8
+ We removed the EssenceAudio, EssenceFlash and EssenceVideo essences from Alchemy core!
9
+
10
+ In order to get the essences back, install the `alchemy-richmedia-essences` gem.
11
+
12
+ gem 'alchemy-richmedia-essences'
13
+
14
+ We left the tables in your database, you can simply drop them if you don't use these essences in your project.
15
+
16
+ drop_table :alchemy_essence_audios
17
+ drop_table :alchemy_essence_flashes
18
+ drop_table :alchemy_essence_videos
19
+
20
+ WARN
21
+ todo warn
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,95 @@
1
+ module Alchemy
2
+ module Upgrader::TwoPointOne
3
+
4
+ private
5
+
6
+ # Creates Language model if it does not exist (Alchemy CMS prior v1.5)
7
+ # Also creates missing associations between pages and languages
8
+ def upgrade_to_language
9
+ desc "Creating languages for pages"
10
+ Alchemy::Page.all.each do |page|
11
+ if !page.language_code.blank? && page.language.nil?
12
+ root = page.get_language_root
13
+ lang = Alchemy::Language.find_or_create_by_language_code(
14
+ :name => page.language_code.capitalize,
15
+ :language_code => page.language_code,
16
+ :frontpage_name => root.name,
17
+ :page_layout => root.page_layout,
18
+ :public => true
19
+ )
20
+ page.language = lang
21
+ if page.save(:validate => false)
22
+ log "Set language for page #{page.name} to #{lang.name}."
23
+ end
24
+ else
25
+ log("Language for page #{page.name} already set.", :skip)
26
+ end
27
+ end
28
+ end
29
+
30
+ def upgrade_layoutpages
31
+ desc "Setting language of layoutpages"
32
+ default_language = Alchemy::Language.get_default
33
+ raise "No default language found." if default_language.nil?
34
+ layoutpages = Alchemy::Page.layoutpages
35
+ if layoutpages.any?
36
+ layoutpages.each do |page|
37
+ if page.language.class == String || page.language.nil?
38
+ page.language = default_language
39
+ if page.save(:validate => false)
40
+ log "Set language for page #{page.name} to #{default_language.name}."
41
+ end
42
+ else
43
+ log "Language for page #{page.name} already set.", :skip
44
+ end
45
+ end
46
+ else
47
+ log "No layoutpages found.", :skip
48
+ end
49
+ end
50
+
51
+ def upgrade_essence_link_target_default
52
+ desc "Setting new link_target default"
53
+ essences = (Alchemy::EssencePicture.all + Alchemy::EssenceText.all)
54
+ if essences.any?
55
+ essences.each do |essence|
56
+ case essence.link_target
57
+ when '1'
58
+ if essence.update_attribute(:link_target, 'blank')
59
+ log("Updated #{essence.preview_text} link target to #{essence.link_target}.")
60
+ end
61
+ when '0'
62
+ essence.update_attribute(:link_target, nil)
63
+ log("Updated #{essence.preview_text} link target to #{essence.link_target.inspect}.")
64
+ else
65
+ log("#{essence.preview_text} already upgraded.", :skip)
66
+ end
67
+ end
68
+ else
69
+ log("No essences to upgrade found.", :skip)
70
+ end
71
+ end
72
+
73
+ # Updates all essence_type of Content if not already namespaced.
74
+ def upgrade_to_namespaced_essence_type
75
+ desc "Namespacing essence_type columns"
76
+ depricated_contents = Alchemy::Content.where("essence_type LIKE ?", "Essence%")
77
+ if depricated_contents.any?
78
+ success = 0
79
+ errors = []
80
+ depricated_contents.each do |c|
81
+ if c.update_attribute(:essence_type, c.essence_type.gsub(/^Essence/, 'Alchemy::Essence'))
82
+ success += 1
83
+ else
84
+ errors << c.errors.full_messages
85
+ end
86
+ end
87
+ log("Namespaced #{success} essence_type columns.") if success > 0
88
+ log("#{errors.count} errors while namespacing essence_type columns.\n#{errors.join('\n')}", :error) if errors.count > 0
89
+ else
90
+ log "No essence_type columns to be namespaced found.", :skip
91
+ end
92
+ end
93
+
94
+ end
95
+ end
@@ -0,0 +1,32 @@
1
+ module Alchemy
2
+ module Upgrader::TwoPointSix
3
+
4
+ private
5
+
6
+ def convert_attachment_storage
7
+ desc "Convert the attachment storage"
8
+ converted_files = []
9
+ files = Dir.glob Rails.root.join 'uploads/attachments/**/*.*'
10
+ if files.blank?
11
+ log "No attachments found", :skip
12
+ else
13
+ files.each do |file|
14
+ file_uid = file.gsub(/#{Rails.root.to_s}\/uploads\/attachments\//, '')
15
+ file_id = file_uid.split('/')[1].to_i
16
+ attachment = Alchemy::Attachment.find_by_id(file_id)
17
+ if attachment && attachment.file_uid.blank?
18
+ attachment.file_uid = file_uid
19
+ attachment.file_size = File.new(file).size
20
+ attachment.file_name = attachment.sanitized_filename
21
+ if attachment.save!
22
+ log "Converted #{file_uid}"
23
+ end
24
+ else
25
+ log "Attachment with id #{file_id} not found or already converted.", :skip
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,25 @@
1
+ module Alchemy
2
+ module Upgrader::TwoPointThree
3
+
4
+ private
5
+
6
+ def gallery_pictures_change_notice
7
+ note =<<NOTE
8
+ We have changed the way Alchemy handles EssencePictures in elements.
9
+
10
+ It is now possible to have single EssencePictures and galleries side by side in the same element.
11
+ All element editor views containing render_picture_editor with option `maximum_amount_of_images => 1` must be changed into render_essence_editor_by_name.
12
+ In the yml description of these elements add a new content for this picture.
13
+
14
+ In order to upgrade your elements in the database run:
15
+
16
+ rails g alchemy:gallery_pictures_migration
17
+
18
+ and alter `db/seeds.rb`, so that it contains all elements that have essence pictures.
19
+
20
+ NOTE
21
+ todo note
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,69 @@
1
+ module Alchemy
2
+ module Upgrader::TwoPointTwo
3
+
4
+ private
5
+
6
+ def convert_essence_texts_displayed_as_select_into_essence_selects
7
+ desc "Converting EssenceTexts displayed as select into EssenceSelects"
8
+ contents_found = 0
9
+ elements = Alchemy::Element.descriptions.select { |e| e['contents'].present? && !e['contents'].detect { |c| c['settings'].present? && c['settings']['display_as'] == 'select' }.nil? }
10
+ contents = elements.collect { |el| el['contents'] }.flatten.select { |c| c['settings'] && c['settings']['display_as'] == 'select' }.flatten
11
+ content_names = contents.collect { |c| c['name'] }
12
+ Alchemy::Content.essence_texts.where(
13
+ :name => content_names,
14
+ :alchemy_elements => {:name => elements.collect { |e| e['name'] }}
15
+ ).joins(:element).each do |content|
16
+ new_content = Alchemy::Content.new(:name => content.name, :element_id => content.element.id)
17
+ if new_content.create_essence!('name' => content.name, 'type' => 'EssenceSelect')
18
+ new_content.essence.value = content.ingredient
19
+ if new_content.essence.save
20
+ contents_found += 1
21
+ log "Converted #{content.name}'s essence_type into EssenceSelect"
22
+ content.destroy
23
+ else
24
+ log "Could not save essence: #{new_content.essence.errors.full_messages.join(', ')}", :error
25
+ end
26
+ else
27
+ log "Could not create content: #{new_content.errors.full_messages.join(', ')}", :error
28
+ end
29
+ end
30
+ if contents_found > 0
31
+ todo "Please open your elements.yml file and change all type values from these contents:\n\n#{content_names.join(', ')}\n\ninto EssenceSelect."
32
+ else
33
+ log "No EssenceTexts with display_as select setting found.", :skip
34
+ end
35
+ end
36
+
37
+ def convert_essence_texts_displayed_as_checkbox_into_essence_booleans
38
+ desc "Converting EssenceTexts displayed as checkbox into EssenceBooleans"
39
+ contents_found = 0
40
+ elements = Alchemy::Element.descriptions.select { |e| e['contents'].present? && !e['contents'].detect { |c| c['settings'].present? && c['settings']['display_as'] == 'checkbox' }.nil? }
41
+ contents = elements.collect { |el| el['contents'] }.flatten.select { |c| c['settings'] && c['settings']['display_as'] == 'checkbox' }.flatten
42
+ content_names = contents.collect { |c| c['name'] }
43
+ Alchemy::Content.essence_texts.where(
44
+ :name => content_names,
45
+ :alchemy_elements => {:name => elements.collect { |e| e['name'] }}
46
+ ).joins(:element).each do |content|
47
+ new_content = Alchemy::Content.new(:name => content.name, :element_id => content.element.id)
48
+ if new_content.create_essence!('name' => content.name, 'type' => 'EssenceBoolean')
49
+ new_content.essence.value = content.ingredient
50
+ if new_content.essence.save
51
+ contents_found += 1
52
+ log "Converted #{content.name}'s essence_type into EssenceBoolean"
53
+ content.destroy
54
+ else
55
+ log "Could not save essence: #{new_content.essence.errors.full_messages.join(', ')}", :error
56
+ end
57
+ else
58
+ log "Could not create content: #{new_content.errors.full_messages.join(', ')}", :error
59
+ end
60
+ end
61
+ if contents_found > 0
62
+ todo "Please open your elements.yml file and change all type values from these contents:\n\n#{content_names.join(', ')}\n\ninto EssenceBoolean."
63
+ else
64
+ log "No EssenceTexts with display_as checkbox setting found.", :skip
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,13 @@
1
+ module Alchemy
2
+ module Upgrader::TwoPointZero
3
+
4
+ private
5
+
6
+ def strip_alchemy_from_schema_version_table
7
+ ActiveRecord::Base.connection.execute(
8
+ "UPDATE schema_migrations SET version = REPLACE(version,'-alchemy','')"
9
+ )
10
+ end
11
+
12
+ end
13
+ end
@@ -1,6 +1,6 @@
1
1
  module Alchemy
2
2
 
3
- VERSION = "2.6.1"
3
+ VERSION = "2.6.2"
4
4
 
5
5
  def self.version
6
6
  VERSION
@@ -12,7 +12,7 @@ namespace :alchemy do
12
12
  task :list => [:environment] do
13
13
  puts "\nAvailable upgrade tasks"
14
14
  puts "-----------------------\n"
15
- methods = (Alchemy::Upgrader.private_methods - Object.private_methods - Alchemy::Upgrader.superclass.private_methods)
15
+ methods = Alchemy::Upgrader.all_upgrade_tasks
16
16
  if methods.any?
17
17
  methods.each { |method| puts method }
18
18
  puts "\nUsage:"
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+ require 'ostruct'
3
+
4
+ describe Alchemy::MountPoint do
5
+
6
+ describe '.get' do
7
+
8
+ it "returns the path of alchemy's mount point" do
9
+ Alchemy::MountPoint.stub!(:mount_point).and_return('/cms')
10
+ Alchemy::MountPoint.get.should == '/cms'
11
+ end
12
+
13
+ it "removes the leading slash if root mount point" do
14
+ Alchemy::MountPoint.stub!(:mount_point).and_return('/')
15
+ Alchemy::MountPoint.get.should == ''
16
+ end
17
+
18
+ context "with remove_leading_slash_if_blank set to false" do
19
+ before {
20
+ Alchemy::MountPoint.stub!(:mount_point).and_return('/')
21
+ }
22
+
23
+ it "does not remove the leading white slash of path" do
24
+ Alchemy::MountPoint.get(false).should == '/'
25
+ end
26
+
27
+ context "and with mount point not root" do
28
+ before {
29
+ Alchemy::MountPoint.stub!(:mount_point).and_return('/cms')
30
+ }
31
+
32
+ it "does not remove the leading white slash of path" do
33
+ Alchemy::MountPoint.get(false).should == '/cms'
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '.routes' do
40
+ it "returns the routes object from alchemy engine" do
41
+ Alchemy::MountPoint.routes.should be_instance_of(Journey::Route)
42
+ end
43
+ end
44
+
45
+ describe '.mount_point' do
46
+ it 'returns the raw mount point path from routes' do
47
+ Alchemy::MountPoint.stub!(:routes).and_return(OpenStruct.new(path: OpenStruct.new(spec: '/cms')))
48
+ Alchemy::MountPoint.mount_point.should == '/cms'
49
+ end
50
+
51
+ context "Alchemy routes could not be found" do
52
+ before {
53
+ Alchemy::MountPoint.stub!(:routes).and_return(nil)
54
+ }
55
+
56
+ it "falls back to root path" do
57
+ Alchemy::MountPoint.mount_point.should == '/'
58
+ end
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+
3
+ module Alchemy
4
+
5
+ # Class fixture
6
+ class MyToDoList
7
+ extend Shell
8
+ end
9
+
10
+ describe Shell do
11
+
12
+ before { MyToDoList.stub!(:puts) }
13
+
14
+ describe '.todo' do
15
+ it "should add given string as a todo by delegating to .add_todo" do
16
+ MyToDoList.should_receive(:add_todo).with("new todo")
17
+ MyToDoList.todo("new todo")
18
+ end
19
+ end
20
+
21
+ describe '.todos' do
22
+ it "should be an Array" do
23
+ expect(MyToDoList.todos).to be_a(Array)
24
+ end
25
+ end
26
+
27
+ describe '.add_todo' do
28
+ it "should add the given string to the .todos array" do
29
+ MyToDoList.add_todo('1')
30
+ MyToDoList.add_todo('2')
31
+ expect(MyToDoList.todos).to eq(['1', '2'])
32
+ end
33
+ end
34
+
35
+ describe '.display_todos' do
36
+ context 'if there are todos in the list' do
37
+ before do
38
+ MyToDoList.stub!(:todos).and_return(['My first todo', 'My second todo'])
39
+ end
40
+
41
+ it "should log them" do
42
+ MyToDoList.should_receive(:log).any_number_of_times
43
+ MyToDoList.display_todos
44
+ end
45
+
46
+ it "should iterate through the todos with an index" do
47
+ MyToDoList.todos.should_receive(:each_with_index)
48
+ MyToDoList.display_todos
49
+ end
50
+ end
51
+
52
+ context 'if there are todos in the list' do
53
+ before do
54
+ MyToDoList.stub!(:todos).and_return([])
55
+ end
56
+
57
+ it "should not log anything" do
58
+ MyToDoList.should_not_receive(:log)
59
+ MyToDoList.display_todos
60
+ end
61
+ end
62
+ end
63
+
64
+ describe '.log' do
65
+
66
+ context 'if the message type is "skip"' do
67
+ it "the output color should be yellow and cleared again" do
68
+ MyToDoList.should_receive(:color).with(:yellow)
69
+ MyToDoList.should_receive(:color).with(:clear)
70
+ MyToDoList.log('in yellow, please', :skip)
71
+ end
72
+ end
73
+
74
+ context 'if the message type is "error"' do
75
+ it "the output color should be yellow and cleared again" do
76
+ MyToDoList.should_receive(:color).with(:red)
77
+ MyToDoList.should_receive(:color).with(:clear)
78
+ MyToDoList.log('in red, please', :error)
79
+ end
80
+ end
81
+
82
+ context 'if the message type is "message"' do
83
+ it "the output color should just be cleared" do
84
+ MyToDoList.should_receive(:color).with(:clear)
85
+ MyToDoList.log('cleared, please', :message)
86
+ end
87
+ end
88
+
89
+ context 'if no message type is given' do
90
+ it "the output color should be green" do
91
+ MyToDoList.should_receive(:color).with(:green)
92
+ MyToDoList.should_receive(:color).with(:clear)
93
+ MyToDoList.log('in green, please')
94
+ end
95
+ end
96
+ end
97
+
98
+ describe '.color' do
99
+
100
+ context 'if given name is a constant of Thor::Shell::Color' do
101
+ before do
102
+ Thor::Shell::Color.stub!(:const_defined?).and_return(true)
103
+ end
104
+
105
+ it "should call the constant" do
106
+ String.any_instance.should_receive(:constantize).and_return('')
107
+ MyToDoList.send(:color, :red)
108
+ end
109
+ end
110
+
111
+ context 'if given name is not a defined constant of Thor::Shell::Color' do
112
+ before do
113
+ Thor::Shell::Color.stub!(:const_defined?).and_return(false)
114
+ end
115
+
116
+ it "should return en empty string" do
117
+ expect(MyToDoList.send(:color, :not_existing)).to eq('')
118
+ end
119
+ end
120
+ end
121
+
122
+ end
123
+ end