alchemy_cms 3.6.1 → 3.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/app/models/alchemy/picture/url.rb +9 -1
- data/db/migrate/20160422195310_add_image_file_format_to_alchemy_pictures.rb +0 -12
- data/lib/alchemy/errors.rb +6 -1
- data/lib/alchemy/logger.rb +1 -1
- data/lib/alchemy/tasks/tidy.rb +130 -0
- data/lib/alchemy/upgrader/three_point_four.rb +25 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/tasks/alchemy/tidy.rake +1 -129
- data/lib/tasks/alchemy/upgrade.rake +9 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa89fac8ccee2fe3971a90fa2674a8f6e25f81df
|
4
|
+
data.tar.gz: a8179705ad6aedbaafb0910ddb22cfee157025c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df863653927ec799671903857aea93c53ab3ebd2194eebf1f0cc045c4c64a1acb64715339c6a5e8a416bad84af6f4e3328fb097265737975a4c9d00bac5e6209
|
7
|
+
data.tar.gz: 04b9ec7edeafae429eeb55c40059870e84f36e711e5fbe9d3470875b21374f1c65135ec82ccb25be9b2680ebe366bda5c039df758d58494ff397695472e813a3
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 3.6.2 (2017-09-01)
|
4
|
+
|
5
|
+
* Handle custom errors in `Alchemy::Picture#url` [#1305](https://github.com/AlchemyCMS/alchemy_cms/pull/1305) by [tvdeyen](https://github.com/tvdeyen)
|
6
|
+
* Do not move elements in tidy cells task [#1303](https://github.com/AlchemyCMS/alchemy_cms/pull/1303) by [tvdeyen](https://github.com/tvdeyen)
|
7
|
+
* Add a store image file format rake task [#1302](https://github.com/AlchemyCMS/alchemy_cms/pull/1302) by [tvdeyen](https://github.com/tvdeyen)
|
8
|
+
|
3
9
|
## 3.6.1 (2017-08-16)
|
4
10
|
|
5
11
|
* Do not ask `systempage?` everytime we load the page definition [#1239](https://github.com/AlchemyCMS/alchemy_cms/pull/1283) by [tvdeyen](https://github.com/tvdeyen)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module Alchemy
|
2
2
|
module Picture::Url
|
3
|
+
include Alchemy::Logger
|
4
|
+
|
3
5
|
TRANSFORMATION_OPTIONS = [
|
4
6
|
:crop,
|
5
7
|
:crop_from,
|
@@ -28,6 +30,9 @@ module Alchemy
|
|
28
30
|
image = encoded_image(image, options)
|
29
31
|
|
30
32
|
image.url(options.except(*TRANSFORMATION_OPTIONS).merge(name: name))
|
33
|
+
rescue MissingImageFileError, WrongImageFormatError => e
|
34
|
+
log_warning e.message
|
35
|
+
nil
|
31
36
|
end
|
32
37
|
|
33
38
|
private
|
@@ -53,7 +58,10 @@ module Alchemy
|
|
53
58
|
#
|
54
59
|
def encoded_image(image, options = {})
|
55
60
|
target_format = options[:format] || default_render_format
|
56
|
-
|
61
|
+
|
62
|
+
unless target_format.in?(Alchemy::Picture.allowed_filetypes)
|
63
|
+
raise WrongImageFormatError.new(self, target_format)
|
64
|
+
end
|
57
65
|
|
58
66
|
options = {
|
59
67
|
flatten: target_format != 'gif' && image_file_format == 'gif'
|
@@ -1,18 +1,6 @@
|
|
1
1
|
class AddImageFileFormatToAlchemyPictures < ActiveRecord::Migration
|
2
2
|
def up
|
3
3
|
add_column :alchemy_pictures, :image_file_format, :string
|
4
|
-
|
5
|
-
say_with_time "Storing file format of existing pictures" do
|
6
|
-
Alchemy::Picture.all.each do |pic|
|
7
|
-
begin
|
8
|
-
format = pic.image_file.identify('-ping -format "%m"')
|
9
|
-
pic.update_column('image_file_format', format.to_s.chomp.downcase)
|
10
|
-
rescue Dragonfly::Job::Fetch::NotFound => e
|
11
|
-
say(e.message, true)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
Alchemy::Picture.count
|
15
|
-
end
|
16
4
|
end
|
17
5
|
|
18
6
|
def down
|
data/lib/alchemy/errors.rb
CHANGED
@@ -55,9 +55,14 @@ module Alchemy
|
|
55
55
|
|
56
56
|
# Raised if calling +image_file+ on a Picture object returns nil.
|
57
57
|
class WrongImageFormatError < StandardError
|
58
|
+
def initialize(image, requested_format)
|
59
|
+
@image = image
|
60
|
+
@requested_format = requested_format
|
61
|
+
end
|
62
|
+
|
58
63
|
def message
|
59
64
|
allowed_filetypes = Alchemy::Picture.allowed_filetypes.map(&:upcase).to_sentence
|
60
|
-
"Requested image format is not one of allowed filetypes (#{allowed_filetypes})."
|
65
|
+
"Requested image format (#{@requested_format.inspect}) for #{@image.inspect} is not one of allowed filetypes (#{allowed_filetypes})."
|
61
66
|
end
|
62
67
|
end
|
63
68
|
|
data/lib/alchemy/logger.rb
CHANGED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'alchemy/shell'
|
2
|
+
|
3
|
+
module Alchemy
|
4
|
+
class Tidy
|
5
|
+
extend Shell
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def create_missing_cells(page_layouts, cells)
|
9
|
+
page_layouts.each do |layout|
|
10
|
+
next if layout['cells'].blank?
|
11
|
+
cells_for_layout = cells.select { |cell| layout['cells'].include? cell['name'] }
|
12
|
+
Alchemy::Page.where(page_layout: layout['name']).each do |page|
|
13
|
+
cells_for_layout.each do |cell_for_layout|
|
14
|
+
cell = Alchemy::Cell.find_or_initialize_by(name: cell_for_layout['name'], page_id: page.id)
|
15
|
+
if cell.new_record?
|
16
|
+
log "Creating cell #{cell.name} for page #{page.name}"
|
17
|
+
else
|
18
|
+
log "Cell #{cell.name} for page #{page.name} already present", :skip
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def update_element_positions
|
26
|
+
Alchemy::Page.all.each do |page|
|
27
|
+
if page.elements.any?
|
28
|
+
puts "\n## Updating element positions of page `#{page.name}`"
|
29
|
+
end
|
30
|
+
page.elements.group_by(&:cell_id).each do |_cell_id, elements|
|
31
|
+
elements.each_with_index do |element, idx|
|
32
|
+
position = idx + 1
|
33
|
+
if element.position != position
|
34
|
+
log "Updating position for element ##{element.id} to #{position}"
|
35
|
+
element.update_column(:position, position)
|
36
|
+
else
|
37
|
+
log "Position for element ##{element.id} is already correct (#{position})", :skip
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def update_content_positions
|
45
|
+
Alchemy::Element.all.each do |element|
|
46
|
+
if element.contents.any?
|
47
|
+
puts "\n## Updating content positions of element `#{element.name}`"
|
48
|
+
end
|
49
|
+
element.contents.group_by(&:essence_type).each do |essence_type, contents|
|
50
|
+
puts "-> Contents of type `#{essence_type}`"
|
51
|
+
contents.each_with_index do |content, idx|
|
52
|
+
position = idx + 1
|
53
|
+
if content.position != position
|
54
|
+
log "Updating position for content ##{content.id} to #{position}"
|
55
|
+
content.update_column(:position, position)
|
56
|
+
else
|
57
|
+
log "Position for content ##{content.id} is already correct (#{position})", :skip
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def remove_orphaned_cells
|
65
|
+
puts "\n## Removing orphaned cells"
|
66
|
+
cells = Alchemy::Cell.unscoped.all
|
67
|
+
if cells.any?
|
68
|
+
orphaned_cells = cells.select do |cell|
|
69
|
+
cell.page.nil? && cell.page_id.present?
|
70
|
+
end
|
71
|
+
if orphaned_cells.any?
|
72
|
+
log "Found #{orphaned_cells.size} orphaned cells"
|
73
|
+
destroy_orphaned_records(orphaned_cells, 'cell')
|
74
|
+
else
|
75
|
+
log "No orphaned cells found", :skip
|
76
|
+
end
|
77
|
+
else
|
78
|
+
log "No cells found", :skip
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def remove_orphaned_elements
|
83
|
+
puts "\n## Removing orphaned elements"
|
84
|
+
elements = Alchemy::Element.unscoped.all
|
85
|
+
if elements.any?
|
86
|
+
orphaned_elements = elements.select do |element|
|
87
|
+
element.page.nil? && element.page_id.present? ||
|
88
|
+
element.cell.nil? && element.cell_id.present?
|
89
|
+
end
|
90
|
+
if orphaned_elements.any?
|
91
|
+
log "Found #{orphaned_elements.size} orphaned elements"
|
92
|
+
destroy_orphaned_records(orphaned_elements, 'element')
|
93
|
+
else
|
94
|
+
log "No orphaned elements found", :skip
|
95
|
+
end
|
96
|
+
else
|
97
|
+
log "No elements found", :skip
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def remove_orphaned_contents
|
102
|
+
puts "\n## Removing orphaned contents"
|
103
|
+
contents = Alchemy::Content.unscoped.all
|
104
|
+
if contents.any?
|
105
|
+
orphaned_contents = contents.select do |content|
|
106
|
+
content.essence.nil? && content.essence_id.present? ||
|
107
|
+
content.element.nil? && content.element_id.present?
|
108
|
+
end
|
109
|
+
if orphaned_contents.any?
|
110
|
+
log "Found #{orphaned_contents.size} orphaned contents"
|
111
|
+
destroy_orphaned_records(orphaned_contents, 'content')
|
112
|
+
else
|
113
|
+
log "No orphaned contents found", :skip
|
114
|
+
end
|
115
|
+
else
|
116
|
+
log "No contents found", :skip
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def destroy_orphaned_records(records, class_name)
|
123
|
+
records.each do |record|
|
124
|
+
log "Destroy orphaned #{class_name}: #{record.inspect}"
|
125
|
+
record.destroy
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -6,5 +6,30 @@ module Alchemy
|
|
6
6
|
desc 'Install asset manifests into `vendor/assets`'
|
7
7
|
Alchemy::Upgrader::Tasks::InstallAssetManifests.new.install
|
8
8
|
end
|
9
|
+
|
10
|
+
def self.store_image_file_format
|
11
|
+
desc 'Store image file format'
|
12
|
+
pictures = Alchemy::Picture.where(image_file_format: nil)
|
13
|
+
count = pictures.size
|
14
|
+
converted_pics = 0
|
15
|
+
errored_pics = 0
|
16
|
+
puts "-- Storing file format of #{count} pictures"
|
17
|
+
pictures.find_each(batch_size: 100).with_index do |pic, i|
|
18
|
+
begin
|
19
|
+
puts " -> Reading file format of #{pic.image_file_name} (#{i + 1}/#{count})"
|
20
|
+
format = pic.image_file.identify('-ping -format "%m"')
|
21
|
+
pic.update_column('image_file_format', format.to_s.chomp.downcase)
|
22
|
+
converted_pics += 1
|
23
|
+
rescue Dragonfly::Job::Fetch::NotFound => e
|
24
|
+
puts " -> #{e.message}"
|
25
|
+
errored_pics += 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
puts "-- Done! Converted #{converted_pics} images."
|
29
|
+
unless errored_pics.zero?
|
30
|
+
puts " !! But #{errored_pics} images caused errors."
|
31
|
+
puts " Please check errors above and re-run `rake alchemy:upgrade:3.4:store_image_file_format`"
|
32
|
+
end
|
33
|
+
end
|
9
34
|
end
|
10
35
|
end
|
data/lib/alchemy/version.rb
CHANGED
data/lib/tasks/alchemy/tidy.rake
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'alchemy/
|
1
|
+
require 'alchemy/tasks/tidy'
|
2
2
|
|
3
3
|
namespace :alchemy do
|
4
4
|
namespace :tidy do
|
@@ -58,131 +58,3 @@ namespace :alchemy do
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
62
|
-
module Alchemy
|
63
|
-
class Tidy
|
64
|
-
extend Shell
|
65
|
-
|
66
|
-
class << self
|
67
|
-
def create_missing_cells(page_layouts, cells)
|
68
|
-
page_layouts.each do |layout|
|
69
|
-
next if layout['cells'].blank?
|
70
|
-
cells_for_layout = cells.select { |cell| layout['cells'].include? cell['name'] }
|
71
|
-
Alchemy::Page.where(page_layout: layout['name']).each do |page|
|
72
|
-
cells_for_layout.each do |cell_for_layout|
|
73
|
-
cell = Alchemy::Cell.find_or_initialize_by(name: cell_for_layout['name'], page_id: page.id)
|
74
|
-
cell.elements << page.elements.select { |element| cell_for_layout['elements'].include?(element.name) }
|
75
|
-
if cell.new_record?
|
76
|
-
cell.save
|
77
|
-
log "Creating cell #{cell.name} for page #{page.name}"
|
78
|
-
else
|
79
|
-
log "Cell #{cell.name} for page #{page.name} already present", :skip
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def update_element_positions
|
87
|
-
Alchemy::Page.all.each do |page|
|
88
|
-
if page.elements.any?
|
89
|
-
puts "\n## Updating element positions of page `#{page.name}`"
|
90
|
-
end
|
91
|
-
page.elements.group_by(&:cell_id).each do |_cell_id, elements|
|
92
|
-
elements.each_with_index do |element, idx|
|
93
|
-
position = idx + 1
|
94
|
-
if element.position != position
|
95
|
-
log "Updating position for element ##{element.id} to #{position}"
|
96
|
-
element.update_column(:position, position)
|
97
|
-
else
|
98
|
-
log "Position for element ##{element.id} is already correct (#{position})", :skip
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def update_content_positions
|
106
|
-
Alchemy::Element.all.each do |element|
|
107
|
-
if element.contents.any?
|
108
|
-
puts "\n## Updating content positions of element `#{element.name}`"
|
109
|
-
end
|
110
|
-
element.contents.group_by(&:essence_type).each do |essence_type, contents|
|
111
|
-
puts "-> Contents of type `#{essence_type}`"
|
112
|
-
contents.each_with_index do |content, idx|
|
113
|
-
position = idx + 1
|
114
|
-
if content.position != position
|
115
|
-
log "Updating position for content ##{content.id} to #{position}"
|
116
|
-
content.update_column(:position, position)
|
117
|
-
else
|
118
|
-
log "Position for content ##{content.id} is already correct (#{position})", :skip
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def remove_orphaned_cells
|
126
|
-
puts "\n## Removing orphaned cells"
|
127
|
-
cells = Alchemy::Cell.unscoped.all
|
128
|
-
if cells.any?
|
129
|
-
orphaned_cells = cells.select do |cell|
|
130
|
-
cell.page.nil? && cell.page_id.present?
|
131
|
-
end
|
132
|
-
if orphaned_cells.any?
|
133
|
-
destroy_orphaned_records(orphaned_cells, 'cell')
|
134
|
-
else
|
135
|
-
log "No orphaned cells found", :skip
|
136
|
-
end
|
137
|
-
else
|
138
|
-
log "No cells found", :skip
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
def remove_orphaned_elements
|
143
|
-
puts "\n## Removing orphaned elements"
|
144
|
-
elements = Alchemy::Element.unscoped.all
|
145
|
-
if elements.any?
|
146
|
-
orphaned_elements = elements.select do |element|
|
147
|
-
element.page.nil? && element.page_id.present? ||
|
148
|
-
element.cell.nil? && element.cell_id.present?
|
149
|
-
end
|
150
|
-
if orphaned_elements.any?
|
151
|
-
destroy_orphaned_records(orphaned_elements, 'element')
|
152
|
-
else
|
153
|
-
log "No orphaned elements found", :skip
|
154
|
-
end
|
155
|
-
else
|
156
|
-
log "No elements found", :skip
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def remove_orphaned_contents
|
161
|
-
puts "\n## Removing orphaned contents"
|
162
|
-
contents = Alchemy::Content.unscoped.all
|
163
|
-
if contents.any?
|
164
|
-
orphaned_contents = contents.select do |content|
|
165
|
-
content.essence.nil? && content.essence_id.present? ||
|
166
|
-
content.element.nil? && content.element_id.present?
|
167
|
-
end
|
168
|
-
if orphaned_contents.any?
|
169
|
-
destroy_orphaned_records(orphaned_contents, 'content')
|
170
|
-
else
|
171
|
-
log "No orphaned contents found", :skip
|
172
|
-
end
|
173
|
-
else
|
174
|
-
log "No contents found", :skip
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
private
|
179
|
-
|
180
|
-
def destroy_orphaned_records(records, class_name)
|
181
|
-
records.each do |record|
|
182
|
-
log "Destroy orphaned #{class_name}: #{record.id}"
|
183
|
-
record.destroy
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
@@ -148,12 +148,20 @@ namespace :alchemy do
|
|
148
148
|
task '3.4' => ['alchemy:upgrade:prepare', 'alchemy:upgrade:3.4:run']
|
149
149
|
|
150
150
|
namespace '3.4' do
|
151
|
-
task run: [
|
151
|
+
task run: [
|
152
|
+
'alchemy:upgrade:3.4:install_asset_manifests',
|
153
|
+
'alchemy:upgrade:3.4:store_image_file_format'
|
154
|
+
]
|
152
155
|
|
153
156
|
desc 'Install asset manifests into `vendor/assets`'
|
154
157
|
task install_asset_manifests: [:environment] do
|
155
158
|
Alchemy::Upgrader::ThreePointFour.install_asset_manifests
|
156
159
|
end
|
160
|
+
|
161
|
+
desc 'Store image file format on Alchemy pictures.'
|
162
|
+
task store_image_file_format: [:environment] do
|
163
|
+
Alchemy::Upgrader::ThreePointFour.store_image_file_format
|
164
|
+
end
|
157
165
|
end
|
158
166
|
|
159
167
|
desc 'Upgrade Alchemy to v3.5'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy_cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.6.
|
4
|
+
version: 3.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas von Deyen
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2017-
|
16
|
+
date: 2017-09-01 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: active_model_serializers
|
@@ -847,6 +847,7 @@ files:
|
|
847
847
|
- lib/alchemy/shell.rb
|
848
848
|
- lib/alchemy/ssl_protection.rb
|
849
849
|
- lib/alchemy/tasks/helpers.rb
|
850
|
+
- lib/alchemy/tasks/tidy.rb
|
850
851
|
- lib/alchemy/test_support/config_stubbing.rb
|
851
852
|
- lib/alchemy/test_support/controller_requests.rb
|
852
853
|
- lib/alchemy/test_support/essence_shared_examples.rb
|