alchemy_cms 5.1.1 → 5.1.5

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.

Potentially problematic release.


This version of alchemy_cms might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26151f079727fc910a0425ec586606fdaa184dfc94b95757b4655630222138ed
4
- data.tar.gz: 4a0f82f3b3ee7e28fad01b662f467b8eeec411dae15afa0253befb2d777501e6
3
+ metadata.gz: e22cad36f7f22bd3c584b8ec7449098db4664356f44f3dc502ec03b40f6fb37e
4
+ data.tar.gz: e762d80d1be086a4da0063956187caea7824bf67c556ecb11856af3a33c18988
5
5
  SHA512:
6
- metadata.gz: 8eb46f1505bb2b18e0d0f2331ac4b603910cfac6fd97d092188203eb408a8736486d13013b12dc6041bacce977330ceb706dc27001c1bf0429d1165852dab28c
7
- data.tar.gz: ae47388fe6a4465ad07dda2edd32b7c168168e2b69df4ea629b813dea7d283b0de794b00c8232c23f5872e51a73cea123c207ff003755ab27ab178fc5cf51fc8
6
+ metadata.gz: b1e60d6b1edbc55f0419a168296067ac0de8860825288e07c9aa063fc80fde587c8cf18c59d2809a500a13588dfdabdeab038fa0bb83a7811c56d77827005467
7
+ data.tar.gz: 7f6be2a004959880f66a56007c9648c50ad5ce7f3355e40acc5a487fcdacc82c866fcb291c186b84134903de7019aadbf929e6cc96655e6c61e6d6a64a7be8e6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ ## 5.1.5 (2021-09-15)
2
+
3
+ - generate picture thumbnails only for pictures with convertible format [#2131](https://github.com/AlchemyCMS/alchemy_cms/pull/2131) ([afdev82](https://github.com/afdev82))
4
+ - Backport #2115 to v5.1 [#2125](https://github.com/AlchemyCMS/alchemy_cms/pull/2125) ([dbwinger](https://github.com/dbwinger))
5
+ - Backport #2114 to v5.1 [#2117](https://github.com/AlchemyCMS/alchemy_cms/pull/2117) ([afdev82](https://github.com/afdev82))
6
+
7
+ ## 5.1.4 (2021-05-13)
8
+
9
+ - Fix alchemy:generate:thumbnails task [#2092](https://github.com/AlchemyCMS/alchemy_cms/pull/2092) ([afdev82](https://github.com/afdev82))
10
+ - Do not attempt to generate thumbs for svg files. [#2090](https://github.com/AlchemyCMS/alchemy_cms/pull/2090) ([oneiros](https://github.com/oneiros))
11
+
12
+ ## 5.1.3 (2021-05-06)
13
+
14
+ - Use symbols in polymorphic routes for resources [#2087](https://github.com/AlchemyCMS/alchemy_cms/pull/2087) ([tvdeyen](https://github.com/tvdeyen))
15
+ - Backport #2049 to 5.1 [#2059](https://github.com/AlchemyCMS/alchemy_cms/pull/2059) ([rickythefox](https://github.com/rickythefox))
16
+ ## 5.1.2 (2021-01-26)
17
+
18
+ - Allow to safe hidden elements [#2007](https://github.com/AlchemyCMS/alchemy_cms/pull/2007) ([tvdeyen](https://github.com/tvdeyen))
19
+
1
20
  ## 5.1.1 (2021-01-12)
2
21
 
3
22
  - Fix copy element feature [#1996](https://github.com/AlchemyCMS/alchemy_cms/pull/1996) ([tvdeyen](https://github.com/tvdeyen))
data/Gemfile CHANGED
@@ -13,6 +13,11 @@ gem "mysql2", "~> 0.5.1" if ENV["DB"] == "mysql"
13
13
  gem "pg", "~> 1.0" if ENV["DB"] == "postgresql"
14
14
 
15
15
  group :development, :test do
16
+ # execjs 2.8 removes deprecation warnings but also breaks a number of dependent projects.
17
+ # in our case the culprit is `handlebars-assets`. The changes between 2.7.0 and 2.8.0 are
18
+ # minimal, but breaking.
19
+ gem "execjs", "= 2.7.0"
20
+
16
21
  if ENV["GITHUB_ACTIONS"]
17
22
  gem "sassc", "~> 2.4.0" # https://github.com/sass/sassc-ruby/issues/146
18
23
  else
data/alchemy_cms.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |gem|
23
23
  gem.add_runtime_dependency 'awesome_nested_set', ['~> 3.1']
24
24
  gem.add_runtime_dependency 'cancancan', ['>= 2.1', '< 4.0']
25
25
  gem.add_runtime_dependency 'coffee-rails', ['>= 4.0', '< 6.0']
26
- gem.add_runtime_dependency 'dragonfly', ['~> 1.0', '>= 1.0.7']
26
+ gem.add_runtime_dependency 'dragonfly', ['~> 1.0', '>= 1.0.7', '< 1.4.0']
27
27
  gem.add_runtime_dependency 'dragonfly_svg', ['~> 0.0.4']
28
28
  gem.add_runtime_dependency 'gutentag', ['~> 2.2', '>= 2.2.1']
29
29
  gem.add_runtime_dependency 'handlebars_assets', ['~> 0.23']
@@ -8,6 +8,17 @@ module Alchemy
8
8
  "alchemy/admin/elements/element"
9
9
  end
10
10
 
11
+ # Returns content editor instances for defined contents
12
+ #
13
+ # Creates contents on demand if the content is not yet present on the element
14
+ #
15
+ # @return Array<Alchemy::ContentEditor>
16
+ def contents
17
+ element.definition.fetch(:contents, []).map do |content|
18
+ Alchemy::ContentEditor.new(find_or_create_content(content[:name]))
19
+ end
20
+ end
21
+
11
22
  # CSS classes for the element editor partial.
12
23
  def css_classes
13
24
  [
@@ -36,5 +47,60 @@ module Alchemy
36
47
 
37
48
  super
38
49
  end
50
+
51
+ # Returns a deprecation notice for elements marked deprecated
52
+ #
53
+ # You can either use localizations or pass a String as notice
54
+ # in the element definition.
55
+ #
56
+ # == Custom deprecation notices
57
+ #
58
+ # Use general element deprecation notice
59
+ #
60
+ # - name: old_element
61
+ # deprecated: true
62
+ #
63
+ # Add a translation to your locale file for a per element notice.
64
+ #
65
+ # en:
66
+ # alchemy:
67
+ # element_deprecation_notices:
68
+ # old_element: Foo baz widget is deprecated
69
+ #
70
+ # or use the global translation that apply to all deprecated elements.
71
+ #
72
+ # en:
73
+ # alchemy:
74
+ # element_deprecation_notice: Foo baz widget is deprecated
75
+ #
76
+ # or pass string as deprecation notice.
77
+ #
78
+ # - name: old_element
79
+ # deprecated: This element will be removed soon.
80
+ #
81
+ def deprecation_notice
82
+ case definition["deprecated"]
83
+ when String
84
+ definition["deprecated"]
85
+ when TrueClass
86
+ Alchemy.t(name,
87
+ scope: :element_deprecation_notices,
88
+ default: Alchemy.t(:element_deprecated))
89
+ end
90
+ end
91
+
92
+ private
93
+
94
+ def find_or_create_content(name)
95
+ find_content(name) || create_content(name)
96
+ end
97
+
98
+ def find_content(name)
99
+ element.contents.find { |content| content.name == name }
100
+ end
101
+
102
+ def create_content(name)
103
+ Alchemy::Content.create(element: element, name: name)
104
+ end
39
105
  end
40
106
  end
@@ -91,7 +91,7 @@ module Alchemy
91
91
  end
92
92
 
93
93
  # Create important thumbnails upfront
94
- after_create -> { PictureThumb.generate_thumbs!(self) }
94
+ after_create -> { PictureThumb.generate_thumbs!(self) if has_convertible_format? }
95
95
 
96
96
  # We need to define this method here to have it available in the validations below.
97
97
  class << self
@@ -25,7 +25,7 @@
25
25
  <div id="element_<%= element.id %>_errors" class="element_errors"></div>
26
26
 
27
27
  <div id="element_<%= element.id %>_content" class="element-content-editors">
28
- <%= render element.contents.map { |content| Alchemy::ContentEditor.new(content) } %>
28
+ <%= render element.contents %>
29
29
  </div>
30
30
 
31
31
  <% if element.taggable? %>
@@ -5,7 +5,7 @@
5
5
  </p>
6
6
  <% end %>
7
7
 
8
- <button type="submit" <%= "disabled" unless element.public? %> form="element_<%= element.id %>_form" class="button" data-alchemy-button>
8
+ <button type="submit" form="element_<%= element.id %>_form" class="button" data-alchemy-button>
9
9
  <%= Alchemy.t(:save) %>
10
10
  </button>
11
11
  </div>
@@ -1,6 +1,6 @@
1
1
  <% content = local_assigns[:content] || local_assigns[:essence_picture_view] %>
2
2
  <%= Alchemy::EssencePictureView.new(
3
3
  content,
4
- local_assigns[:options],
5
- local_assigns[:html_options]
6
- ).render %>
4
+ local_assigns[:options] || {},
5
+ local_assigns[:html_options] || {}
6
+ ).render %>
@@ -132,7 +132,9 @@ module Alchemy
132
132
  end
133
133
 
134
134
  def namespaced_resource_name
135
- @_namespaced_resource_name ||= namespaced_resources_name.singularize
135
+ @_namespaced_resource_name ||= begin
136
+ namespaced_resources_name.to_s.singularize
137
+ end.to_sym # Rails >= 6.0.3.7 needs symbols in polymorphic routes
136
138
  end
137
139
 
138
140
  def namespaced_resources_name
@@ -140,13 +142,13 @@ module Alchemy
140
142
  resource_name_array = resource_array.dup
141
143
  resource_name_array.delete(engine_name) if in_engine?
142
144
  resource_name_array.join("_")
143
- end
145
+ end.to_sym # Rails >= 6.0.3.7 needs symbols in polymorphic routes
144
146
  end
145
147
 
146
148
  def namespace_for_scope
147
149
  namespace_array = namespace_diff
148
150
  namespace_array.delete(engine_name) if in_engine?
149
- namespace_array
151
+ namespace_array.map(&:to_sym) # Rails >= 6.0.3.7 needs symbols in polymorphic routes
150
152
  end
151
153
 
152
154
  # Returns an array of underscored association names
@@ -1,9 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "tasks/harden_gutentag_migrations"
4
+ require "rails/generators"
5
+ require "thor"
6
+ require "alchemy/install/tasks"
4
7
 
5
8
  module Alchemy
6
9
  class Upgrader::FivePointZero < Upgrader
10
+ include Rails::Generators::Actions
11
+ include Thor::Base
12
+ include Thor::Actions
13
+
14
+ source_root File.expand_path("../../generators/alchemy/install/files", __dir__)
15
+
7
16
  class << self
8
17
  def install_gutentag_migrations
9
18
  desc "Install Gutentag migrations"
@@ -36,6 +45,28 @@ module Alchemy
36
45
  log "Root page not found.", :skip
37
46
  end
38
47
  end
48
+
49
+ def run_webpacker_installer
50
+ # Webpacker does not create a package.json, but we need one
51
+ unless File.exist? app_root.join("package.json")
52
+ in_root { run "echo '{}' > package.json" }
53
+ end
54
+ new.rake("webpacker:install", abort_on_failure: true)
55
+ end
56
+
57
+ def add_npm_package
58
+ new.run "yarn add @alchemy_cms/admin"
59
+ end
60
+
61
+ def copy_alchemy_entry_point
62
+ webpack_config = YAML.load_file(app_root.join("config", "webpacker.yml"))[Rails.env]
63
+ new.copy_file "alchemy_admin.js",
64
+ app_root.join(webpack_config["source_path"], webpack_config["source_entry_path"], "alchemy/admin.js")
65
+ end
66
+
67
+ def app_root
68
+ @_app_root ||= Rails.root
69
+ end
39
70
  end
40
71
  end
41
72
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Alchemy
4
- VERSION = "5.1.1"
4
+ VERSION = "5.1.5"
5
5
 
6
6
  def self.version
7
7
  VERSION
@@ -4,8 +4,8 @@ namespace :alchemy do
4
4
  namespace :generate do
5
5
  desc "Generates all thumbnails for Alchemy Pictures and EssencePictures."
6
6
  task thumbnails: [
7
- "alchemy_dragonfly_s3:generate:picture_thumbnails",
8
- "alchemy_dragonfly_s3:generate:essence_picture_thumbnails",
7
+ "alchemy:generate:picture_thumbnails",
8
+ "alchemy:generate:essence_picture_thumbnails",
9
9
  ]
10
10
 
11
11
  desc "Generates thumbnails for Alchemy Pictures."
@@ -14,6 +14,8 @@ namespace :alchemy do
14
14
  puts "Please wait..."
15
15
 
16
16
  Alchemy::Picture.find_each do |picture|
17
+ next unless picture.has_convertible_format?
18
+
17
19
  puts Alchemy::PictureThumb.generate_thumbs!(picture)
18
20
  end
19
21
 
@@ -42,6 +42,9 @@ namespace :alchemy do
42
42
  "alchemy:upgrade:5.0:install_gutentag_migrations",
43
43
  "alchemy:upgrade:5.0:remove_layout_roots",
44
44
  "alchemy:upgrade:5.0:remove_root_page",
45
+ "alchemy:upgrade:5.0:run_webpacker_installer",
46
+ "alchemy:upgrade:5.0:add_npm_package",
47
+ "alchemy:upgrade:5.0:copy_alchemy_entry_point",
45
48
  ]
46
49
 
47
50
  desc "Install Gutentag migrations"
@@ -58,6 +61,23 @@ namespace :alchemy do
58
61
  task remove_root_page: [:environment] do
59
62
  Alchemy::Upgrader::FivePointZero.remove_root_page
60
63
  end
64
+
65
+ desc "Run webpacker installer"
66
+ task run_webpacker_installer: [:environment] do
67
+ Alchemy::Upgrader::FivePointZero.run_webpacker_installer
68
+ end
69
+
70
+ desc "Add NPM package"
71
+ task add_npm_package: [:environment] do
72
+ puts "adding npm_package..."
73
+ Alchemy::Upgrader::FivePointZero.add_npm_package
74
+ end
75
+
76
+ desc "Copy alchemy entry point"
77
+ task copy_alchemy_entry_point: [:environment] do
78
+ puts "copying alchemy entry point"
79
+ Alchemy::Upgrader::FivePointZero.copy_alchemy_entry_point
80
+ end
61
81
  end
62
82
  end
63
83
  end
data/package/admin.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import translate from "./src/i18n"
2
+ import translationData from "./src/translations"
2
3
  import NodeTree from "./src/node_tree"
3
4
 
4
5
  // Global Alchemy object
@@ -10,5 +11,6 @@ if (typeof window.Alchemy === "undefined") {
10
11
  Object.assign(Alchemy, {
11
12
  // Global utility method for translating a given string
12
13
  t: translate,
14
+ translations: Object.assign(Alchemy.translations || {}, translationData),
13
15
  NodeTree
14
16
  })
@@ -15,12 +15,20 @@ describe("translate", () => {
15
15
  })
16
16
 
17
17
  describe("if translation is present", () => {
18
+ beforeEach(() => {
19
+ Alchemy.translations = { en: { help: "Help" } }
20
+ })
21
+
18
22
  it("Returns translated string", () => {
19
23
  expect(translate("help")).toEqual("Help")
20
24
  })
21
25
 
22
26
  describe("if key includes a period", () => {
23
27
  describe("that is translated", () => {
28
+ beforeEach(() => {
29
+ Alchemy.translations = { en: { formats: { date: "Y-m-d" } } }
30
+ })
31
+
24
32
  it("splits into group", () => {
25
33
  expect(translate("formats.date")).toEqual("Y-m-d")
26
34
  })
@@ -40,6 +48,10 @@ describe("translate", () => {
40
48
  })
41
49
 
42
50
  describe("if replacement is given", () => {
51
+ beforeEach(() => {
52
+ Alchemy.translations = { en: { allowed_chars: "of %{number} chars" } }
53
+ })
54
+
43
55
  it("replaces it", () => {
44
56
  expect(translate("allowed_chars", 5)).toEqual("of 5 chars")
45
57
  })
@@ -67,4 +79,15 @@ describe("translate", () => {
67
79
  spy.mockRestore()
68
80
  })
69
81
  })
82
+
83
+ describe("if Alchemy.translations is not set", () => {
84
+ it("Returns passed string and logs a warning", () => {
85
+ const spy = jest.spyOn(console, "warn").mockImplementation(() => {})
86
+ expect(translate("help")).toEqual("help")
87
+ expect(spy.mock.calls).toEqual([
88
+ ["Translations for locale kl not found!"]
89
+ ])
90
+ spy.mockRestore()
91
+ })
92
+ })
70
93
  })
data/package/src/i18n.js CHANGED
@@ -1,5 +1,3 @@
1
- import translationData from "./translations"
2
-
3
1
  const KEY_SEPARATOR = /\./
4
2
 
5
3
  function currentLocale() {
@@ -11,7 +9,7 @@ function currentLocale() {
11
9
 
12
10
  function getTranslations() {
13
11
  const locale = currentLocale()
14
- const translations = translationData[locale]
12
+ const translations = Alchemy.translations && Alchemy.translations[locale]
15
13
 
16
14
  if (translations) {
17
15
  return translations
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alchemy_cms/admin",
3
- "version": "0.2.0",
3
+ "version": "5.1.5",
4
4
  "description": "AlchemyCMS",
5
5
  "browser": "package/admin.js",
6
6
  "files": [
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: 5.1.1
4
+ version: 5.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas von Deyen
@@ -10,10 +10,10 @@ authors:
10
10
  - Hendrik Mans
11
11
  - Carsten Fregin
12
12
  - Martin Meyerhoff
13
- autorequire:
13
+ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2021-01-12 00:00:00.000000000 Z
16
+ date: 2021-09-15 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: active_model_serializers
@@ -113,6 +113,9 @@ dependencies:
113
113
  - - ">="
114
114
  - !ruby/object:Gem::Version
115
115
  version: 1.0.7
116
+ - - "<"
117
+ - !ruby/object:Gem::Version
118
+ version: 1.4.0
116
119
  type: :runtime
117
120
  prerelease: false
118
121
  version_requirements: !ruby/object:Gem::Requirement
@@ -123,6 +126,9 @@ dependencies:
123
126
  - - ">="
124
127
  - !ruby/object:Gem::Version
125
128
  version: 1.0.7
129
+ - - "<"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.4.0
126
132
  - !ruby/object:Gem::Dependency
127
133
  name: dragonfly_svg
128
134
  requirement: !ruby/object:Gem::Requirement
@@ -1278,8 +1284,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1278
1284
  version: '0'
1279
1285
  requirements:
1280
1286
  - ImageMagick (libmagick), v6.6 or greater.
1281
- rubygems_version: 3.1.4
1282
- signing_key:
1287
+ rubygems_version: 3.2.26
1288
+ signing_key:
1283
1289
  specification_version: 4
1284
1290
  summary: A powerful, userfriendly and flexible CMS for Rails
1285
1291
  test_files: []
1292
+ ...